Completed
Push — master ( 6fb1e5...886f18 )
by Alexey
02:58 queued 12s
created

Rule   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Test Coverage

Coverage 98.11%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 21
eloc 39
c 1
b 0
f 0
dl 0
loc 103
ccs 52
cts 53
cp 0.9811
rs 10

13 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 2
A typeValidations() 0 3 1
A processRequirements() 0 3 1
A errors() 0 3 1
A commonValidations() 0 3 1
A processCommon() 0 3 1
A requirementsGuard() 0 4 2
A requirementsValidations() 0 3 1
A getValidations() 0 6 2
A processTypes() 0 3 1
A typeGuard() 0 4 2
A processValidationGroup() 0 6 3
A process() 0 14 3
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 47
    public function __construct($options, ValidationFactory $validationFactory)
21
    {
22 47
        $this->options = $options;
23 47
        $signatures = explode(" ", $options);
24 47
        foreach ($signatures as $signature) {
25 47
            $validation = $validationFactory->get($signature);
26 47
            $this->validations[$validation->group()][] = $validation;
27
        }
28
29 47
        $this->requirementsGuard();
30 46
        $this->typeGuard();
31
32 45
    }
33
34 47
    protected function requirementsGuard()
35
    {
36 47
        if (count($this->requirementsValidations()) > 1) {
37 1
            throw new RequirementsConflictValidationException("Multiple requirement validations detected");
38
        }
39 46
    }
40
41 47
    protected function requirementsValidations()
42
    {
43 47
        return $this->validations[AbstractValidation::REQUIREMENTS_GROUP] ?? [];
44
    }
45
46 46
    protected function typeGuard()
47
    {
48 46
        if (count($this->typeValidations()) > 1) {
49 1
            throw new TypeConflictValidationException("Multiple type validations detected");
50
        }
51 45
    }
52
53 46
    protected function typeValidations()
54
    {
55 46
        return $this->validations[AbstractValidation::TYPE_GROUP] ?? [];
56
    }
57
58 44
    public function process(ValueObject $data)
59
    {
60 44
        $this->value = $data;
61 44
        $this->status = true;
62
63 44
        $this->processRequirements();
64 44
        $needToContinueValidate = $this->status === true && !$this->value->isNull();
65
66 44
        if ($needToContinueValidate) {
67 41
            $this->processTypes();
68 41
            $this->processCommon();
69
        }
70
71 44
        return $this->status;
72
    }
73
74 44
    protected function processRequirements()
75
    {
76 44
        $this->processValidationGroup($this->requirementsValidations());
77 44
    }
78
79 44
    protected function processValidationGroup(array $validations)
80
    {
81 44
        foreach ($validations as $validation) {
82 44
            if (!$validation->validate($this->value)) {
83 27
                $this->errors[] = $validation->error();
84 27
                $this->status = false;
85
            }
86
        }
87 44
    }
88
89 41
    protected function processTypes()
90
    {
91 41
        $this->processValidationGroup($this->typeValidations());
92 41
    }
93
94 41
    protected function processCommon()
95
    {
96 41
        $this->processValidationGroup($this->commonValidations());
97 41
    }
98
99 41
    protected function commonValidations()
100
    {
101 41
        return $this->validations[AbstractValidation::COMMON_GROUP] ?? [];
102
    }
103
104 1
    public function getValidations($group = null)
105
    {
106 1
        if (isset($group)) {
107 1
            return $this->validations[$group];
108
        }
109
        return $this->validations;
110
    }
111
112 27
    public function errors()
113
    {
114 27
        return $this->errors;
115
    }
116
}