Missael H. Anda 2 rokov pred
rodič
commit
da931ed01b

+ 16 - 0
src/Extracting/ParsesValidationRules.php

@@ -191,6 +191,22 @@ trait ParsesValidationRules
             return true;
         }
 
+        if (function_exists('enum_exists') && $rule instanceof \Illuminate\Validation\Rules\Enum) {
+            $reflection = new \ReflectionClass($rule);
+            $property = $reflection->getProperty('type');
+            $property->setAccessible(true);
+            $type = $property->getValue($rule);
+
+            if (enum_exists($type) && method_exists($type, 'tryFrom')) {
+                $cases = array_map(fn ($case) => $case->value, $type::cases());
+                $parameterData['type'] = gettype($cases[0]);
+                $parameterData['description'] = ' Must be one of ' . w::getListOfValuesAsFriendlyHtmlString($cases) . ' ';
+                $parameterData['setter'] = fn () => Arr::random($cases);
+            }
+
+            return true;
+        }
+
         if ($rule instanceof Rule || $rule instanceof InvokableRule) {
             if (method_exists($rule, 'docs')) {
                 $customData = call_user_func_array([$rule, 'docs'], []) ?: [];

+ 37 - 0
tests/Unit/ValidationRuleParsingTest.php

@@ -506,6 +506,43 @@ class ValidationRuleParsingTest extends BaseLaravelTest
         $this->assertEquals(true, $results['custom_rule']['required']);
         $this->assertEquals('This is a dummy test rule.', $results['custom_rule']['description']);
     }
+
+    /** @test */
+    public function can_parse_enum_rules()
+    {
+        $ruleset = [
+            'enum' => ['required', new \Illuminate\Validation\Rules\Enum(Color::class)],
+        ];
+
+        $results = $this->strategy->parse($ruleset);
+        $this->assertEquals('string', $results['enum']['type']);
+        $this->assertEquals(
+            'Must be one of <code>red</code>, <code>green</code>, or <code>blue</code>.',
+            $results['enum']['description']
+        );
+        $this->assertTrue(in_array($results['enum']['example'], array_map(fn ($case) => $case->value, Color::cases())));
+
+        $ruleset = [
+            'enum' => ['required', new \Illuminate\Validation\Rules\Enum(Type::class)],
+        ];
+
+        $results = $this->strategy->parse($ruleset);
+        $this->assertEquals('integer', $results['enum']['type']);
+    }
+}
+
+enum Color: string
+{
+    case Red = 'red';
+    case Green = 'green';
+    case Blue = 'blue';
+}
+
+enum Type: int
+{
+    case One = 1;
+    case Two = 2;
+    case Three = 3;
 }
 
 class DummyValidationRule implements \Illuminate\Contracts\Validation\Rule