ForAll   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 15
c 2
b 0
f 0
dl 0
loc 50
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 2
A validate() 0 26 5
1
<?php
2
/*
3
 * This file is part of Phypes <https://github.com/2DSharp/Phypes>.
4
 *
5
 * (c) Dedipyaman Das <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
12
namespace Phypes\Rule\Aggregate;
13
14
15
use Phypes\Error\Error;
16
use Phypes\Exception\InvalidAggregateRule;
17
use Phypes\Result\Failure;
18
use Phypes\Result\Result;
19
use Phypes\Result\Success;
20
use Phypes\Rule\Rule;
21
22
class ForAll implements Rule
23
{
24
    /**
25
     * @var array $rules
26
     */
27
    private $rules = [];
28
29
    /**
30
     * ForAll constructor.
31
     * @param Rule ...$rules
32
     * @throws InvalidAggregateRule
33
     */
34
    public function __construct(Rule... $rules)
35
    {
36
        if (empty($rules))
37
            throw new InvalidAggregateRule("No rules specified for aggregate rule", ForAll::class);
38
        $this->rules = $rules;
39
    }
40
41
    /**
42
     * Validate for each rule. Works with an AND logic.
43
     * @param $data
44
     * @return Result
45
     */
46
    public function validate($data): Result
47
    {
48
        /**
49
         * @var Error $errors[]
50
         */
51
        $errors = [];
52
        foreach ($this->rules as $rule) {
53
54
            $result = $rule->validate($data);
55
56
            if (!$result->isValid()) {
57
                /**
58
                 * @var Failure $result
59
                 * @var Error $error
60
                 */
61
                foreach ($result->getErrors() as $error) {
62
                    $errors[] = $error;
63
                }
64
            }
65
66
        }
67
68
        if (!($errors))
69
            return new Success();
70
        else {
71
            return new Failure(...$errors); // Use the splat operator
72
73
        }
74
    }
75
}