Completed
Push — master ( a5dee7...adf519 )
by Changwan
04:02
created

PipelineValidator::__call()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 2
dl 0
loc 5
ccs 3
cts 3
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
namespace Wandu\Validator\Rules;
3
4
use Wandu\Validator\Contracts\ValidatorInterface;
5
use Wandu\Validator\Exception\InvalidValueException;
6
use function Wandu\Validator\validator;
7
8
/**
9
 * @method \Wandu\Validator\Rules\PipelineValidator required()
10
 * @method \Wandu\Validator\Rules\PipelineValidator not(\Wandu\Validator\Rules\PipelineValidator $validator)
11
 * @method \Wandu\Validator\Rules\PipelineValidator array(array $attributes = [])
12
 * @method \Wandu\Validator\Rules\PipelineValidator collection($rule = null)
13
 * @method \Wandu\Validator\Rules\PipelineValidator iterable($rule = null)
14
 * @method \Wandu\Validator\Rules\PipelineValidator arrayable(array $attributes = [])
15
 * @method \Wandu\Validator\Rules\PipelineValidator object(array $properties = [])
16
 * @method \Wandu\Validator\Rules\PipelineValidator integer()
17
 * @method \Wandu\Validator\Rules\PipelineValidator boolean()
18
 * @method \Wandu\Validator\Rules\PipelineValidator float()
19
 * @method \Wandu\Validator\Rules\PipelineValidator string()
20
 * @method \Wandu\Validator\Rules\PipelineValidator integerable()
21
 * @method \Wandu\Validator\Rules\PipelineValidator floatable()
22
 * @method \Wandu\Validator\Rules\PipelineValidator numeric()
23
 * @method \Wandu\Validator\Rules\PipelineValidator stringable()
24
 * @method \Wandu\Validator\Rules\PipelineValidator printable()
25
 * @method \Wandu\Validator\Rules\PipelineValidator min(int $min)
26
 * @method \Wandu\Validator\Rules\PipelineValidator max(int $max)
27
 * @method \Wandu\Validator\Rules\PipelineValidator lengthMin(int $min)
28
 * @method \Wandu\Validator\Rules\PipelineValidator lengthMax(int $max)
29
 * @method \Wandu\Validator\Rules\PipelineValidator email(\Egulias\EmailValidator\Validation\EmailValidation $validation = null)
30
 * @method \Wandu\Validator\Rules\PipelineValidator regExp(string $pattern)
31
 */
32
class PipelineValidator implements ValidatorInterface
33
{
34
    /** @var array|\Wandu\Validator\Contracts\ValidatorInterface[] */
35
    protected $validators;
36
    
37
    /**
38
     * @param \Wandu\Validator\Contracts\ValidatorInterface[] $validators
39
     */
40
    public function __construct(array $validators = [])
41
    {
42 21
        $this->validators = array_map(function ($validator) {
43 21
            return validator()->from($validator);
44 21
        }, $validators);
45 21
    }
46
47
    /**
48
     * @param string $name
49
     * @param array $arguments
50
     * @return \Wandu\Validator\Rules\PipelineValidator
51
     */
52 1
    public function __call($name, array $arguments = [])
53
    {
54 1
        $this->validators[] = validator()->__call($name, $arguments);
55 1
        return $this;
56
    }
57
58
    /**
59
     * {@inheritdoc}
60
     */
61 14
    public function assert($item)
62
    {
63
        /** @var \Wandu\Validator\Exception\InvalidValueException[] $exceptions */
64 14
        $exceptions = [];
65 14
        foreach ($this->validators as $validator) {
66
            try {
67 14
                $validator->assert($item);
68 14
            } catch (InvalidValueException $exception) {
69 14
                $exceptions[] = $exception;
70
            }
71 14
        }
72 14
        if (count($exceptions)) {
73 14
            $baseException = $exceptions[0];
74 14
            for ($i = 1, $length = count($exceptions); $i < $length; $i++) {
75 2
                $baseException->appendTypes($exceptions[$i]->getTypes());
76 2
            }
77 14
            throw $baseException;
78
        }
79 9
    }
80
81
    /**
82
     * {@inheritdoc}
83
     */
84 3
    public function validate($item)
85
    {
86 3
        foreach ($this->validators as $validator) {
87 3
            if (!$validator->validate($item)) {
88 3
                return false;
89
            }
90 1
        }
91 1
        return true;
92
    }
93
}
94