From 233af7d816d97d6418a6ea065c9fce88a8a3f7be Mon Sep 17 00:00:00 2001 From: Rodolfo Berrios <20590102+rodber@users.noreply.github.com> Date: Sun, 17 Dec 2023 21:14:05 -0300 Subject: [PATCH] action default return mixed --- src/Action.php | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Action.php b/src/Action.php index 6dad260..0b494b4 100644 --- a/src/Action.php +++ b/src/Action.php @@ -14,6 +14,7 @@ namespace Chevere\Action; use Chevere\Action\Interfaces\ActionInterface; +use Chevere\Parameter\Attributes\ReturnAttr; use Chevere\Parameter\Cast; use Chevere\Parameter\Interfaces\CastInterface; use Chevere\Parameter\Interfaces\ParameterInterface; @@ -26,7 +27,8 @@ use TypeError; use function Chevere\Message\message; use function Chevere\Parameter\arguments; -use function Chevere\Parameter\arrayp; +use function Chevere\Parameter\mixed; +use function Chevere\Parameter\reflectionToReturnParameter; /** * @method mixed run() @@ -64,7 +66,7 @@ final public function __invoke(mixed ...$argument): CastInterface public static function return(): ParameterInterface { - return arrayp(); + return mixed(); } final public static function assert(): void @@ -96,11 +98,16 @@ final protected static function assertMethod(): array ) ); } - $method = new ReflectionMethod(static::class, static::RUN_METHOD); - $return = static::return(); - if (! $method->hasReturnType()) { + $reflection = new ReflectionMethod(static::class, static::RUN_METHOD); + $attributes = $reflection->getAttributes(ReturnAttr::class); + if ($attributes === []) { + $return = static::return(); + } else { + $return = reflectionToReturnParameter($reflection); + } + if (! $reflection->hasReturnType()) { if ($return->type()->typeHinting() === 'null') { - return [$method, $return]; + return [$reflection, $return]; } throw new TypeError( @@ -112,7 +119,7 @@ final protected static function assertMethod(): array ); } - return [$method, $return]; + return [$reflection, $return]; } /** @@ -169,6 +176,9 @@ final protected static function assertTypes( default => $expectName, }; } + if (in_array('mixed', $expect, true)) { + return; + } if (! in_array($return, $expect, true)) { throw new TypeError( (string) message(