Test Failed
Pull Request — master (#119)
by Alexander
02:19
created

Subset   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 23
dl 0
loc 54
rs 10
c 2
b 0
f 0
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A strict() 0 5 1
A validateValue() 0 16 3
A __construct() 0 3 1
A getOptions() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Rule;
6
7
use Yiisoft\Arrays\ArrayHelper;
8
use Yiisoft\Validator\Result;
9
use Yiisoft\Validator\Rule;
10
use Yiisoft\Validator\ValidationContext;
11
12
class Subset extends Rule
13
{
14
    /**
15
     * @var iterable
16
     */
17
    private iterable $values;
18
    /**
19
     * @var bool whether the comparison is strict (both type and value must be the same)
20
     */
21
    private bool $strict = false;
22
23
    private string $iterableMessage = 'Value must be iterable';
24
25
    private string $subsetMessage = 'Values must be ones of {values}.';
26
27
    public function __construct(iterable $values)
28
    {
29
        $this->values = $values;
30
    }
31
32
    protected function validateValue($value, ValidationContext $context = null): Result
33
    {
34
        $result = new Result();
35
36
        if (!is_iterable($value)) {
37
            $result->addError($this->formatMessage($this->iterableMessage));
38
            return $result;
39
        }
40
41
        if (!ArrayHelper::isSubset($value, $this->values, $this->strict)) {
42
            $result->addError($this->formatMessage($this->subsetMessage, [
43
                'values' => '"' . implode('", "', iterator_to_array($this->values)) . '"',
44
            ]));
45
        }
46
47
        return $result;
48
    }
49
50
    public function strict(): self
51
    {
52
        $new = clone $this;
53
        $new->strict = true;
54
        return $new;
55
    }
56
57
    public function getOptions(): array
58
    {
59
        return array_merge(
60
            parent::getOptions(),
61
            [
62
                'iterableMessage' => $this->formatMessage($this->iterableMessage),
63
                'subsetMessage' => $this->formatMessage($this->subsetMessage),
64
                'values' => $this->values,
65
                'strict' => $this->strict,
66
            ],
67
        );
68
    }
69
}
70