Completed
Branch master (aa8164)
by Tomáš
04:04
created

StandardsOptionResolver::setAllowedValues()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 19
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 11
cts 11
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 11
nc 1
nop 1
crap 3
1
<?php
2
3
/*
4
 * This file is part of Symplify
5
 * Copyright (c) 2016 Tomas Votruba (http://tomasvotruba.cz).
6
 */
7
8
namespace Symplify\PHP7_CodeSniffer\Configuration\OptionResolver;
9
10
use Symfony\Component\OptionsResolver\OptionsResolver;
11
use Symplify\PHP7_CodeSniffer\Configuration\ValueNormalizer;
12
use Symplify\PHP7_CodeSniffer\Contract\Configuration\OptionResolver\OptionResolverInterface;
13
use Symplify\PHP7_CodeSniffer\Exception\Configuration\StandardNotFoundException;
14
use Symplify\PHP7_CodeSniffer\Standard\StandardFinder;
15
16
final class StandardsOptionResolver implements OptionResolverInterface
17
{
18
    /**
19
     * @var string
20
     */
21
    const NAME = 'standards';
22
23
    /**
24
     * @var StandardFinder
25
     */
26
    private $standardFinder;
27
28 2
    public function __construct(StandardFinder $standardFinder)
29
    {
30 2
        $this->standardFinder = $standardFinder;
31 2
    }
32
33 2
    public function getName() : string
34
    {
35 2
        return self::NAME;
36
    }
37
38 2
    public function resolve(array $value) : array
39
    {
40 2
        $optionsResolver = new OptionsResolver();
41 2
        $optionsResolver->setDefined(self::NAME);
42 2
        $this->setNormalizers($optionsResolver);
43 2
        $this->setAllowedValues($optionsResolver);
44
45 2
        $values = $optionsResolver->resolve([
46 2
            self::NAME => $value
47
        ]);
48
49 1
        return $values[self::NAME];
50
    }
51
52 2
    private function setNormalizers(OptionsResolver $optionsResolver)
53
    {
54 2
        $optionsResolver->setNormalizer(
55 2
            self::NAME,
56
            function (OptionsResolver $optionsResolver, array $standardNames) {
57 1
                $standardNames = ValueNormalizer::normalizeCommaSeparatedValues($standardNames);
58 1
                return $this->standardFinder->getRulesetPathsForStandardNames($standardNames);
59 2
            }
60
        );
61 2
    }
62
63
    private function setAllowedValues(OptionsResolver $optionsResolver)
64
    {
65 2
        $optionsResolver->setAllowedValues(self::NAME, function (array $standards) {
66 2
            $standards = ValueNormalizer::normalizeCommaSeparatedValues($standards);
67
68 2
            $availableStandards = $this->standardFinder->getStandards();
69 2
            foreach ($standards as $standardName) {
70 2
                if (!array_key_exists($standardName, $availableStandards)) {
71 1
                    throw new StandardNotFoundException(sprintf(
72 1
                        'Standard "%s" is not supported. Pick one of: %s.',
73
                        $standardName,
74 2
                        implode(array_keys($availableStandards), ', ')
75
                    ));
76
                }
77
            }
78
79 1
            return true;
80 2
        });
81 2
    }
82
}
83