Skip to content

Commit c8b81bc

Browse files
authored
Merge pull request #2 from Shureban/v0.2.0
add Enum
2 parents d759d4c + b66fb03 commit c8b81bc

File tree

6 files changed

+76
-3
lines changed

6 files changed

+76
-3
lines changed

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
}
1818
],
1919
"minimum-stability": "dev",
20-
"version": "0.1.0",
20+
"version": "0.2.0",
2121
"autoload": {
2222
"psr-4": {
2323
"Shureban\\LaravelObjectMapper\\": "src/"
@@ -29,7 +29,7 @@
2929
}
3030
},
3131
"require": {
32-
"php": "^8.0"
32+
"php": "^8.1"
3333
},
3434
"prefer-stable": true,
3535
"extra": {

src/Types/Custom/EnumType.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Types\Custom;
4+
5+
use BackedEnum;
6+
use Shureban\LaravelObjectMapper\Types\SimpleTypes\ObjectType;
7+
8+
class EnumType extends ObjectType
9+
{
10+
private string $enumNamespace;
11+
12+
public function __construct(string $enumNamespace)
13+
{
14+
$this->enumNamespace = $enumNamespace;
15+
}
16+
17+
/**
18+
* @param mixed $value
19+
*
20+
* @return BackedEnum
21+
*/
22+
public function convert(mixed $value): BackedEnum
23+
{
24+
return call_user_func([$this->enumNamespace, 'from'], $value);
25+
}
26+
}

src/Types/Factory.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Shureban\LaravelObjectMapper\Types\BoxTypes\CollectionType;
1616
use Shureban\LaravelObjectMapper\Types\BoxTypes\DateTimeType;
1717
use Shureban\LaravelObjectMapper\Types\Custom\CustomType;
18+
use Shureban\LaravelObjectMapper\Types\Custom\EnumType;
1819
use Shureban\LaravelObjectMapper\Types\SimpleTypes\ArrayType;
1920
use Shureban\LaravelObjectMapper\Types\SimpleTypes\BoolType;
2021
use Shureban\LaravelObjectMapper\Types\SimpleTypes\FloatType;
@@ -68,13 +69,21 @@ public static function make(ReflectionProperty $property): Type
6869
return $boxType;
6970
}
7071

72+
if (enum_exists($type)) {
73+
return new EnumType($type);
74+
}
75+
7176
if (class_exists($type)) {
7277
return new CustomType((new ReflectionClass($type))->newInstanceWithoutConstructor());
7378
}
7479

7580
$classUses = new ClassExtraInformation($property->getDeclaringClass());
7681
$namespace = $classUses->getFullObjectUseNamespace($type);
7782

83+
if (enum_exists($namespace)) {
84+
return new EnumType($namespace);
85+
}
86+
7887
return new CustomType((new ReflectionClass($namespace))->newInstanceWithoutConstructor());
7988
}
8089
}

tests/Unit/CustomTypeTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
class CustomTypeTest extends TestCase
1919
{
20-
public function _test_StrictTypes()
20+
public function test_StrictTypes()
2121
{
2222
$simpleClass = new CustomTypeStrictSimpleClass();
2323
$simpleClass->int = 10;

tests/Unit/EnumTypeTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Tests\Structs;
4+
5+
use Shureban\LaravelObjectMapper\ObjectMapper;
6+
use Shureban\LaravelObjectMapper\Tests\Unit\Structs\EnumTypeClass;
7+
use Shureban\LaravelObjectMapper\Tests\Unit\Structs\TestEnum;
8+
use Tests\TestCase;
9+
10+
class EnumTypeTest extends TestCase
11+
{
12+
public function test_Enum()
13+
{
14+
$this->assertEquals(TestEnum::Hearts, (new ObjectMapper(new EnumTypeClass()))->mapFromJson('{"strictEnum": "Hearts"}')->strictEnum);
15+
$this->assertEquals(TestEnum::Hearts, (new ObjectMapper(new EnumTypeClass()))->mapFromJson('{"phpDocEnum": "Hearts"}')->phpDocEnum);
16+
$this->assertEquals(TestEnum::Hearts, (new ObjectMapper(new EnumTypeClass()))->mapFromJson('{"bothEnum": "Hearts"}')->bothEnum);
17+
}
18+
}

tests/Unit/Structs/EnumTypeClass.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Shureban\LaravelObjectMapper\Tests\Unit\Structs;
4+
5+
enum TestEnum: string
6+
{
7+
case Hearts = 'Hearts';
8+
case Diamonds = 'Diamonds';
9+
case Clubs = 'Clubs';
10+
case Spades = 'Spades';
11+
}
12+
13+
class EnumTypeClass
14+
{
15+
public TestEnum $strictEnum;
16+
/** @var TestEnum */
17+
public $phpDocEnum;
18+
/** @var TestEnum */
19+
public TestEnum $bothEnum;
20+
}

0 commit comments

Comments
 (0)