Test Failed
Push — master ( 032cb3...6fb1e5 )
by Alexey
02:42
created

Rule::requirementsValidations()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
ccs 0
cts 0
cp 0
rs 10
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
4
namespace Lexuss1979\Validol;
5
6
7
use Lexuss1979\Validol\Exceptions\RequirementsConflictValidationException;
8
use Lexuss1979\Validol\Exceptions\TypeConflictValidationException;
9
use Lexuss1979\Validol\Validations\AbstractValidation;
10
use Lexuss1979\Validol\Validations\ValidationFactory;
11
12
class Rule
13
{
14
    protected $options;
15 42
    protected $validations;
16
    protected $errors = [];
17 42
    protected $value;
18 42
    protected $status;
19 42
20
    public function __construct($options, ValidationFactory $validationFactory)
21 42
    {
22 42
        $this->options = $options;
23 42
        $signatures = explode(" ", $options);
24 42
        foreach ($signatures as $signature) {
25 42
            $validation = $validationFactory->get($signature);
26 26
            $this->validations[$validation->group()][] = $validation;
27 26
        }
28
29
        $this->requirementsGuard();
30 42
        $this->typeGuard();
31
32
    }
33 26
34 26
    protected function requirementsGuard()
35
    {
36
        if (count($this->requirementsValidations()) > 1) {
37
            throw new RequirementsConflictValidationException("Multiple requirement validations detected");
38
        }
39
    }
40
41
    protected function requirementsValidations()
42
    {
43
        return $this->validations[AbstractValidation::REQUIREMENTS_GROUP] ?? [];
44
    }
45
46
    protected function typeGuard()
47
    {
48
        if (count($this->typeValidations()) > 1) {
49
            throw new TypeConflictValidationException("Multiple type validations detected");
50
        }
51
    }
52
53
    protected function typeValidations()
54
    {
55
        return $this->validations[AbstractValidation::TYPE_GROUP] ?? [];
56
    }
57
58
    public function process(ValueObject $data)
59
    {
60
        $this->value = $data;
61
        $this->status = true;
62
63
        $this->processRequirements();
64
        $needToContinueValidate = $this->status === true && !$this->value->isNull();
65
66
        if ($needToContinueValidate) {
67
            $this->processTypes();
68
            $this->processCommon();
69
        }
70
71
        return $this->status;
72
    }
73
74
    protected function processRequirements()
75
    {
76
        $this->processValidationGroup($this->requirementsValidations());
77
    }
78
79
    protected function processValidationGroup(array $validations)
80
    {
81
        foreach ($validations as $validation) {
82
            if (!$validation->validate($this->value)) {
83
                $this->errors[] = $validation->error();
84
                $this->status = false;
85
            }
86
        }
87
    }
88
89
    protected function processTypes()
90
    {
91
        $this->processValidationGroup($this->typeValidations());
92
    }
93
94
    protected function processCommon()
95
    {
96
        $this->processValidationGroup($this->commonValidations());
97
    }
98
99
    protected function commonValidations()
100
    {
101
        return $this->validations[AbstractValidation::COMMON_GROUP] ?? [];
102
    }
103
104
    public function getValidations($group = null)
105
    {
106
        if (isset($group)) {
107
            return $this->validations[$group];
108
        }
109
        return $this->validations;
110
    }
111
112
    public function errors()
113
    {
114
        return $this->errors;
115
    }
116
}