Skip to content

Commit

Permalink
refactor: Refactor exception.
Browse files Browse the repository at this point in the history
  • Loading branch information
priyadi committed Jan 13, 2024
1 parent 29f08a3 commit d87a028
Show file tree
Hide file tree
Showing 27 changed files with 90 additions and 51 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
* refactor: Move transformer query logic to `TransformerRegistry`.
* refactor: Mover more logic to `TransformerRegistry`.
* refactor: Move `MainTransformer` to its own namespace.
* refactor: Refactor exception.

## 0.5.4

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\MainTransformer\Exception;

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

class UnableToFindSuitableTransformerException extends NotMappableValueException
class CannotFindTransformerException extends \RuntimeException
{
/**
* @param array<int,Type|MixedType> $sourceTypes
Expand All @@ -28,6 +28,6 @@ public function __construct(array $sourceTypes, array $targetTypes)
$sourceTypes = TypeUtil::getDebugType($sourceTypes);
$targetTypes = TypeUtil::getDebugType($targetTypes);

parent::__construct(sprintf('Unable to find a suitable transformer for mapping the source types "%s" to the target types "%s"', $sourceTypes, $sourceTypes));
parent::__construct(sprintf('Cannot find a matching transformer for mapping the source types "%s" to the target types "%s"', $sourceTypes, $sourceTypes));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,20 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\MainTransformer\Exception;

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

class MapperReturnsUnexpectedValueException extends UnexpectedValueException
class TransformerReturnsUnexpectedValueException extends UnexpectedValueException
{
public function __construct(Type|null $type, mixed $target)
public function __construct(Type|MixedType $type, mixed $target)
{
$message = sprintf(
'Mapper returns unexpected value. Expected type "%s", but got "%s"',
$type === null ? 'unknown' : TypeUtil::getTypeString($type),
TypeUtil::getTypeString($type),
get_debug_type($target),
);

Expand Down
10 changes: 8 additions & 2 deletions src/MainTransformer/MainTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@
namespace Rekalogika\Mapper\MainTransformer;

use Rekalogika\Mapper\Exception\LogicException;
use Rekalogika\Mapper\Exception\UnableToFindSuitableTransformerException;
use Rekalogika\Mapper\MainTransformer\Exception\CannotFindTransformerException;
use Rekalogika\Mapper\MainTransformer\Exception\TransformerReturnsUnexpectedValueException;
use Rekalogika\Mapper\ObjectCache\ObjectCache;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\TransformerRegistry\TransformerRegistryInterface;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;
use Symfony\Component\PropertyInfo\Type;

class MainTransformer implements MainTransformerInterface
Expand Down Expand Up @@ -150,9 +152,13 @@ public function transform(
context: $context
);

if (!TypeCheck::isVariableInstanceOf($result, $targetType)) {
throw new TransformerReturnsUnexpectedValueException($targetType, $result);
}

return $result;
}

throw new UnableToFindSuitableTransformerException($sourceTypes, $targetTypes);
throw new CannotFindTransformerException($sourceTypes, $targetTypes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\ObjectCache\Exception;

use Rekalogika\Mapper\Exception\RuntimeException;

class CachedTargetObjectNotFoundException extends RuntimeException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\ObjectCache\Exception;

use Rekalogika\Mapper\Exception\ExceptionInterface;
use Rekalogika\Mapper\Exception\RuntimeException;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

class CircularReferenceException extends \RuntimeException implements ExceptionInterface
class CircularReferenceException extends RuntimeException implements ExceptionInterface
{
public function __construct(mixed $source, Type $targetType)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\ObjectCache\Exception;

use Rekalogika\Mapper\Exception\UnexpectedValueException;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

Expand Down
6 changes: 3 additions & 3 deletions src/ObjectCache/ObjectCache.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

namespace Rekalogika\Mapper\ObjectCache;

use Rekalogika\Mapper\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\Exception\CircularReferenceException;
use Rekalogika\Mapper\Exception\LogicException;
use Rekalogika\Mapper\Exception\NonSimpleTypeException;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\Exception\CircularReferenceException;
use Rekalogika\Mapper\ObjectCache\Exception\NonSimpleTypeException;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Symfony\Component\PropertyInfo\Type;

Expand Down
2 changes: 1 addition & 1 deletion src/Transformer/ArrayToObjectTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
namespace Rekalogika\Mapper\Transformer;

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Exception\InvalidTypeInArgumentException;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\InvalidTypeInArgumentException;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeFactory;
use Symfony\Component\PropertyInfo\Type;
Expand Down
2 changes: 1 addition & 1 deletion src/Transformer/Contracts/TransformerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

namespace Rekalogika\Mapper\Transformer\Contracts;

use Rekalogika\Mapper\Exception\CircularReferenceException;
use Rekalogika\Mapper\Exception\ExceptionInterface;
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Exception\LogicException;
use Rekalogika\Mapper\ObjectCache\Exception\CircularReferenceException;
use Symfony\Component\PropertyInfo\Type;

interface TransformerInterface
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

class ClassNotInstantiableException extends NotMappableValueException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

class IncompleteConstructorArgument extends NotMappableValueException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

class InstantiationFailureException extends NotMappableValueException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Exception\UnexpectedValueException;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Util\TypeUtil;
use Symfony\Component\PropertyInfo\Type;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Util\TypeUtil;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

abstract class MissingMemberTypeException extends NotMappableValueException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Transformer\Contracts\MixedType;
use Rekalogika\Mapper\Util\TypeUtil;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
* that was distributed with this source code.
*/

namespace Rekalogika\Mapper\Exception;
namespace Rekalogika\Mapper\Transformer\Exception;

use Rekalogika\Mapper\Exception\UnexpectedValueException;

abstract class NotMappableValueException extends UnexpectedValueException
{
Expand Down
10 changes: 5 additions & 5 deletions src/Transformer/ObjectToObjectTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@

namespace Rekalogika\Mapper\Transformer;

use Rekalogika\Mapper\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\Exception\ClassNotInstantiableException;
use Rekalogika\Mapper\Exception\IncompleteConstructorArgument;
use Rekalogika\Mapper\Exception\InstantiationFailureException;
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Exception\InvalidClassException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\ClassNotInstantiableException;
use Rekalogika\Mapper\Transformer\Exception\IncompleteConstructorArgument;
use Rekalogika\Mapper\Transformer\Exception\InstantiationFailureException;
use Rekalogika\Mapper\Transformer\Exception\InvalidClassException;
use Rekalogika\Mapper\TypeResolver\TypeResolverInterface;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeFactory;
Expand Down
3 changes: 2 additions & 1 deletion src/Transformer/StringToBackedEnumTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\InvalidTypeInArgumentException;
use Rekalogika\Mapper\Util\TypeFactory;
use Symfony\Component\PropertyInfo\Type;

Expand All @@ -35,7 +36,7 @@ public function transform(
$class = $targetType?->getClassName();

if ($class === null || !\enum_exists($class)) {
throw new InvalidArgumentException(sprintf('Target must be an enum class-string, "%s" given', get_debug_type($class)));
throw new InvalidTypeInArgumentException('Target must be an enum class-string, "%s" given', $targetType);
}

// @todo maybe add option to handle values not in the enum
Expand Down
9 changes: 5 additions & 4 deletions src/Transformer/TraversableToArrayAccessTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,17 @@

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Rekalogika\Mapper\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Exception\InvalidTypeInArgumentException;
use Rekalogika\Mapper\Exception\MissingMemberKeyTypeException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\ClassNotInstantiableException;
use Rekalogika\Mapper\Transformer\Exception\InvalidTypeInArgumentException;
use Rekalogika\Mapper\Transformer\Exception\MissingMemberKeyTypeException;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeFactory;
use Symfony\Component\PropertyInfo\Type;
Expand Down Expand Up @@ -193,7 +194,7 @@ private function instantiateArrayAccessOrArray(
try {
$result = $reflectionClass->newInstance();
} catch (\ReflectionException) {
throw new InvalidArgumentException(sprintf('We do not know how to instantiate class "%s"', $class));
throw new ClassNotInstantiableException($class);
}

if (!$result instanceof \ArrayAccess) {
Expand Down
6 changes: 3 additions & 3 deletions src/Transformer/TraversableToTraversableTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@

namespace Rekalogika\Mapper\Transformer;

use Rekalogika\Mapper\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\Exception\InvalidArgumentException;
use Rekalogika\Mapper\Exception\MissingMemberKeyTypeException;
use Rekalogika\Mapper\Exception\MissingMemberValueTypeException;
use Rekalogika\Mapper\MainTransformer\MainTransformer;
use Rekalogika\Mapper\ObjectCache\Exception\CachedTargetObjectNotFoundException;
use Rekalogika\Mapper\ObjectCache\ObjectCacheFactoryInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareInterface;
use Rekalogika\Mapper\Transformer\Contracts\MainTransformerAwareTrait;
use Rekalogika\Mapper\Transformer\Contracts\TransformerInterface;
use Rekalogika\Mapper\Transformer\Contracts\TypeMapping;
use Rekalogika\Mapper\Transformer\Exception\MissingMemberKeyTypeException;
use Rekalogika\Mapper\Transformer\Exception\MissingMemberValueTypeException;
use Rekalogika\Mapper\Transformer\Model\TraversableCountableWrapper;
use Rekalogika\Mapper\Util\TypeCheck;
use Rekalogika\Mapper\Util\TypeFactory;
Expand Down
27 changes: 24 additions & 3 deletions src/Util/TypeCheck.php
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,26 @@ public static function isEnum(?Type $type): bool
if ($type === null) {
return false;
}

$class = $type->getClassName();

return $type->getBuiltinType() === Type::BUILTIN_TYPE_OBJECT
&& $type->getClassName() !== null
&& enum_exists($type->getClassName());
&& $class !== null
&& enum_exists($class);
}

public static function isBackedEnum(?Type $type): bool
{
if ($type === null) {
return false;
}

$class = $type->getClassName();

return $type->getBuiltinType() === Type::BUILTIN_TYPE_OBJECT
&& $class !== null
&& enum_exists($class)
&& is_a($class, \BackedEnum::class, true);
}

public static function isResource(?Type $type): bool
Expand Down Expand Up @@ -212,8 +229,12 @@ public static function isTypeInstanceOf(
/**
* @todo support generics
*/
public static function isVariableInstanceOf(mixed $variable, Type $type): bool
public static function isVariableInstanceOf(mixed $variable, Type|MixedType $type): bool
{
if ($type instanceof MixedType) {
return true;
}

if (self::isObject($type)) {
$class = $type->getClassName();

Expand Down
Loading

0 comments on commit d87a028

Please sign in to comment.