Skip to content

Commit

Permalink
Fix when creating array types from values (#707)
Browse files Browse the repository at this point in the history
* fixed type creaction from value

* Fix styling

---------

Co-authored-by: romalytvynenko <[email protected]>
  • Loading branch information
romalytvynenko and romalytvynenko authored Feb 5, 2025
1 parent ef9c972 commit de05558
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/Support/Type/TypeHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,22 @@ public static function createTypeFromValue(mixed $value)
));
}

return null; // @todo: object
if ($value === null) {
return new NullType;
}

if (is_object($value)) {
if (enum_exists($value::class)) {
return new EnumCaseType(
$value::class,
$value->name,
);
}

return new ObjectType($value::class); // @todo generics
}

return new MixedType;
}

public static function createTypeFromReflectionType(ReflectionType $reflectionType, bool $handleNullable = true)
Expand Down
30 changes: 30 additions & 0 deletions tests/Support/Type/TypeHelperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Dedoc\Scramble\Tests\Support\Type;

use Dedoc\Scramble\Support\Type\TypeHelper;

test('create type from value', function ($value, string $expectedType) {
$type = TypeHelper::createTypeFromValue($value);

expect($type->toString())->toBe($expectedType);
})->with([
[1, 'int(1)'],
['foo', 'string(foo)'],
[[1, 2, 3], 'list{int(1), int(2), int(3)}'],
]);

test('create type from enum value', function () {
$type = TypeHelper::createTypeFromValue([
Foo_TypeHelperTest::Foo,
Foo_TypeHelperTest::Bar,
]);

expect($type->toString())->toBe('list{Dedoc\Scramble\Tests\Support\Type\Foo_TypeHelperTest::Foo, Dedoc\Scramble\Tests\Support\Type\Foo_TypeHelperTest::Bar}');
});

enum Foo_TypeHelperTest: string
{
case Foo = 'f';
case Bar = 'b';
}

0 comments on commit de05558

Please sign in to comment.