marcosh/php-validation-dsl

View on GitHub
src/Combinator/MapErrors.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

declare(strict_types=1);

namespace Marcosh\PhpValidationDSL\Combinator;

use Marcosh\PhpValidationDSL\Result\ValidationResult;
use Marcosh\PhpValidationDSL\Validation;

/**
 * @template A
 * @template E
 * @template F
 * @template B
 * @implements Validation<A, F, B>
 */
final class MapErrors implements Validation
{
    /** @var Validation<A, E, B> */
    private $validation;

    /**
     * @var callable(E[]): F[]
     */
    private $function;

    /**
     * @param Validation<A, E, B> $validation
     * @param callable(E[]): F[] $function
     */
    private function __construct(
        Validation $validation,
        callable $function
    ) {
        $this->validation = $validation;
        $this->function = $function;
    }

    /**
     * @template C
     * @template G
     * @template H
     * @template D
     * @param Validation<C, G, D> $validation
     * @param callable(G[]): H[] $function
     * @return self<C, G, H, D>
     */
    public static function to(
        Validation $validation,
        callable $function
    ): self {
        return new self($validation, $function);
    }

    /**
     * @param A $data
     * @param array $context
     * @return ValidationResult<F, B>
     */
    public function validate($data, array $context = []): ValidationResult
    {
        return $this->validation->validate($data, $context)->mapErrors($this->function);
    }
}