Passed
Pull Request — master (#58)
by Dmitriy
13:13 queued 10:22
created

TemplateRuleHandler::validate()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 33
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 16.6682

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 6
eloc 20
c 1
b 0
f 0
nc 6
nop 3
dl 0
loc 33
ccs 6
cts 18
cp 0.3333
crap 16.6682
rs 8.9777
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Gii\Validator;
6
7
use Yiisoft\Aliases\Aliases;
8
use Yiisoft\Validator\Exception\UnexpectedRuleException;
9
use Yiisoft\Validator\Result;
10
use Yiisoft\Validator\RuleHandlerInterface;
11
use Yiisoft\Validator\ValidationContext;
12
use Yiisoft\Yii\Gii\GiiParametersProvider;
13
14
final class TemplateRuleHandler implements RuleHandlerInterface
15
{
16 2
    public function __construct(
17
        private Aliases $aliases,
18
        private GiiParametersProvider $parametersProvider,
19
    ) {
20
    }
21
22
    /**
23
     * Validates the template selection.
24
     * This method validates whether the user selects an existing template
25
     * and the template contains all required template files as specified in {@see requiredTemplates()}.
26
     *
27
     * @param string $value
28
     */
29 2
    public function validate(mixed $value, object $rule, ValidationContext $context): Result
30
    {
31 2
        if (!$rule instanceof TemplateRule) {
32
            throw new UnexpectedRuleException(TemplateRule::class, $rule);
33
        }
34
35 2
        $result = new Result();
36 2
        $templates = $this->parametersProvider->getTemplates();
37 2
        if ($templates === []) {
38 2
            return $result;
39
        }
40
        if (!isset($templates[$value])) {
41
            $result->addError(
42
                message: 'Template "{template}" does not exist. Known templates: {templates}',
43
                parameters: [
44
                    'template' => $value,
45
                    'templates' => implode(', ', array_keys($templates)),
46
                ],
47
            );
48
            return $result;
49
        }
50
51
        $templatePath = $templates[$value];
52
        foreach ($this->parametersProvider->getRequiredTemplates() as $template) {
53
            if (!is_file($this->aliases->get($templatePath . '/' . $template))) {
54
                $result->addError(
55
                    message: 'Unable to find the required code template file "{template}".',
56
                    parameters: ['template' => $template],
57
                );
58
            }
59
        }
60
61
        return $result;
62
    }
63
}
64