Passed
Pull Request — master (#20)
by Nico
23:18 queued 08:20
created

TokenFactory   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 58
c 0
b 0
f 0
dl 0
loc 79
ccs 28
cts 28
cp 1
rs 10
wmc 12
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 InvalidArgumentException;
11
use nicoSWD\Rule\Parser\Exception\ParserException;
12
use nicoSWD\Rule\TokenStream\TokenCollection;
13
14
class TokenFactory
15
{
16
    /** @throws ParserException */
17
    public function createFromPHPType(mixed $value): BaseToken
18
    {
19
        return match (gettype($value)) {
20
            'string' => new TokenString($value),
21
            'integer' => new TokenInteger($value),
22
            'boolean' => TokenBool::fromBool($value),
23
            'NULL' => new TokenNull($value),
24
            'double' => new TokenFloat($value),
25
            'object' => new TokenObject($value),
26
            'array' => $this->buildTokenCollection($value),
27
            default => throw ParserException::unsupportedType(gettype($value))
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected T_THROW on line 27 at column 23
Loading history...
28
        };
29
    }
30
31
    public function createFromTokenName(string $tokenName): string
32
    {
33
        return match ($tokenName) {
34
            Token::AND => TokenAnd::class,
35
            Token::OR => TokenOr::class,
36
            Token::NOT_EQUAL_STRICT => TokenNotEqualStrict::class,
37
            Token::NOT_EQUAL => TokenNotEqual::class,
38
            Token::EQUAL_STRICT => TokenEqualStrict::class,
39
            Token::EQUAL => TokenEqual::class,
40
            Token::IN => TokenIn::class,
41
            Token::NOT_IN => TokenNotIn::class,
42
            Token::BOOL_TRUE => TokenBoolTrue::class,
43
            Token::BOOL_FALSE => TokenBoolFalse::class,
44
            Token::NULL => TokenNull::class,
45
            Token::METHOD => TokenMethod::class,
46
            Token::FUNCTION => TokenFunction::class,
47
            Token::VARIABLE => TokenVariable::class,
48
            Token::FLOAT => TokenFloat::class,
49 148
            Token::INTEGER => TokenInteger::class,
50
            Token::ENCAPSED_STRING => TokenEncapsedString::class,
51 148
            Token::SMALLER_EQUAL => TokenSmallerEqual::class,
52 148
            Token::GREATER_EQUAL => TokenGreaterEqual::class,
53 90
            Token::SMALLER => TokenSmaller::class,
54 94
            Token::GREATER => TokenGreater::class,
55 36
            Token::OPENING_PARENTHESIS => TokenOpeningParenthesis::class,
56 68
            Token::CLOSING_PARENTHESIS => TokenClosingParenthesis::class,
57 8
            Token::OPENING_ARRAY => TokenOpeningArray::class,
58 66
            Token::CLOSING_ARRAY => TokenClosingArray::class,
59 4
            Token::COMMA => TokenComma::class,
60 64
            Token::REGEX => TokenRegex::class,
61 6
            Token::COMMENT => TokenComment::class,
62 60
            Token::NEWLINE => TokenNewline::class,
63 16
            Token::SPACE => TokenSpace::class,
64 46
            Token::UNKNOWN => TokenUnknown::class,
65 44
            default => throw ParserException::unknownTokenName($tokenName)
66
        };
67 2
    }
68 2
69 2
    /** @throws ParserException */
70
    private function buildTokenCollection(array $items): TokenArray
71
    {
72
        $tokenCollection = new TokenCollection();
73
74 290
        foreach ($items as $item) {
75
            $tokenCollection->attach($this->createFromPHPType($item));
76 290
        }
77 2
78
        return new TokenArray($tokenCollection);
79
    }
80
}
81