From aec667dc3d24dde83cd32f245a59391621ef980b Mon Sep 17 00:00:00 2001 From: Toon Verwerft Date: Fri, 14 Jun 2024 09:18:52 +0200 Subject: [PATCH] Speed up property name calculation --- src/Encoder/ObjectEncoder.php | 17 ++++++++--------- tests/Unit/Encoder/ErrorHandlingEncoderTest.php | 2 -- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Encoder/ObjectEncoder.php b/src/Encoder/ObjectEncoder.php index bc24714..80ed1b0 100644 --- a/src/Encoder/ObjectEncoder.php +++ b/src/Encoder/ObjectEncoder.php @@ -20,7 +20,7 @@ use VeeWee\Reflecta\Lens\Lens; use function is_array; use function Psl\Dict\map; -use function Psl\Dict\pull; +use function Psl\Dict\map_with_key; use function Psl\Dict\reindex; use function Psl\Iter\any; use function Psl\Vec\sort_by; @@ -102,16 +102,16 @@ private function to(Context $context, array $properties, object|array $data): st XsiTypeDetector::detectFromValue($context, []), includeXsiTargetNamespace: !$isAnyPropertyQualified, )), - ...map( + ...map_with_key( $properties, - function (Property $property) use ($context, $data, $defaultAction) : Closure { + function (string $normalizePropertyName, Property $property) use ($context, $data, $defaultAction) : Closure { $type = $property->getType(); $meta = $type->getMeta(); $isAttribute = $meta->isAttribute()->unwrapOr(false); /** @var mixed $value */ $value = $this->runLens( - property(PhpPropertyNameNormalizer::normalize($property->getName())), + property($normalizePropertyName), $meta, $data, null @@ -146,7 +146,7 @@ private function from(Context $context, array $properties, Element $data): objec $objectData = object_data($this->className); return $objectData->from( - pull( + map( $properties, function (Property $property) use ($context, $nodes): mixed { $type = $property->getType(); @@ -167,7 +167,6 @@ function (Property $property) use ($context, $nodes): mixed { default => $value !== null ? $this->grabIsoForProperty($context, $property)->from($value) : $defaultValue, }; }, - static fn (Property $property) => PhpPropertyNameNormalizer::normalize($property->getName()), ) ); } @@ -178,9 +177,9 @@ function (Property $property) use ($context, $nodes): mixed { private function grabIsoForProperty(Context $context, Property $property): Iso { $propertyContext = $context->withType($property->getType()); - $encoder = $context->registry->detectEncoderForContext($propertyContext); - return $encoder->iso($propertyContext); + return $context->registry->detectEncoderForContext($propertyContext) + ->iso($propertyContext); } private function runLens(Lens $lens, TypeMeta $meta, mixed $data, mixed $default): mixed @@ -229,7 +228,7 @@ private function detectProperties(Context $context): array $type->getProperties(), static fn (Property $property): bool => !$property->getType()->getMeta()->isAttribute()->unwrapOr(false), ), - static fn (Property $property): string => $property->getName(), + static fn (Property $property): string => PhpPropertyNameNormalizer::normalize($property->getName()), ); } } diff --git a/tests/Unit/Encoder/ErrorHandlingEncoderTest.php b/tests/Unit/Encoder/ErrorHandlingEncoderTest.php index c983634..64be5d5 100644 --- a/tests/Unit/Encoder/ErrorHandlingEncoderTest.php +++ b/tests/Unit/Encoder/ErrorHandlingEncoderTest.php @@ -66,8 +66,6 @@ public function it_can_fail_decoding(): void $res = $encoder->iso($context)->from( 'truenot-a-float' ); - - dd($res); } catch (EncodingException $e) { static::assertSame('Failed decoding type string as {https://test:user}. Failed at path "user.hat.color".', $e->getMessage()); static::assertSame(['user', 'hat', 'color'], $e->getPaths());