PropertyConstraintsValidator::validateRule()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 3
nc 2
nop 2
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 2
rs 10
c 2
b 0
f 0
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of FlexPHP.
4
 *
5
 * (c) Freddie Gar <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace FlexPHP\Schema\Validators;
11
12
use FlexPHP\Schema\Constants\Rule;
13
use FlexPHP\Schema\Validators\Constraints\ActionConstraintValidator;
14
use FlexPHP\Schema\Validators\Constraints\BooleanConstraintValidator;
15
use FlexPHP\Schema\Validators\Constraints\EqualToConstraintValidator;
16
use FlexPHP\Schema\Validators\Constraints\FilterConstraintValidator;
17
use FlexPHP\Schema\Validators\Constraints\FkConstraintValidator;
18
use FlexPHP\Schema\Validators\Constraints\FormatConstraintValidator;
19
use FlexPHP\Schema\Validators\Constraints\MaxConstraintValidator;
20
use FlexPHP\Schema\Validators\Constraints\MinConstraintValidator;
21
use FlexPHP\Schema\Validators\Constraints\RangeConstraintValidator;
22
use Symfony\Component\Validator\Constraints\Choice;
23
use Symfony\Component\Validator\ConstraintViolationList;
24
use Symfony\Component\Validator\ConstraintViolationListInterface;
25
use Symfony\Component\Validator\Validation;
26
27
/**
28
 * @Annotation
29
 */
30
class PropertyConstraintsValidator
31
{
32
    public const ALLOWED_RULES = [
33
        Rule::REQUIRED,
34
        Rule::MINLENGTH,
35
        Rule::MAXLENGTH,
36
        Rule::LENGTH,
37
        Rule::MINCHECK,
38
        Rule::MAXCHECK,
39
        Rule::CHECK,
40
        Rule::MIN,
41
        Rule::MAX,
42
        Rule::EQUALTO,
43
        Rule::TYPE,
44
        Rule::PRIMARYKEY,
45
        Rule::FOREIGNKEY,
46
        Rule::AUTOINCREMENT,
47
        Rule::CREATEDAT,
48
        Rule::UPDATEDAT,
49
        Rule::CREATEDBY,
50
        Rule::UPDATEDBY,
51
        Rule::FILTER,
52
        Rule::FORMAT,
53
        Rule::TRIM,
54
        Rule::FCHARS,
55
        Rule::FKCHECK,
56
        Rule::LINK,
57
        Rule::SHOW,
58
        Rule::HIDE,
59
        Rule::DEFAULT,
60
    ];
61
62
    private array $validators = [
63
        Rule::REQUIRED => BooleanConstraintValidator::class,
64
        Rule::MAX => MaxConstraintValidator::class,
65
        Rule::MAXLENGTH => MaxConstraintValidator::class,
66
        Rule::MAXCHECK => MaxConstraintValidator::class,
67
        Rule::MIN => MinConstraintValidator::class,
68
        Rule::MINLENGTH => MinConstraintValidator::class,
69
        Rule::MINCHECK => MinConstraintValidator::class,
70
        Rule::EQUALTO => EqualToConstraintValidator::class,
71
        Rule::TYPE => PropertyTypeValidator::class,
72
        Rule::LENGTH => RangeConstraintValidator::class,
73
        Rule::CHECK => RangeConstraintValidator::class,
74
        Rule::PRIMARYKEY => BooleanConstraintValidator::class,
75
        Rule::FOREIGNKEY => FkConstraintValidator::class,
76
        Rule::AUTOINCREMENT => BooleanConstraintValidator::class,
77
        Rule::CREATEDAT => BooleanConstraintValidator::class,
78
        Rule::UPDATEDAT => BooleanConstraintValidator::class,
79
        Rule::CREATEDBY => BooleanConstraintValidator::class,
80
        Rule::UPDATEDBY => BooleanConstraintValidator::class,
81
        Rule::FILTER => FilterConstraintValidator::class,
82
        Rule::FORMAT => FormatConstraintValidator::class,
83
        Rule::TRIM => BooleanConstraintValidator::class,
84
        Rule::FCHARS => MinConstraintValidator::class,
85
        Rule::FKCHECK => BooleanConstraintValidator::class,
86
        Rule::LINK => BooleanConstraintValidator::class,
87
        Rule::SHOW => ActionConstraintValidator::class,
88
        Rule::HIDE => ActionConstraintValidator::class,
89
    ];
90
91
    /**
92
     * @param array<string, mixed> $constraints
93
     */
94 444
    public function validate(array $constraints): ConstraintViolationListInterface
95
    {
96 444
        $violations = new ConstraintViolationList();
97
98 444
        $validator = Validation::createValidator();
99
100 444
        foreach ($constraints as $rule => $options) {
101 415
            $errors = $validator->validate($rule, [
102 415
                new Choice([
103 415
                    'choices' => self::ALLOWED_RULES,
104 415
                    'message' => 'is not valid rule.',
105
                ]),
106
            ]);
107
108 415
            if (\count($errors) === 0) {
109 408
                $errors = $this->validateRule($rule, $options);
110
            }
111
112 415
            $violations->addAll($errors);
113
        }
114
115 444
        return $violations;
116
    }
117
118
    /**
119
     * @param mixed $options
120
     */
121 408
    private function validateRule(string $rule, $options): ConstraintViolationListInterface
122
    {
123 408
        if (!isset($this->validators[$rule])) {
124 20
            return new ConstraintViolationList;
125
        }
126
127 388
        return (new $this->validators[$rule])->validate($options);
128
    }
129
}
130