Skip to content

Commit

Permalink
Various fixes
Browse files Browse the repository at this point in the history
* refactor: `MainTransformerInterface` now only accept array `$targetType`
* refactor: `TransformerInterface` now accepts null `$targetType` to signify
  mixed type.
* refactor: Remove deprecated facade.
* feat: Add `CopyTransformer` to handle mixed to mixed mapping.
  • Loading branch information
priyadi committed Jan 12, 2024
1 parent 65bb1f9 commit d7813f4
Show file tree
Hide file tree
Showing 29 changed files with 189 additions and 272 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
* refactor: Simplify `MapperInterface`
* test: Fix tests due to refactor
* refactor: Move deprecated facade to Facade namespace
* refactor: `MainTransformerInterface` now only accept array `$targetType`
* refactor: `TransformerInterface` now accepts null `$targetType` to signify
mixed type.
* refactor: Remove deprecated facade.
* feat: Add `CopyTransformer` to handle mixed to mixed mapping.

## 0.5.3

Expand Down
23 changes: 14 additions & 9 deletions config/services.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use Rekalogika\Mapper\Mapping\MappingFactoryInterface;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactory;
use Rekalogika\Mapper\Transformer\ArrayToObjectTransformer;
use Rekalogika\Mapper\Transformer\CopyTransformer;
use Rekalogika\Mapper\Transformer\DateTimeTransformer;
use Rekalogika\Mapper\Transformer\NullTransformer;
use Rekalogika\Mapper\Transformer\ObjectToArrayTransformer;
Expand Down Expand Up @@ -83,43 +84,43 @@

$services
->set('rekalogika.mapper.transformer.scalar_to_scalar', ScalarToScalarTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -550]);
->tag('rekalogika.mapper.transformer', ['priority' => -500]);

$services
->set('rekalogika.mapper.transformer.datetime', DateTimeTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -600]);
->tag('rekalogika.mapper.transformer', ['priority' => -550]);

$services
->set('rekalogika.mapper.transformer.string_to_backed_enum', StringToBackedEnumTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -650]);
->tag('rekalogika.mapper.transformer', ['priority' => -600]);

$services
->set('rekalogika.mapper.transformer.object_to_string', ObjectToStringTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -700]);
->tag('rekalogika.mapper.transformer', ['priority' => -650]);

$services
->set('rekalogika.mapper.transformer.traversable_to_arrayaccess', TraversableToArrayAccessTransformer::class)
->args([
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -750]);
->tag('rekalogika.mapper.transformer', ['priority' => -700]);

$services
->set('rekalogika.mapper.transformer.traversable_to_traversable', TraversableToTraversableTransformer::class)
->args([
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -800]);
->tag('rekalogika.mapper.transformer', ['priority' => -750]);

$services
->set('rekalogika.mapper.transformer.object_to_array', ObjectToArrayTransformer::class)
->args([service(NormalizerInterface::class)])
->tag('rekalogika.mapper.transformer', ['priority' => -850]);
->tag('rekalogika.mapper.transformer', ['priority' => -800]);

$services
->set('rekalogika.mapper.transformer.array_to_object', ArrayToObjectTransformer::class)
->args([service(DenormalizerInterface::class)])
->tag('rekalogika.mapper.transformer', ['priority' => -900]);
->tag('rekalogika.mapper.transformer', ['priority' => -850]);

$services
->set('rekalogika.mapper.transformer.object_to_object', ObjectToObjectTransformer::class)
Expand All @@ -132,10 +133,14 @@
'$typeResolver' => service('rekalogika.mapper.type_resolver'),
'$objectCacheFactory' => service('rekalogika.mapper.object_cache_factory'),
])
->tag('rekalogika.mapper.transformer', ['priority' => -950]);
->tag('rekalogika.mapper.transformer', ['priority' => -900]);

$services
->set('rekalogika.mapper.transformer.null', NullTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -950]);

$services
->set('rekalogika.mapper.transformer.null', CopyTransformer::class)
->tag('rekalogika.mapper.transformer', ['priority' => -1000]);

