Passed
Push — master ( 5369ce...cf86e2 )
by Smoren
02:17
created

Rule   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Test Coverage

Coverage 59.09%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 22
c 1
b 0
f 0
dl 0
loc 68
ccs 13
cts 22
cp 0.5909
rs 10
wmc 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A toBlocking() 0 6 2
A validate() 0 23 6
A check() 0 3 1
A add() 0 4 1
1
<?php
2
3
namespace Smoren\Validator\Rules;
4
5
use Smoren\Validator\Exceptions\CheckError;
6
use Smoren\Validator\Exceptions\StopValidationException;
7
use Smoren\Validator\Exceptions\ValidationError;
8
use Smoren\Validator\Interfaces\CheckInterface;
9
use Smoren\Validator\Interfaces\UniformRuleInterface;
10
use Smoren\Validator\Structs\Check;
11
12
class Rule extends NullableRule implements UniformRuleInterface
13
{
14
    /**
15
     * @var array<CheckInterface>
16
     */
17
    protected array $checks = [];
18
19
    /**
20
     * {@inheritDoc}
21
     */
22 38
    public function validate($value): void
23
    {
24
        try {
25 38
            parent::validate($value);
26 4
        } catch (StopValidationException $e) {
27 3
            return;
28
        }
29
30 37
        $errors = [];
31
32 37
        foreach ($this->checks as $check) {
33
            try {
34 37
                $check->execute($value);
35 21
            } catch (CheckError $e) {
36 21
                if ($check->isBlocking()) {
37 4
                    throw ValidationError::fromCheckErrors($value, [$e]);
38
                }
39 17
                $errors[] = $e;
40
            }
41
        }
42
43 33
        if (\count($errors) > 0) {
44 17
            throw ValidationError::fromCheckErrors($value, $errors);
45
        }
46
    }
47
48
    /**
49
     * {@inheritDoc}
50
     *
51
     * @return static
52
     */
53
    public function add(CheckInterface $check): self
54
    {
55
        $this->checks[] = $check;
56
        return $this;
57
    }
58
59
    /**
60
     * {@inheritDoc}
61
     *
62
     * @return static
63
     */
64
    public function toBlocking(): self
65
    {
66
        foreach ($this->checks as $check) {
67
            $check->setBlocking();
68
        }
69
        return $this;
70
    }
71
72
    /**
73
     * {@inheritDoc}
74
     *
75
     * @return static
76
     */
77
    public function check(string $name, callable $predicate, array $params = [], bool $isBlocking = false): self
78
    {
79
        return $this->add(new Check($name, $predicate, $params, $isBlocking));
80
    }
81
}
82