This repository has been archived by the owner on Apr 13, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCaster.php
104 lines (95 loc) · 2.74 KB
/
Caster.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
namespace Wandu\Caster;
use Wandu\Caster\Caster\ArrayCaster;
use Wandu\Caster\Caster\BooleanCatser;
use Wandu\Caster\Caster\FloatCaster;
use Wandu\Caster\Caster\IntegerCaster;
use Wandu\Caster\Caster\StringCaster;
class Caster implements CastManagerInterface
{
/** @var \Wandu\Caster\CasterInterface[] */
protected $casters = [];
/**
* @param \Wandu\Caster\CasterInterface[] $casters
*/
public function __construct(array $casters = [])
{
$this->casters = $casters + $this->getDefaultCasters();
}
/**
* {@inheritdoc}
*/
public function addCaster(string $type, CasterInterface $caster)
{
$this->casters[$type] = $caster;
}
/**
* {@inheritdoc}
*/
public function cast($value, string $type)
{
$originType = $type;
if ($this->isNullable($type) && $value === null) {
return null;
}
$type = rtrim($type, '?'); // strip nullable
if ($this->isArrayable($type)) {
$type = substr($type, 0, -2); // strip []
return array_map(function ($item) use ($type) {
return $this->cast($item, $type);
}, $this->getCaster('[]', $originType)->cast($value));
}
return $this->getCaster($type, $originType)->cast($value);
}
/**
* @param string $type
* @param string $originType
* @return \Wandu\Caster\CasterInterface
*/
protected function getCaster(string $type, string $originType): CasterInterface
{
if (isset($this->casters[$type])) {
return $this->casters[$type];
}
throw new UnsupportTypeException($originType);
}
/**
* @param string $type
* @return bool
*/
protected function isArrayable($type): bool
{
return substr($type, -2) === '[]';
}
/**
* @param string $type
* @return bool
*/
protected function isNullable($type): bool
{
return substr($type, -1) === '?';
}
/**
* @return \Wandu\Caster\CasterInterface[]
*/
protected function getDefaultCasters()
{
$integerCaster = new IntegerCaster();
$floatCaster = new FloatCaster();
$booleanCaster = new BooleanCatser();
$arrayCaster = new ArrayCaster();
return [
'string' => new StringCaster(),
'int' => $integerCaster,
'integer' => $integerCaster,
'num' => $floatCaster,
'number' => $floatCaster,
'float' => $floatCaster,
'double' => $floatCaster,
'bool' => $booleanCaster,
'boolean' => $booleanCaster,
'array' => $arrayCaster,
'[]' => $arrayCaster, // special caster
];
}
}