Skip to content

Commit

Permalink
feat: If a transformer throws RefuseToHandleException, the `MainTra…
Browse files Browse the repository at this point in the history
…nsformer` will try the next suitable transformer.
  • Loading branch information
priyadi committed Jan 14, 2024
1 parent 18ac68a commit 560ae69
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 10 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
exceptions.
* feat: Main transformer's exception now accepts `$context` variable.
* feat: More useful `TransformerReturnsUnexpectedValueException` exception message.
* feat: If a transformer throws `RefuseToHandleException`, the `MainTransformer`
will try the next suitable transformer.

## 0.5.8

Expand Down
22 changes: 13 additions & 9 deletions src/MainTransformer/MainTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Exception\RefuseToHandleException;
use Rekalogika\Mapper\TransformerRegistry\TransformerRegistryInterface;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;
Expand Down Expand Up @@ -163,20 +164,23 @@ public function transform(

// transform the source to the target

/** @var mixed */
$result = $transformer->transform(
source: $source,
target: $target,
sourceType: $sourceTypeForTransformer,
targetType: $targetTypeForTransformer,
context: $context
);
try {
/** @var mixed */
$result = $transformer->transform(
source: $source,
target: $target,
sourceType: $sourceTypeForTransformer,
targetType: $targetTypeForTransformer,
context: $context
);
} catch (RefuseToHandleException) {
continue;
}

// check the result type

if (
!TypeCheck::isVariableInstanceOf($result, $targetType)
&& $result !== null
) {
throw new TransformerReturnsUnexpectedValueException($source, $targetType, $result, $transformer, $context);
}
Expand Down
11 changes: 10 additions & 1 deletion src/Transformer/CopyTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\RefuseToHandleException;
use Rekalogika\Mapper\Util\TypeCheck;
use Symfony\Component\PropertyInfo\Type;

final class CopyTransformer implements TransformerInterface
Expand All @@ -37,7 +39,14 @@ public function transform(
if (!$clonable) {
return $source;
}
return clone $source;

$result = clone $source;

if ($targetType !== null && !TypeCheck::isVariableInstanceOf($result, $targetType)) {
throw new RefuseToHandleException();
}

return $result;
}

public function getSupportedTransformation(): iterable
Expand Down
25 changes: 25 additions & 0 deletions src/Transformer/Exception/RefuseToHandleException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

/*
* This file is part of rekalogika/mapper package.
*
* (c) Priyadi Iman Nurcahyo <https://rekalogika.dev>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Exception\RuntimeException;

/**
* If a transformer throw this exception, it means that the transformer is not
* able to handle the given source type in an ad-hoc basis. The main transformer
* will try the next transformer for the task.
*/
class RefuseToHandleException extends RuntimeException
{
}

0 comments on commit 560ae69

Please sign in to comment.