Skip to content

Commit ae1fba9

Browse files
committed
Add IntBackedEnumResolver
1 parent 8843c02 commit ae1fba9

File tree

3 files changed

+61
-4
lines changed

3 files changed

+61
-4
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace PrinsFrank\ObjectResolver\Parameter\TypeResolver;
4+
5+
use BackedEnum;
6+
use Override;
7+
use PrinsFrank\Enums\Exception\EnumException;
8+
use PrinsFrank\ObjectResolver\Exception\ShouldNotHappenException;
9+
use PrinsFrank\ObjectResolver\ObjectResolver;
10+
use ReflectionEnum;
11+
use ReflectionException;
12+
13+
/** @implements TypeResolver<BackedEnum> */
14+
class IntBackedEnumResolver implements TypeResolver {
15+
/** @throws ReflectionException */
16+
#[Override]
17+
public function acceptsType(string $type): bool {
18+
return is_a($type, BackedEnum::class, true)
19+
&& (string) (new ReflectionEnum($type))->getBackingType() === 'int';
20+
}
21+
22+
/**
23+
* @param class-string<BackedEnum>|string $type
24+
* @throws ReflectionException
25+
*/
26+
#[Override]
27+
public function resolveValue(string $type, mixed $value, ObjectResolver $objectResolver): ?BackedEnum {
28+
if (is_a($type, BackedEnum::class, true) === false
29+
|| (string) (new ReflectionEnum($type))->getBackingType() !== 'int') {
30+
throw new ShouldNotHappenException();
31+
}
32+
33+
if (is_object($value) && is_a($value, $type, true)) {
34+
return $value;
35+
}
36+
37+
if (is_int($value) === false && is_string($value) === false) {
38+
return null;
39+
}
40+
41+
if ((string)(int) $value === $value && ($enumValue = $type::tryFrom((int) $value)) !== null) {
42+
return $enumValue;
43+
}
44+
45+
try {
46+
return \PrinsFrank\Enums\BackedEnum::fromName($type, (string) $value);
47+
} catch (EnumException) {
48+
return null;
49+
}
50+
}
51+
}

src/Parameter/TypeResolver/StringBackedEnumResolver.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,21 @@
88
use PrinsFrank\ObjectResolver\Exception\ShouldNotHappenException;
99
use PrinsFrank\ObjectResolver\ObjectResolver;
1010
use ReflectionEnum;
11+
use ReflectionException;
1112

1213
/** @implements TypeResolver<BackedEnum> */
1314
class StringBackedEnumResolver implements TypeResolver {
15+
/** @throws ReflectionException */
1416
#[Override]
1517
public function acceptsType(string $type): bool {
1618
return is_a($type, BackedEnum::class, true)
1719
&& (string) (new ReflectionEnum($type))->getBackingType() === 'string';
1820
}
1921

20-
/** @param class-string<BackedEnum>|string $type */
22+
/**
23+
* @param class-string<BackedEnum>|string $type
24+
* @throws ReflectionException
25+
*/
2126
#[Override]
2227
public function resolveValue(string $type, mixed $value, ObjectResolver $objectResolver): ?BackedEnum {
2328
if (is_a($type, BackedEnum::class, true) === false
@@ -38,7 +43,7 @@ public function resolveValue(string $type, mixed $value, ObjectResolver $objectR
3843
}
3944

4045
try {
41-
return \PrinsFrank\Enums\BackedEnum::fromName($type, (string) $value);
46+
return \PrinsFrank\Enums\BackedEnum::fromName($type, $value);
4247
} catch (EnumException) {
4348
return null;
4449
}

src/Parameter/TypeResolver/TypeResolverProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ class TypeResolverProvider {
88
/** @param array<class-string<TypeResolver<mixed>>> $typeResolvers */
99
public function __construct(
1010
private array $typeResolvers = [
11-
StringBackedEnumResolver::class,
1211
BoolResolver::class,
12+
ClassResolver::class,
1313
DateTimeImmutableResolver::class,
1414
DateTimeResolver::class,
1515
FloatResolver::class,
16+
IntBackedEnumResolver::class,
1617
IntResolver::class,
17-
ClassResolver::class,
18+
StringBackedEnumResolver::class,
1819
StringResolver::class,
1920
UnitEnumResolver::class,
2021
]

0 commit comments

Comments
 (0)