Skip to content

Commit 672d90e

Browse files
committed
inline enum casts
1 parent 2ce210c commit 672d90e

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/ModelTransformer.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ private function mapTypeNameToJsonType(string $columnType): string
9292

9393
private function mapCastToType(string $cast): string
9494
{
95+
if (enum_exists($cast)) {
96+
return implode(' | ', array_map(fn($case) => "'$case->value'", $cast::cases()));
97+
}
98+
9599
return match ($cast) {
96100
'boolean', 'bool' => 'boolean',
97101
'int', 'float' => 'number',

tests/Feature/TransformEloquentModelsTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,40 @@
130130
expect($transformedType?->transformed)->toEqual($type_definition);
131131
});
132132

133+
test('inlines enum casts', function () {
134+
if (Schema::hasTable('test_table')) {
135+
Schema::drop('test_table');
136+
}
137+
138+
enum EnumTest: string {
139+
case A = 'a';
140+
case B = 'b';
141+
case C = 'c';
142+
}
143+
144+
Schema::create('test_table', function (Blueprint $table) {
145+
$table->id();
146+
$table->text('enum_test');
147+
});
148+
149+
$model = new class extends \Illuminate\Database\Eloquent\Model {
150+
protected $table = 'test_table';
151+
protected $casts = [
152+
'enum_test' => EnumTest::class,
153+
];
154+
};
155+
156+
$transformer = new ModelTransformer;
157+
$transformedType = $transformer->transform(new \ReflectionClass($model::class), $model::class);
158+
159+
$type_definition = "{\n" .
160+
"id: number\n" .
161+
"enum_test: 'a' | 'b' | 'c'\n" .
162+
'}';
163+
164+
expect($transformedType?->transformed)->toEqual($type_definition);
165+
});
166+
133167

134168
test('it adds appended attributes', function () {
135169
if (Schema::hasTable('test_table')) {

0 commit comments

Comments
 (0)