Completed
Push — master ( 8ace16...5d30f6 )
by Alexey
03:23
created

Rule::typeValidations()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
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
    protected $validations;
16
    protected $errors = [];
17
    protected $value;
18
    protected $status;
19
20 85
    public function __construct($options, ValidationFactory $validationFactory)
21
    {
22 85
        $signatures = $this->getSignatures($options);
23
24 85
        foreach ($signatures as $key => $val) {
25 85
            if(is_string($key)) {
26
                /** @var AbstractValidation $validation */
27 2
                $validation = $validationFactory->get($key);
28 2
                $validation->setErrorMessage($val);
29
            } else {
30 83
                $validation = $validationFactory->get($val);
31
            }
32
33 85
            $this->validations[$validation->group()][] = $validation;
34
        }
35
36 85
        $this->requirementsGuard();
37 84
        $this->typeGuard();
38
39 83
    }
40
41
    /**
42
     * @param $options mixed|array|string
43
     */
44 85
    protected function getSignatures($options){
45 85
        if(is_array($options)) {
46 4
            $signatures = [];
47 4
            foreach ($options as $key => $option){
48 4
                $associativeArray = is_string($key);
49 4
                if($associativeArray){
50 2
                    $part = $this->getSignatures($key);
51 2
                    $partValidation = [];
52 2
                    foreach ($part as $item) {
53 2
                        $partValidation[$item] = $option;
54
                    }
55 2
                    $signatures = array_merge($signatures, $partValidation);
56
                } else {
57 2
                    $part = $this->getSignatures($option);
58 2
                    $signatures = array_merge($signatures, $part);
59
                }
60
61
            }
62 4
            return $signatures;
63
        }
64
65 85
        return explode(" ", $options);
66
    }
67
68 85
    protected function requirementsGuard()
69
    {
70 85
        if (count($this->requirementsValidations()) > 1) {
71 1
            throw new RequirementsConflictValidationException("Multiple requirement validations detected");
72
        }
73 84
    }
74
75 85
    protected function requirementsValidations()
76
    {
77 85
        return $this->validations[AbstractValidation::REQUIREMENTS_GROUP] ?? [];
78
    }
79
80 84
    protected function typeGuard()
81
    {
82 84
        if (count($this->typeValidations()) > 1) {
83 1
            throw new TypeConflictValidationException("Multiple type validations detected");
84
        }
85 83
    }
86
87 84
    protected function typeValidations()
88
    {
89 84
        return $this->validations[AbstractValidation::TYPE_GROUP] ?? [];
90
    }
91
92 82
    public function process(ValueObject $data)
93
    {
94 82
        $this->value = $data;
95 82
        $this->status = true;
96
97 82
        $this->processRequirements();
98 82
        $needToContinueValidate = $this->status === true && !$this->value->isNull();
99
100 82
        if ($needToContinueValidate) {
101 79
            $this->processTypes();
102 79
            $this->processCommon();
103
        }
104
105 82
        return $this->status;
106
    }
107
108 82
    protected function processRequirements()
109
    {
110 82
        $this->processValidationGroup($this->requirementsValidations());
111 82
    }
112
113 82
    protected function processValidationGroup(array $validations)
114
    {
115 82
        foreach ($validations as $validation) {
116 82
            if (!$validation->validate($this->value)) {
117 49
                $this->errors[] = $validation->error();
118 49
                $this->status = false;
119
            }
120
        }
121 82
    }
122
123 79
    protected function processTypes()
124
    {
125 79
        $this->processValidationGroup($this->typeValidations());
126 79
    }
127
128 79
    protected function processCommon()
129
    {
130 79
        $this->processValidationGroup($this->commonValidations());
131 79
    }
132
133 79
    protected function commonValidations()
134
    {
135 79
        return $this->validations[AbstractValidation::COMMON_GROUP] ?? [];
136
    }
137
138 1
    public function getValidations($group = null)
139
    {
140 1
        if (isset($group)) {
141 1
            return $this->validations[$group];
142
        }
143
        return $this->validations;
144
    }
145
146 49
    public function errors()
147
    {
148 49
        return array_unique($this->errors);
149
    }
150
}