Passed
Pull Request — master (#491)
by
unknown
02:41
created

BooleanValueHandler::validate()   B

Complexity

Conditions 7
Paths 10

Size

Total Lines 27
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 15
nc 10
nop 3
dl 0
loc 27
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Rule;
6
7
use Yiisoft\Validator\Exception\UnexpectedRuleException;
8
use Yiisoft\Validator\Result;
9
use Yiisoft\Validator\RuleHandlerInterface;
10
use Yiisoft\Validator\ValidationContext;
11
12
/**
13
 * A handler for {@see BooleanValue} rule.
14
 */
15
final class BooleanValueHandler implements RuleHandlerInterface
16
{
17
    public function validate(mixed $value, object $rule, ValidationContext $context): Result
18
    {
19
        if (!$rule instanceof BooleanValue) {
20
            throw new UnexpectedRuleException(BooleanValue::class, $rule);
21
        }
22
23
        if (!is_scalar($value)) {
24
            $parameters = $this->getCommonResultParameters($rule, $context);
25
            $parameters['type'] = get_debug_type($value);
26
27
            return (new Result())->addError($rule->getIncorrectInputMessage(), $parameters);
28
        }
29
30
        if ($rule->isStrict()) {
31
            $valid = $value === $rule->getTrueValue() || $value === $rule->getFalseValue();
32
        } else {
33
            $valid = $value == $rule->getTrueValue() || $value == $rule->getFalseValue();
34
        }
35
36
        if ($valid) {
37
            return new Result();
38
        }
39
40
        $parameters = $this->getCommonResultParameters($rule, $context);
41
        $parameters['value'] = $value;
42
43
        return (new Result())->addError($rule->getMessage(), $parameters);
44
    }
45
46
    /**
47
     * @param BooleanValue $rule A rule instance.
48
     * @param ValidationContext $context Validation context.
49
     *
50
     * @return array A mapping between attribute names and their values.
51
     * @psalm-return array<string,scalar|null>
52
     */
53
    private function getCommonResultParameters(BooleanValue $rule, ValidationContext $context): array
54
    {
55
        return [
56
            'attribute' => $context->getTranslatedAttribute(),
57
            'true' => $rule->getTrueValue() === true ? 'true' : $rule->getTrueValue(),
58
            'false' => $rule->getFalseValue() === false ? 'false' : $rule->getFalseValue(),
59
        ];
60
    }
61
}
62