From 1ea5355bfe13efac819b7bb15df1cbc60c70a6f6 Mon Sep 17 00:00:00 2001 From: Priyadi Iman Nurcahyo <1102197+priyadi@users.noreply.github.com> Date: Tue, 16 Jan 2024 11:19:43 +0700 Subject: [PATCH] refactor: Refactor `Transformer` for clarity. --- CHANGELOG.md | 1 + .../TransformerRegistry.php | 103 ++++++++++-------- 2 files changed, 57 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3af5f4f..46f5f01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * test: Reorganize test namespaces. * fix: Fix path forming. * fix: Add type checking for variance in `TypeMapping` and `MappingEntry`. +* refactor: Refactor `Transformer` for clarity. ## 0.5.11 diff --git a/src/TransformerRegistry/TransformerRegistry.php b/src/TransformerRegistry/TransformerRegistry.php index 8ec552a..03eff98 100644 --- a/src/TransformerRegistry/TransformerRegistry.php +++ b/src/TransformerRegistry/TransformerRegistry.php @@ -47,67 +47,76 @@ public function get(string $id): TransformerInterface return $transformer; } + public function findBySourceAndTargetType( + Type|MixedType $sourceType, + Type|MixedType $targetType, + ): SearchResult { + $mapping = $this->getMappingBySourceAndTargetType( + $sourceType, + $targetType + ); + + $searchResultEntries = []; + + foreach ($mapping as $mappingEntry) { + if ($mappingEntry->isVariantTargetType() || !TypeCheck::isObject($targetType)) { + $searchResultEntry = new SearchResultEntry( + mappingOrder: $mappingEntry->getOrder(), + sourceType: $sourceType, + targetType: $targetType, + transformer: $this->get($mappingEntry->getId()), + transformerServiceId: $mappingEntry->getId(), + variantTargetType: $mappingEntry->isVariantTargetType() + ); + + $searchResultEntries[] = $searchResultEntry; + } else { + if ( + TypeCheck::isSomewhatIdentical( + $targetType, + $mappingEntry->getTargetType() + ) + ) { + $searchResultEntry = new SearchResultEntry( + mappingOrder: $mappingEntry->getOrder(), + sourceType: $sourceType, + targetType: $targetType, + transformer: $this->get($mappingEntry->getId()), + transformerServiceId: $mappingEntry->getId(), + variantTargetType: $mappingEntry->isVariantTargetType() + ); + + $searchResultEntries[] = $searchResultEntry; + } + } + } + + return new SearchResult($searchResultEntries); + } + public function findBySourceAndTargetTypes( iterable $sourceTypes, iterable $targetTypes, ): SearchResult { - /** @var array */ - $mappingEntries = []; + /** @var array */ + $searchResultEntries = []; foreach ($sourceTypes as $sourceType) { foreach ($targetTypes as $targetType) { - $mapping = $this->getMappingBySourceAndTargetType( - $sourceType, - $targetType - ); - - foreach ($mapping as $mappingEntry) { - if ($mappingEntry->isVariantTargetType() || !TypeCheck::isObject($targetType)) { - $mappingEntries[] = [ - $sourceType, - $targetType, - $mappingEntry, - ]; - } else { - if ( - TypeCheck::isSomewhatIdentical( - $targetType, - $mappingEntry->getTargetType() - ) - ) { - $mappingEntries[] = [ - $sourceType, - $targetType, - $mappingEntry, - ]; - } - } + $result = $this->findBySourceAndTargetType($sourceType, $targetType); + foreach ($result as $searchResultEntry) { + $searchResultEntries[] = $searchResultEntry; } } } usort( - $mappingEntries, - fn (array $a, array $b) - => - /** @psalm-suppress MixedMethodCall */ - $a[2]->getOrder() <=> $b[2]->getOrder() + $searchResultEntries, + fn (SearchResultEntry $a, SearchResultEntry $b) + => $a->getMappingOrder() <=> $b->getMappingOrder() ); - $result = []; - - foreach ($mappingEntries as $mappingEntry) { - $result[] = new SearchResultEntry( - $mappingEntry[2]->getOrder(), - $mappingEntry[0], - $mappingEntry[1], - $this->get($mappingEntry[2]->getId()), - $mappingEntry[2]->getId(), - $mappingEntry[2]->isVariantTargetType() - ); - } - - return new SearchResult($result); + return new SearchResult($searchResultEntries); } /**