Passed
Pull Request — master (#97)
by Alexander
02:08
created

Rules::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 2
nc 2
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 2
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator;
6
7
use Yiisoft\Translator\TranslatorInterface;
8
use Yiisoft\Validator\Rule\Callback;
9
10
/**
11
 * Rules represents multiple rules for a single value
12
 */
13
final class Rules
14
{
15
    private ?TranslatorInterface $translator = null;
16
17
    /**
18
     * @var Rule[] $rules
19
     */
20
    private array $rules = [];
21
22 17
    public function __construct(iterable $rules = [])
23
    {
24 17
        foreach ($rules as $rule) {
25 16
            $this->add($rule);
26
        }
27 17
    }
28
29
    /**
30
     * @param callable|Rule $rule
31
     */
32 17
    public function add($rule): void
33
    {
34 17
        $rule = $this->normalizeRule($rule);
35 17
        if ($this->translator !== null) {
36
            $rule = $rule->translator($this->translator);
37
        }
38 17
        $this->rules[] = $rule;
39 17
    }
40
41 12
    public function validate($value, DataSetInterface $dataSet = null, bool $previousRulesErrored = false): Result
42
    {
43 12
        $compoundResult = new Result();
44 12
        foreach ($this->rules as $rule) {
45 12
            $ruleResult = $rule->validate($value, $dataSet, $previousRulesErrored);
46 12
            if ($ruleResult->isValid() === false) {
47 12
                $previousRulesErrored = true;
48 12
                foreach ($ruleResult->getErrors() as $message) {
49 12
                    $compoundResult->addError($message);
50
                }
51
            }
52
        }
53 12
        return $compoundResult;
54
    }
55
56 17
    private function normalizeRule($rule): Rule
57
    {
58 17
        if (is_callable($rule)) {
59 4
            $rule = new Callback($rule);
60
        }
61
62 17
        if (!$rule instanceof Rule) {
63
            throw new \InvalidArgumentException(sprintf(
64
                'Rule should be either instance of Rule class or a callable, %s given.',
65
                gettype($rule)
66
            ));
67
        }
68
69 17
        return $rule;
70
    }
71
72 1
    public function withTranslator(TranslatorInterface $translator): self
73
    {
74 1
        $new = clone $this;
75 1
        $new->translator = $translator;
76 1
        $new->addTranslatorToRules($translator);
77 1
        return $new;
78
    }
79
80
    /**
81
     * Return rules as array.
82
     *
83
     * @return array
84
     */
85 4
    public function asArray(): array
86
    {
87 4
        $arrayOfRules = [];
88 4
        foreach ($this->rules as $rule) {
89 4
            $arrayOfRules[] = array_merge([$rule->getName()], $rule->getOptions());
90
        }
91 4
        return $arrayOfRules;
92
    }
93
94 1
    private function addTranslatorToRules(TranslatorInterface $translator): void
95
    {
96 1
        foreach ($this->rules as &$rule) {
97 1
            $rule = $rule->translator($translator);
98
        }
99 1
    }
100
}
101