final class BackedEnumNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface
{
/**
* {@inheritdoc}
*
* @return int|string
*
* @throws InvalidArgumentException
*/
public function normalize($object, string $format = null, array $context = [])
{
if (!$object instanceof \BackedEnum) {
throw new InvalidArgumentException('The data must belong to a backed enumeration.');
}
return $object->value;
}
/**
* {@inheritdoc}
*/
public function supportsNormalization($data, string $format = null): bool
{
return $data instanceof \BackedEnum;
}
/**
* {@inheritdoc}
*
* @throws NotNormalizableValueException
*/
public function denormalize($data, string $type, string $format = null, array $context = [])
{
if (!is_subclass_of($type, \BackedEnum::class)) {
throw new InvalidArgumentException('The data must belong to a backed enumeration.');
}
if (!\is_int($data) && !\is_string($data)) {
throw NotNormalizableValueException::createForUnexpectedDataType('The data is neither an integer nor a string, you should pass an integer or a string that can be parsed as an enumeration case of type '.$type.'.', $data, [Type::BUILTIN_TYPE_INT, Type::BUILTIN_TYPE_STRING], $context['deserialization_path'] ?? null, true);
}
try {
return $type::from($data);
} catch (\ValueError $e) {
if (isset($context['has_constructor'])) {
throw new InvalidArgumentException('The data must belong to a backed enumeration of type '.$type);
}
throw NotNormalizableValueException::createForUnexpectedDataType('The data must belong to a backed enumeration of type '.$type, $data, [$type], $context['deserialization_path'] ?? null, true, 0, $e);
}
}
/**
* {@inheritdoc}
*/
public function supportsDenormalization($data, string $type, string $format = null): bool
{
return is_subclass_of($type, \BackedEnum::class);
}
/**
* {@inheritdoc}
*/
public function hasCacheableSupportsMethod(): bool