-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
StubAssembler.php
137 lines (116 loc) · 3 KB
/
StubAssembler.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
namespace Cerbero\LaravelEnum;
/**
* The stub assembler.
*
*/
class StubAssembler
{
use ExportsValues;
/**
* The stub to assemble.
*
* @var string
*/
protected $stub;
/**
* The list of enum definitions.
*
* @var array
*/
protected $enums;
/**
* Set the dependencies.
*
* @param string $stub
* @param array $enums
*/
public function __construct(string $stub, array $enums)
{
$this->stub = $stub;
$this->enums = $enums;
}
/**
* Retrieve the stub
*
* @return string
*/
public function getStub() : string
{
return $this->stub;
}
/**
* Replace the PHPDoc method tags for the given stub
*
* @return self
*/
public function replaceMethodTags() : self
{
$methods = array_map(function (EnumDefinition $enum) {
return " * @method static self {$enum->name}()";
}, $this->enums);
$this->stub = str_replace('DummyMethodTags', implode(PHP_EOL, $methods), $this->stub);
return $this;
}
/**
* Replace the constants for the given stub
*
* @return self
*/
public function replaceConstants() : self
{
$padding = 4;
$constants = array_map(function (EnumDefinition $enum) use ($padding) {
$key = $this->export($enum->key, $padding);
return str_repeat(' ', $padding) . "const {$enum->name} = {$key};";
}, $this->enums);
$this->stub = str_replace('DummyConstants', implode(PHP_EOL, $constants), $this->stub);
return $this;
}
/**
* Replace the map for the given stub
*
* @return self
*/
public function replaceMap() : self
{
// Map enums key and value pairs only if enums have values
if ($this->enumsHaveValues()) {
$mapStub = file_get_contents(__DIR__ . '/../stubs/map.stub');
$this->stub = str_replace('DummyMap', $mapStub, $this->stub);
$this->replaceMapPairs();
} else {
$this->stub = str_replace('DummyMap', '', $this->stub);
}
return $this;
}
/**
* Determine whether the given enums contain values
*
* @return bool
*/
private function enumsHaveValues() : bool
{
foreach ($this->enums as $enum) {
if ($enum->value !== null) {
return true;
}
}
return false;
}
/**
* Replace the enums key and value pairs
*
* @return self
*/
public function replaceMapPairs() : self
{
$padding = 12;
$pairs = array_map(function (EnumDefinition $enum) use ($padding) {
$value = $this->export($enum->value, $padding);
return str_repeat(' ', $padding) . "static::{$enum->name} => {$value},";
}, $this->enums);
$this->stub = str_replace('DummyKeyValuePairs', implode(PHP_EOL, $pairs), $this->stub);
return $this;
}
}