# mappingfactory
Expand Down
4 changes: 2 additions & 2 deletions src/Contracts/MainTransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
interface MainTransformerInterface
{
/**
* @param null|Type|array<array-key,Type> $targetType If provided, it will be used instead of guessing the type
* @param array<array-key,Type> $targetType If provided, it will be used instead of guessing the type
* @param array<string,mixed> $context
*/
public function transform(
mixed $source,
mixed $target,
null|Type|array $targetType,
array $targetType,
array $context
): mixed;
}
2 changes: 1 addition & 1 deletion src/Contracts/TransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function transform(
mixed $source,
mixed $target,
Type $sourceType,
Type $targetType,
?Type $targetType,
array $context
): mixed;

Expand Down
2 changes: 1 addition & 1 deletion src/Exception/InvalidTypeInArgumentException.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

class InvalidTypeInArgumentException extends InvalidArgumentException
{
public function __construct(string $printfMessage, Type $expectedType)
public function __construct(string $printfMessage, ?Type $expectedType)
{
parent::__construct(sprintf($printfMessage, TypeUtil::getDebugType($expectedType)));
}
Expand Down
7 changes: 4 additions & 3 deletions src/Exception/UnableToFindSuitableTransformerException.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,20 @@

namespace Rekalogika\Mapper\Exception;

use Rekalogika\Mapper\Contracts\MixedType;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

class UnableToFindSuitableTransformerException extends NotMappableValueException
{
/**
* @param Type $sourceType
* @param Type|array<array-key,Type> $targetType
* @param Type|array<array-key,Type|MixedType> $targetType
*/
public function __construct(Type $sourceType, Type|array $targetType)
public function __construct(Type $sourceType, Type|MixedType|array $targetType)
{
if (is_array($targetType)) {
$targetType = implode(', ', array_map(fn (Type $type) => TypeUtil::getDebugType($type), $targetType));
$targetType = implode(', ', array_map(fn (Type|MixedType $type) => TypeUtil::getDebugType($type), $targetType));
} else {
$targetType = TypeUtil::getDebugType($targetType);
}
Expand Down
134 changes: 0 additions & 134 deletions src/Facade/AllPurposeMapper.php

This file was deleted.

34 changes: 0 additions & 34 deletions src/Facade/AllPurposeMapperInterface.php

This file was deleted.

18 changes: 7 additions & 11 deletions src/MainTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,23 +55,23 @@ private function getTransformer(string $id): TransformerInterface
return $transformer->withMainTransformer($this);
}
return $transformer;

}

public function transform(
mixed $source,
mixed $target,
null|Type|array $targetType,
array $targetType,
array $context
): mixed {
// if targettype is not provided, guess it from target
// if the target is also missing then throw exception
// if the target is also missing then the target is mixed

if ($targetType === null) {
if (count($targetType) === 0) {
if ($target === null) {
throw new LogicException('Either $target or $targetType must be provided');
$targetType = [MixedType::instance()];
} else {
$targetType = [$this->typeResolver->guessTypeFromVariable($target)];
}
$targetType = $this->typeResolver->guessTypeFromVariable($target);
}

// get object cache
Expand All @@ -86,10 +86,6 @@ public function transform(

// gets simple target types from the provided target type

if ($targetType instanceof Type) {
$targetType = [$targetType];
}

$simpleTargetTypes = [];

foreach ($targetType as $singleTargetType) {
Expand All @@ -113,7 +109,7 @@ public function transform(
source: $source,
target: $target,
sourceType: $sourceType,
targetType: $singleTargetType,
targetType: $singleTargetType instanceof MixedType ? null : $singleTargetType,
context: $context
);

Expand Down
2 changes: 1 addition & 1 deletion src/Mapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function map(mixed $source, object|string $target, array $context = []):
$target = $this->transformer->transform(
source: $source,
target: $target,
targetType: $targetType,
targetType: [$targetType],
context: $context
);

Expand Down
Loading

0 comments on commit d7813f4

Please sign in to comment.