Completed
Push — master ( f07a36...bb0ee0 )
by Nico
01:44
created

TokenFactory::buildTokenCollection()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 9.9332
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php declare(strict_types=1);
2
3
/**
4
 * @license     http://opensource.org/licenses/mit-license.php MIT
5
 * @link        https://github.com/nicoSWD
6
 * @author      Nicolas Oelgart <[email protected]>
7
 */
8
namespace nicoSWD\Rule\TokenStream\Token;
9
10
use nicoSWD\Rule\Parser\Exception\ParserException;
11
use nicoSWD\Rule\TokenStream\TokenCollection;
12
13
class TokenFactory
14
{
15
    private $tokenMap = [
16
        Token::AND                 => TokenAnd::class,
17
        Token::OR                  => TokenOr::class,
18
        Token::NOT_EQUAL_STRICT    => TokenNotEqualStrict::class,
19
        Token::NOT_EQUAL           => TokenNotEqual::class,
20
        Token::EQUAL_STRICT        => TokenEqualStrict::class,
21
        Token::EQUAL               => TokenEqual::class,
22
        Token::IN                  => TokenIn::class,
23
        Token::BOOL                => TokenBool::class,
24
        Token::NULL                => TokenNull::class,
25
        Token::METHOD              => TokenMethod::class,
26
        Token::FUNCTION            => TokenFunction::class,
27
        Token::VARIABLE            => TokenVariable::class,
28
        Token::FLOAT               => TokenFloat::class,
29
        Token::INTEGER             => TokenInteger::class,
30
        Token::ENCAPSED_STRING     => TokenEncapsedString::class,
31
        Token::SMALLER_EQUAL       => TokenSmallerEqual::class,
32
        Token::GREATER_EQUAL       => TokenGreaterEqual::class,
33
        Token::SMALLER             => TokenSmaller::class,
34
        Token::GREATER             => TokenGreater::class,
35
        Token::OPENING_PARENTHESIS => TokenOpeningParenthesis::class,
36
        Token::CLOSING_PARENTHESIS => TokenClosingParenthesis::class,
37
        Token::OPENING_ARRAY       => TokenOpeningArray::class,
38
        Token::CLOSING_ARRAY       => TokenClosingArray::class,
39
        Token::COMMA               => TokenComma::class,
40
        Token::REGEX               => TokenRegex::class,
41
        Token::COMMENT             => TokenComment::class,
42
        Token::NEWLINE             => TokenNewline::class,
43
        Token::SPACE               => TokenSpace::class,
44
        Token::UNKNOWN             => TokenUnknown::class,
45
    ];
46
47 92
    public function createFromPHPType($value): BaseToken
48
    {
49 92
        switch ($type = gettype($value)) {
50 92
            case 'string':
51 76
                return new TokenString($value);
52 44
            case 'integer':
53 26
                return new TokenInteger($value);
54 26
            case 'boolean':
55 8
                return new TokenBool($value);
56 24
            case 'NULL':
57 4
                return new TokenNull($value);
58 22
            case 'double':
59 6
                return new TokenFloat($value);
60 18
            case 'array':
61 14
                return $this->buildTokenCollection($value);
62 4
            case 'object':
63 2
                return new TokenObject($value);
64
            default:
65 2
                throw new ParserException(sprintf(
66 2
                    'Unsupported PHP type: "%s"',
67 2
                    $type
68
                ));
69
        }
70
    }
71
72 230
    public function createFromTokenName(string $tokenName): string
73
    {
74 230
        if (!isset($this->tokenMap[$tokenName])) {
75 2
            throw new \InvalidArgumentException("Unknown token $tokenName");
76
        }
77
78 228
        return $this->tokenMap[$tokenName];
79
    }
80
81 14
    private function buildTokenCollection($value): TokenArray
82
    {
83 14
        $params = new TokenCollection();
84
85 14
        foreach ($value as $item) {
86 14
            $params->attach($this->createFromPHPType($item));
87
        }
88
89 14
        return new TokenArray($params);
90
    }
91
}
92