Skip to content

Commit

Permalink
exp
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed Jan 24, 2024
1 parent 1eb8c0f commit 7735734
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 1 deletion.
1 change: 1 addition & 0 deletions config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@
->set('rekalogika.mapper.transformer_registry', TransformerRegistry::class)
->args([
'$transformersLocator' => tagged_locator('rekalogika.mapper.transformer'),
'$typeResolver' => service('rekalogika.mapper.type_resolver'),
'$mappingFactory' => service('rekalogika.mapper.mapping_factory'),
]);

Expand Down
1 change: 1 addition & 0 deletions src/MapperFactory/MapperFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,7 @@ protected function getTransformerRegistry(): TransformerRegistryInterface
if (null === $this->transformerRegistry) {
$this->transformerRegistry = new TransformerRegistry(
$this->getTransformersLocator(),
$this->getTypeResolver(),
$this->getMappingFactory(),
);
}
Expand Down
24 changes: 24 additions & 0 deletions src/TransformerRegistry/TransformerRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
use Rekalogika\Mapper\Exception\LogicException;
use Rekalogika\Mapper\Mapping\MappingFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;

class TransformerRegistry implements TransformerRegistryInterface
{
public function __construct(
private ContainerInterface $transformersLocator,
private TypeResolverInterface $typeResolver,
private MappingFactoryInterface $mappingFactory,
) {
}
Expand Down Expand Up @@ -55,6 +57,28 @@ public function findBySourceAndTargetTypes(
array $sourceTypes,
array $targetTypes,
): SearchResult {
$newSourceTypes = [];
$newTargetTypes = [];

foreach ($sourceTypes as $sourceType) {
$newSourceTypes = [
...$newSourceTypes,
$sourceType,
...$this->typeResolver->getAttributeTypes($sourceType),
];
}

foreach ($targetTypes as $targetType) {
$newTargetTypes = [
...$newTargetTypes,
$targetType,
...$this->typeResolver->getAttributeTypes($targetType),
];
}

$sourceTypes = $newSourceTypes;
$targetTypes = $newTargetTypes;

$mapping = $this->mappingFactory->getMapping();

/** @var array<int,SearchResultEntry> */
Expand Down
5 changes: 5 additions & 0 deletions src/TypeResolver/CachingTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,9 @@ public function getAcceptedTransformerOutputTypeStrings(Type|MixedType $type): a
{
return $this->decorated->getAcceptedTransformerOutputTypeStrings($type);
}

public function getAttributeTypes(Type|MixedType $type): array
{
return $this->decorated->getAttributeTypes($type);
}
}
9 changes: 9 additions & 0 deletions src/TypeResolver/TypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,13 @@ public function getAcceptedTransformerOutputTypeStrings(Type|MixedType $type): a
{
return $this->getAcceptedTransformerInputTypeStrings($type);
}

public function getAttributeTypes(Type|MixedType $type): array
{
if ($type instanceof MixedType) {
return [];
}

return TypeUtil::getAttributesFromType($type);
}
}
6 changes: 6 additions & 0 deletions src/TypeResolver/TypeResolverInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,10 @@ public function getAcceptedTransformerInputTypeStrings(Type|MixedType $type): ar
* @return array<int,string>
*/
public function getAcceptedTransformerOutputTypeStrings(Type|MixedType $type): array;

/**
* @param Type|MixedType $type
* @return array<int,Type>
*/
public function getAttributeTypes(Type|MixedType $type): array;
}
2 changes: 1 addition & 1 deletion src/Util/TypeUtil.php
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ private static function getAllClassesFromObject(
* @param Type|MixedType $type
* @return array<int,Type>
*/
private static function getAttributesFromType(
public static function getAttributesFromType(
Type|MixedType $type
): array {
if ($type instanceof MixedType) {
Expand Down

0 comments on commit 7735734

Please sign in to comment.