Test Failed
Pull Request — master (#222)
by Rustam
02:30
created

Nested::validateValue()   B

Complexity

Conditions 11
Paths 7

Size

Total Lines 39
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 11

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 11
eloc 23
nc 7
nop 2
dl 0
loc 39
ccs 24
cts 24
cp 1
crap 11
rs 7.3166
c 1
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Rule;
6
7
use Attribute;
8
use Closure;
9
use InvalidArgumentException;
10
use Traversable;
11
use Yiisoft\Validator\Rule\Trait\RuleNameTrait;
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_TRAIT, expecting T_STRING or '{' on line 11 at column 27
Loading history...
12
use Yiisoft\Validator\Rule\Trait\HandlerClassNameTrait;
13
use Yiisoft\Validator\ParametrizedRuleInterface;
14
use Yiisoft\Validator\RuleInterface;
15
use Yiisoft\Validator\RulesDumper;
16
use function is_array;
17
18
/**
19
 * Can be used for validation of nested structures.
20
 */
21
#[Attribute(Attribute::TARGET_PROPERTY)]
22
final class Nested implements ParametrizedRuleInterface
23
{
24
    use HandlerClassNameTrait;
25
    use RuleNameTrait;
26
27 18
    public function __construct(
28
        /**
29
         * @var RuleInterface[][]
30
         */
31
        private iterable $rules = [],
32
        private bool $errorWhenPropertyPathIsNotFound = false,
33
        private string $propertyPathIsNotFoundMessage = 'Property path "{path}" is not found.',
34
        private bool $skipOnEmpty = false,
35
        private bool $skipOnError = false,
36
        private ?Closure $when = null,
37
    ) {
38
        $rules = $rules instanceof Traversable ? iterator_to_array($rules) : $rules;
39 18
        if (empty($rules)) {
40
            throw new InvalidArgumentException('Rules must not be empty.');
41 18
        }
42 18
43 1
        if ($this->checkRules($rules)) {
44
            $message = sprintf('Each rule should be an instance of %s.', RuleInterface::class);
45
            throw new InvalidArgumentException($message);
46 17
        }
47 1
48 1
        $this->rules = $rules;
49
    }
50
51 16
    /**
52
     * @return iterable
53
     */
54 12
    public function getRules(): iterable
55
    {
56 12
        return $this->rules;
57 12
    }
58 1
59 1
    /**
60
     * @return bool
61 1
     */
62
    public function isErrorWhenPropertyPathIsNotFound(): bool
63
    {
64 11
        return $this->errorWhenPropertyPathIsNotFound;
65
    }
66 11
67 11
    /**
68 2
     * @return string
69 2
     */
70
    public function getPropertyPathIsNotFoundMessage(): string
71 2
    {
72
        return $this->propertyPathIsNotFoundMessage;
73
    }
74 9
75 9
    /**
76 9
     * @return bool
77 9
     */
78 9
    public function isSkipOnEmpty(): bool
79 3
    {
80
        return $this->skipOnEmpty;
81
    }
82 7
83 7
    /**
84 7
     * @return bool
85 4
     */
86
    public function isSkipOnError(): bool
87
    {
88 7
        return $this->skipOnError;
89
    }
90
91
    /**
92 11
     * @return Closure|null
93
     */
94
    public function getWhen(): ?Closure
95 17
    {
96
        return $this->when;
97 17
    }
98
99 17
    private function checkRules(array $rules): bool
100 17
    {
101
        return array_reduce(
102
            $rules,
103
            function (bool $carry, $rule) {
104
                return $carry || (is_array($rule) ? $this->checkRules($rule) : !$rule instanceof RuleInterface);
105
            },
106 2
            false
107
        );
108 2
    }
109
110
    public function getOptions(): array
111 2
    {
112
        return (new RulesDumper())->asArray($this->rules);
113 2
    }
114
}
115