diff --git a/src/JsonSchema.php b/src/JsonSchema.php index 9870d14..d68fe3f 100644 --- a/src/JsonSchema.php +++ b/src/JsonSchema.php @@ -17,8 +17,10 @@ use EventEngine\JsonSchema\Type\EmailType; use EventEngine\JsonSchema\Type\EnumType; use EventEngine\JsonSchema\Type\FloatType; +use EventEngine\JsonSchema\Type\IntEnumType; use EventEngine\JsonSchema\Type\IntType; use EventEngine\JsonSchema\Type\ObjectType; +use EventEngine\JsonSchema\Type\StringEnumType; use EventEngine\JsonSchema\Type\StringType; use EventEngine\JsonSchema\Type\TypeRef; use EventEngine\JsonSchema\Type\UnionType; @@ -105,9 +107,20 @@ public static function boolean(): BoolType return new BoolType(); } - public static function enum(array $entries): EnumType + public static function enum(array $entries, string $type = JsonSchema::TYPE_STRING): EnumType { - return new EnumType(...$entries); + switch($type) { + case JsonSchema::TYPE_STRING: + $class = StringEnumType::class; + break; + case JsonSchema::TYPE_INT: + $class = IntEnumType::class; + break; + default: + $class = EnumType::class; + } + + return new $class(...$entries); } public static function nullOr(Type $schema): Type diff --git a/src/Type/EnumType.php b/src/Type/EnumType.php index 6c70997..1d8bc45 100644 --- a/src/Type/EnumType.php +++ b/src/Type/EnumType.php @@ -23,12 +23,12 @@ class EnumType implements AnnotatedType /** * @var string|array */ - private $type = JsonSchema::TYPE_STRING; + protected $type = JsonSchema::TYPE_STRING; /** * @var string[] */ - private $entries; + protected $entries; public function __construct(string ...$entries) { diff --git a/src/Type/IntEnumType.php b/src/Type/IntEnumType.php new file mode 100644 index 0000000..07353db --- /dev/null +++ b/src/Type/IntEnumType.php @@ -0,0 +1,25 @@ +entries = $entries; + } +} diff --git a/src/Type/StringEnumType.php b/src/Type/StringEnumType.php new file mode 100644 index 0000000..9025a20 --- /dev/null +++ b/src/Type/StringEnumType.php @@ -0,0 +1,15 @@ +toArray() ); } + + + /** + * @test + */ + public function it_creates_int_enum_type() + { + $enumType = JsonSchema::enum([0, 1], JsonSchema::TYPE_INT); + + $this->assertEquals( + [ + 'type' => 'integer', + 'enum' => [0, 1], + ], + $enumType->toArray() + ); + } + + + /** + * @test + */ + public function it_creates_int_nullable_enum_type() + { + $enumType = JsonSchema::enum([0, 1], JsonSchema::TYPE_INT) + ->asNullable(); + + $this->assertEquals( + [ + 'type' => ['integer', 'null'], + 'enum' => [0, 1, null] + ], + $enumType->toArray() + ); + } }