Passed
Push — master ( f56605...d778ec )
by Smoren
02:21
created

Check::isDuplicate()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 4
nc 3
nop 2
dl 0
loc 9
ccs 5
cts 5
cp 1
crap 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Smoren\Validator\Checks;
6
7
use Smoren\Validator\Exceptions\CheckError;
8
use Smoren\Validator\Exceptions\ValidationError;
9
use Smoren\Validator\Interfaces\CheckInterface;
10
use Smoren\Validator\Structs\Param;
11
12
class Check implements CheckInterface
13
{
14
    /**
15
     * @var string
16
     */
17
    protected string $name;
18
    /**
19
     * @var callable
20
     */
21
    protected $predicate;
22
    /**
23
     * @var array<string, mixed>
24
     */
25
    protected array $params;
26
    /**
27
     * @var array<string, callable>
28
     */
29
    protected array $calculatedParams;
30
    /**
31
     * @var array<CheckInterface>
32
     */
33
    protected array $dependencies;
34
35
    /**
36
     * @param string $name
37
     * @param callable $predicate
38
     * @param array<string, mixed> $params
39
     * @param array<string, callable> $calculatedParams
40
     * @param array<CheckInterface> $dependencies
41
     */
42 292
    public function __construct(
43
        string $name,
44
        callable $predicate,
45
        array $params = [],
46
        array $calculatedParams = [],
47
        array $dependencies = []
48
    ) {
49 292
        $this->name = $name;
50 292
        $this->predicate = $predicate;
51 292
        $this->params = $params;
52 292
        $this->calculatedParams = $calculatedParams;
53 292
        $this->dependencies = $dependencies;
54
    }
55
56
    /**
57
     * {@inheritDoc}
58
     */
59 286
    public function __invoke($value, array $previousErrors, bool $preventDuplicate = false): void
60
    {
61 286
        foreach ($this->dependencies as $check) {
62 49
            $check(
63 49
                $value,
64 49
                $previousErrors,
65 49
                true
66 49
            );
67
        }
68
69 286
        $params = $this->params;
70 286
        foreach ($this->calculatedParams as $key => $paramGetter) {
71 3
            $params[$key] = $paramGetter($value);
72
        }
73
74 286
        $error = null;
75
76
        try {
77 286
            if (($this->predicate)($value, ...array_values($params)) === false) {
78 286
                $error = new CheckError($this->name, $value, $params);
79
            }
80 15
        } catch (ValidationError $e) {
81 15
            $params[Param::RULE] = $e->getName();
82 15
            $params[Param::VIOLATED_RESTRICTIONS] = $e->getViolatedRestrictions();
83 15
            $error = new CheckError($this->name, $value, $params);
84
        }
85
86 286
        if ($error !== null && (!$preventDuplicate || !$this->isDuplicate($error, $previousErrors))) {
87 160
            throw $error;
88
        }
89
    }
90
91
    /**
92
     * @param CheckError $error
93
     * @param array<CheckError> $previousErrors
94
     *
95
     * @return bool
96
     */
97 10
    protected function isDuplicate(CheckError $error, array $previousErrors): bool
98
    {
99 10
        foreach ($previousErrors as $previousError) {
100 2
            if ($error->equalTo($previousError)) {
101 2
                return true;
102
            }
103
        }
104
105 10
        return false;
106
    }
107
}
108