Passed
Push — master ( 7e622d...a4b69e )
by Alex
02:06
created

Validator::validateValueKeys()   A

Complexity

Conditions 6
Paths 9

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 18
rs 9.2222
c 0
b 0
f 0
cc 6
nc 9
nop 1
1
<?php
2
namespace Staticall\Petrovich\Petrovich\Ruleset;
3
4
use Staticall\Petrovich\Petrovich;
5
6
class Validator
7
{
8
    /**
9
     * Performs basic validation over provided rules
10
     * Useful for testing and/or any format changes
11
     *
12
     * @param array $rules
13
     *
14
     * @return bool
15
     */
16
    public function validate(array $rules) : bool
17
    {
18
        if ($this->validateRootKeys($rules) === false) {
19
            return false;
20
        }
21
22
        foreach ($rules as $rule) {
23
            if ($this->validateSecondKeys($rule) === false) {
24
                return false;
25
            }
26
27
            foreach ($rule as $item) {
28
                foreach ($item as $itemData) {
29
                    if (\is_array($itemData) === false) {
30
                        return false;
31
                    }
32
33
                    if ($this->validateValueKeys($itemData) === false) {
34
                        return false;
35
                    }
36
                }
37
            }
38
        }
39
40
        return true;
41
    }
42
43
    /**
44
     * Validates all available root keys
45
     *
46
     * @param array $rules
47
     *
48
     * @return bool
49
     */
50
    public function validateRootKeys(array $rules) : bool
51
    {
52
        $availableKeys = Petrovich\Ruleset::getAvailableRootKeys();
53
54
        foreach (\array_keys($rules) as $key) {
55
            if (\in_array($key, $availableKeys, true) === false) {
56
                return false;
57
            }
58
        }
59
60
        return true;
61
    }
62
63
    public function validateSecondKeys(array $rule) : bool
64
    {
65
        $availableKeys = Petrovich\Ruleset::getAvailableSecondKeys();
66
67
        foreach (\array_keys($rule) as $ruleSecondKey) {
68
            if (\in_array($ruleSecondKey, $availableKeys, true) === false) {
69
                return false;
70
            }
71
        }
72
73
        return true;
74
    }
75
76
    public function validateValueKeys(array $rule) : bool
77
    {
78
        $availableKeys = Petrovich\Ruleset::getAvailableValueKeys();
79
80
        foreach (\array_keys($rule) as $ruleValueKey) {
81
            if (\in_array($ruleValueKey, $availableKeys, true) === false) {
82
                return false;
83
            }
84
        }
85
86
        return
87
            $this->validateValueKeyTest($rule) === true
88
            &&
89
            $this->validateValueKeyMods($rule) === true
90
            &&
91
            $this->validateValueKeyTags($rule) === true
92
            &&
93
            $this->validateValueKeyGender($rule) === true
94
        ;
95
    }
96
97
    public function validateValueKeyTest(array $rule) : bool
98
    {
99
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_TEST, $rule) === false) {
100
            return true;
101
        }
102
103
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_TEST]) === false) {
104
            return false;
105
        }
106
107
        return true;
108
    }
109
110
    public function validateValueKeyMods(array $rule) : bool
111
    {
112
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_MODS, $rule) === false) {
113
            return true;
114
        }
115
116
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_MODS]) === false) {
117
            return false;
118
        }
119
120
        return true;
121
    }
122
123
    public function validateValueKeyTags(array $rule) : bool
124
    {
125
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_TAGS, $rule) === false) {
126
            return true;
127
        }
128
129
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_TAGS]) === false) {
130
            return false;
131
        }
132
133
        return true;
134
    }
135
136
    public function validateValueKeyGender(array $rule) : bool
137
    {
138
        $availableGenders = Petrovich\Ruleset::getAvailableGenders();
139
140
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_GENDER, $rule) === false) {
141
            return true;
142
        }
143
144
        if (\is_string($rule[Petrovich\Ruleset::VALUE_KEY_GENDER]) === false) {
145
            return false;
146
        }
147
148
        if (\in_array($rule[Petrovich\Ruleset::VALUE_KEY_GENDER], $availableGenders) === false) {
149
            return false;
150
        }
151
152
        return true;
153
    }
154
}
155