Validator::validateRootKeys()   A
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 19
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 19
rs 9.9666
cc 4
nc 5
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
        $isFoundAnyAvailableKeys = false;
55
56
        foreach (\array_keys($rules) as $key) {
57
            if (\in_array($key, $availableKeys, true) === false) {
58
                return false;
59
            }
60
61
            $isFoundAnyAvailableKeys = true;
62
        }
63
64
        if ($isFoundAnyAvailableKeys === false) {
65
            return false;
66
        }
67
68
        return true;
69
    }
70
71
    public function validateSecondKeys(array $rule) : bool
72
    {
73
        $availableKeys = Petrovich\Ruleset::getAvailableSecondKeys();
74
75
        foreach (\array_keys($rule) as $ruleSecondKey) {
76
            if (\in_array($ruleSecondKey, $availableKeys, true) === false) {
77
                return false;
78
            }
79
        }
80
81
        return true;
82
    }
83
84
    public function validateValueKeys(array $rule) : bool
85
    {
86
        $availableKeys = Petrovich\Ruleset::getAvailableValueKeys();
87
88
        foreach (\array_keys($rule) as $ruleValueKey) {
89
            if (\in_array($ruleValueKey, $availableKeys, true) === false) {
90
                return false;
91
            }
92
        }
93
94
        return
95
            $this->validateValueKeyTest($rule) === true
96
            &&
97
            $this->validateValueKeyMods($rule) === true
98
            &&
99
            $this->validateValueKeyTags($rule) === true
100
            &&
101
            $this->validateValueKeyGender($rule) === true
102
        ;
103
    }
104
105
    public function validateValueKeyTest(array $rule) : bool
106
    {
107
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_TEST, $rule) === false) {
108
            return true;
109
        }
110
111
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_TEST]) === false) {
112
            return false;
113
        }
114
115
        return true;
116
    }
117
118
    public function validateValueKeyMods(array $rule) : bool
119
    {
120
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_MODS, $rule) === false) {
121
            return true;
122
        }
123
124
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_MODS]) === false) {
125
            return false;
126
        }
127
128
        return true;
129
    }
130
131
    public function validateValueKeyTags(array $rule) : bool
132
    {
133
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_TAGS, $rule) === false) {
134
            return true;
135
        }
136
137
        if (\is_array($rule[Petrovich\Ruleset::VALUE_KEY_TAGS]) === false) {
138
            return false;
139
        }
140
141
        return true;
142
    }
143
144
    public function validateValueKeyGender(array $rule) : bool
145
    {
146
        $availableGenders = Petrovich\Ruleset::getAvailableGenders();
147
148
        if (\array_key_exists(Petrovich\Ruleset::VALUE_KEY_GENDER, $rule) === false) {
149
            return true;
150
        }
151
152
        if (\is_string($rule[Petrovich\Ruleset::VALUE_KEY_GENDER]) === false) {
153
            return false;
154
        }
155
156
        if (\in_array($rule[Petrovich\Ruleset::VALUE_KEY_GENDER], $availableGenders) === false) {
157
            return false;
158
        }
159
160
        return true;
161
    }
162
}
163