Skip to content

Commit 66fb1e5

Browse files
committed
Added ability to deserialize backed enum from backed enum
1 parent 39b59fe commit 66fb1e5

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/Serializers/BackedEnumSerializer.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ protected function deserializeItem(mixed $item, PropertyContext $property): ?Bac
4545
: throw new DeserializeException('Property is not nullable');
4646
}
4747

48-
if (!is_string($item) && !is_integer($item)) {
48+
if (
49+
!is_string($item)
50+
&& !is_integer($item)
51+
&& !$item instanceof BackedEnum
52+
) {
4953
throw new DeserializeException('Value is not a string or integer');
5054
}
5155

@@ -58,6 +62,14 @@ protected function deserializeItem(mixed $item, PropertyContext $property): ?Bac
5862
continue;
5963
}
6064

65+
if ($item instanceof BackedEnum) {
66+
if ($item instanceof ($typeContext->reflection->getName())) {
67+
return $item;
68+
} else {
69+
continue;
70+
}
71+
}
72+
6173
$enumValue = call_user_func(
6274
// @phpstan-ignore-next-line
6375
[$typeContext->reflection->getName(), 'tryFrom'],

tests/Unit/Serializers/BackedEnumSerializerTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,25 @@ public function will_resolve_null_if_property_is_nullable(): void
106106
$backedEnumSerializer->deserialize(PropertyContext::getInstance($property), $serializedData)
107107
);
108108
}
109+
110+
/**
111+
* @throws Throwable
112+
*/
113+
#[Test]
114+
public function will_resolve_backed_enum_from_backed_enum(): void
115+
{
116+
$yesNoNullableData = new YesOrNoNullableData(null);
117+
118+
$reflectionClass = new ReflectionClass($yesNoNullableData);
119+
$property = $reflectionClass->getProperty('yesNo');
120+
121+
$backedEnumSerializer = new BackedEnumSerializer();
122+
123+
$serializedData = ['yesNo' => YesNoBackedEnum::YES];
124+
125+
self::assertEquals(
126+
YesNoBackedEnum::YES,
127+
$backedEnumSerializer->deserialize(PropertyContext::getInstance($property), $serializedData)
128+
);
129+
}
109130
}

0 commit comments

Comments
 (0)