Completed
Push — master ( 759e75...59dba5 )
by Shane
02:24
created

ValueParser::valueIsNull()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace PhpHocon\Token\Parser;
4
5
use PhpHocon\Token\Tokens;
6
use PhpHocon\Token\Value;
7
use PhpHocon\Token\Value\BooleanValue;
8
use PhpHocon\Token\Value\NullValue;
9
use PhpHocon\Token\Value\NumberValue;
10
use PhpHocon\Token\Value\StringValue;
11
12
class ValueParser implements Parser
13
{
14
    /**
15
     * @var array
16
     */
17
    private $illegalCharacters = [
18
        Tokens::EQUALS,
19
        Tokens::COLON,
20
        Tokens::SPACE,
21
        Tokens::NEW_LINE
22
    ];
23
24
    /**
25
     * @var bool
26
     */
27
    private $isQuotedString;
28
29
    /**
30
     * @var string
31
     */
32
    private $quoteCharacter;
33
34
    /**
35
     * @param ParserState $state
36
     * @return boolean
37
     */
38
    public function canParse(ParserState $state)
39
    {
40
        return !$state->isParsingKey() && $this->canStartGatheringValue($state);
41
    }
42
43
    /**
44
     * @param ParserState $state
45
     * @return ParseResult
46
     */
47
    public function parse(ParserState $state)
48
    {
49
        $characters = $state->getCharacters();
50
        $value = '';
51
52
        if (true === $this->isQuotedString = $this->isQuotedString($state->getHeadCharacter())) {
53
            $this->quoteCharacter = array_shift($characters);
54
        }
55
56
        while ($this->canStillParseValue($characters)) {
57
            $value .= array_shift($characters);
58
        }
59
60
        if (count($characters) && $characters[0] === $this->quoteCharacter) {
61
            array_shift($characters);
62
        }
63
64
        return new ParseResult(
65
            new ParserState($characters, $state->getBraceCount()),
66
            $this->getObjectForValue($value)
67
        );
68
    }
69
70
    /**
71
     * @param ParserState $state
72
     * @return bool
73
     */
74
    private function canStartGatheringValue(ParserState $state)
75
    {
76
        return !in_array($state->getHeadCharacter(), $this->illegalCharacters);
77
    }
78
79
    /**
80
     * @param string $character
81
     * @return bool
82
     */
83
    private function isQuotedString($character)
84
    {
85
        return in_array($character, [Tokens::APOSTROPHE, Tokens::SPEECH_MARK]);
86
    }
87
88
    /**
89
     * @param string[] $characters
90
     * @return bool
91
     */
92
    private function canStillParseValue(array $characters)
93
    {
94
        if (!count($characters)) {
95
            return false;
96
        }
97
98
        if ($this->isQuotedString && $characters[0] !== $this->quoteCharacter) {
99
            return true;
100
        }
101
102
        if ($this->isQuotedString && $characters[0] === $this->quoteCharacter) {
103
            return false;
104
        }
105
106
        return !in_array($characters[0], $this->illegalCharacters);
107
    }
108
109
    /**
110
     * @param string $value
111
     * @return Value
112
     */
113
    private function getObjectForValue($value)
114
    {
115
        if (is_numeric($value)) {
116
            return new NumberValue($this->convertStringToNumber($value));
117
        } elseif ($this->valueIsBoolean($value)) {
118
            return new BooleanValue($value === 'true');
119
        } elseif ($this->valueIsNull($value)) {
120
            return new NullValue();
121
        }
122
123
        return new StringValue($value);
124
    }
125
126
    /**
127
     * @param string $value
128
     * @return float|int
129
     */
130
    private function convertStringToNumber($value)
131
    {
132
        return strpos($value, '.') === false ? (int)$value : (float)$value;
133
    }
134
135
    /**
136
     * @param string $value
137
     * @return bool
138
     */
139
    private function valueIsBoolean($value)
140
    {
141
        return $value === 'true' || $value === 'false';
142
    }
143
144
    /**
145
     * @param string $value
146
     * @return bool
147
     */
148
    private function valueIsNull($value)
149
    {
150
        return $value === 'null';
151
    }
152
}
153