refacto: pipes

This commit is contained in:
Nuno Maduro
2021-12-05 14:03:09 +00:00
parent 6c3a8be049
commit 98db677646
9 changed files with 239 additions and 271 deletions

View File

@ -4,7 +4,6 @@ declare(strict_types=1);
namespace Pest\Concerns;
use BadMethodCallException;
use Closure;
/**
@ -19,51 +18,14 @@ trait Extendable
*/
private static array $extends = [];
/** @var array<string, array<Closure(Closure, mixed ...$arguments): void>> */
private static array $pipes = [];
/**
* Register a new extend.
*/
public static function extend(string $name, Closure $extend): void
public function extend(string $name, Closure $extend): void
{
static::$extends[$name] = $extend;
}
/**
* Register a pipe to be applied before an expectation is checked.
*/
public static function pipe(string $name, Closure $pipe): void
{
self::$pipes[$name][] = $pipe;
}
/**
* Register an interceptor that should replace an existing expectation.
*
* @param string|Closure(mixed $value, mixed ...$arguments):bool $filter
*/
public static function intercept(string $name, string|Closure $filter, Closure $handler): void
{
if (is_string($filter)) {
$filter = function ($value) use ($filter): bool {
return $value instanceof $filter;
};
}
self::pipe($name, function ($next, ...$arguments) use ($handler, $filter) {
/* @phpstan-ignore-next-line */
if ($filter($this->value, ...$arguments)) {
//@phpstan-ignore-next-line
$handler->bindTo($this, get_class($this))(...$arguments);
return;
}
$next();
});
}
/**
* Checks if given extend name is registered.
*/
@ -71,29 +33,4 @@ trait Extendable
{
return array_key_exists($name, static::$extends);
}
/**
* @return array<int, Closure>
*/
private function pipes(string $name, object $context, string $scope): array
{
return array_map(fn (Closure $pipe) => $pipe->bindTo($context, $scope), self::$pipes[$name] ?? []);
}
/**
* Dynamically handle calls to the class.
*
* @param array<int, mixed> $parameters
*/
public function __call(string $method, array $parameters): mixed
{
if (!static::hasExtend($method)) {
throw new BadMethodCallException("$method is not a callable method name.");
}
/** @var Closure $extend */
$extend = static::$extends[$method]->bindTo($this, static::class);
return $extend(...$parameters);
}
}