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