Completed
Push — develop ( d56149...badf6b )
by Andrea Marco
05:00
created

Parser::addNumericKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 6
ccs 4
cts 4
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Cerbero\LaravelEnum;
4
5
use Closure;
6
7
/**
8
 * The enums parser.
9
 *
10
 */
11
class Parser
12
{
13
    const SEPARATOR_ENUM = '|';
14
    const SEPARATOR_PART = '=';
15
16
    /**
17
     * Parse the enums definition
18
     *
19
     * @param string $definition
20
     * @param \Cerbero\LaravelEnum\Keys|null $keys
21
     * @return array
22
     */
23 48
    public function parseDefinition(string $definition, Keys $keys = null) : array
24
    {
25 48
        $resolveKeys = optional($keys)->value();
26 48
        $enums = explode(static::SEPARATOR_ENUM, $definition);
27
28
        return array_map(function (string $enum) use ($resolveKeys) {
29 48
            $parts = explode(static::SEPARATOR_PART, $enum);
30
31 48
            return $this->hydrateEnumDefinition($parts, $resolveKeys);
32 48
        }, $enums);
33
    }
34
35
    /**
36
     * Retrieve the hydrated enum definition
37
     *
38
     * @param array $parts
39
     * @param \Closure|null $resolveKeys
40
     * @return EnumDefinition
41
     */
42 48
    private function hydrateEnumDefinition(array $parts, Closure $resolveKeys = null) : EnumDefinition
43
    {
44 48
        $enum = new EnumDefinition;
45 48
        $enum->name = $parts[0];
46
47 48
        if ($resolveKeys) {
48 21
            $enum->key = $resolveKeys($parts[0]);
49 21
            $enum->value = isset($parts[2]) ? $this->parseValue($parts[2]) : $this->parseValue($parts[1] ?? null);
50
        } else {
51 27
            $enum->key = isset($parts[1]) ? $this->parseValue($parts[1]) : Keys::LOWER()->value()($parts[0]);
52 27
            $enum->value = $this->parseValue($parts[2] ?? null);
53
        }
54
55 48
        return $enum;
56
    }
57
58
    /**
59
     * Parse the given variable to retrieve its actual value
60
     *
61
     * @param mixed $value
62
     * @return mixed
63
     */
64 63
    public function parseValue($value)
65
    {
66 63
        if ($value === null || $value === '') {
67 33
            return null;
68
        }
69
70
        // Return floats, integers, booleans or arrays if possible
71 36
        if (null !== $decoded = json_decode($value, true)) {
72 30
            return $decoded;
73
        }
74
75 6
        return $value;
76
    }
77
}
78