1 | <?php |
||
11 | class CodeDumper |
||
12 | { |
||
13 | 3 | public function dump(DefinitionGroup $definitionGroup, bool $withHelpers = true): string |
|
14 | { |
||
15 | 3 | $eventsCode = $this->dumpEvents($definitionGroup->events(), $withHelpers); |
|
16 | 3 | $commandCode = $this->dumpCommands($definitionGroup->commands()); |
|
17 | 3 | $namespace = $definitionGroup->namespace(); |
|
18 | |||
19 | return <<<EOF |
||
20 | <?php |
||
21 | |||
22 | 3 | namespace $namespace; |
|
23 | |||
24 | use EventSauce\\EventSourcing\\AggregateRootId; |
||
25 | use EventSauce\\EventSourcing\\Command; |
||
26 | use EventSauce\\EventSourcing\\Event; |
||
27 | use EventSauce\\EventSourcing\\PointInTime; |
||
28 | |||
29 | 3 | $eventsCode |
|
30 | 3 | $commandCode |
|
31 | EOF; |
||
32 | } |
||
33 | |||
34 | 3 | private function dumpEvents(array $events, bool $withHelpers): string |
|
35 | { |
||
36 | 3 | $code = []; |
|
37 | |||
38 | 3 | foreach ($events as $event) { |
|
39 | 3 | $name = $event->name(); |
|
40 | 3 | $fields = $this->dumpFields($event); |
|
41 | 3 | $constructor = $this->dumpEventConstructor($event); |
|
42 | 3 | $methods = $this->dumpMethods($event); |
|
43 | 3 | $deserializer = $this->dumpSerializationMethods($event); |
|
44 | 3 | $testHelpers = $withHelpers ? $this->dumpTestHelpers($event) : ''; |
|
45 | |||
46 | 3 | $code[] = <<<EOF |
|
47 | 3 | final class $name implements Event |
|
48 | { |
||
49 | 3 | $fields /** |
|
50 | * @var PointInTime |
||
51 | */ |
||
52 | private \$timeOfRecording; |
||
53 | |||
54 | 3 | $constructor$methods public function eventVersion(): int |
|
55 | { |
||
56 | 3 | return {$event->version()}; |
|
57 | } |
||
58 | |||
59 | public function timeOfRecording(): PointInTime |
||
60 | { |
||
61 | return \$this->timeOfRecording; |
||
62 | } |
||
63 | |||
64 | 3 | $deserializer |
|
65 | |||
66 | 3 | $testHelpers} |
|
67 | |||
68 | |||
69 | EOF; |
||
70 | } |
||
71 | |||
72 | 3 | return join('', $code); |
|
73 | } |
||
74 | |||
75 | 3 | private function dumpFields(DefinitionWithFields $definition): string |
|
105 | |||
106 | 3 | private function dumpEventConstructor(EventDefinition $event): string |
|
107 | { |
||
108 | 3 | $arguments = [' AggregateRootId $aggregateRootId', ' PointInTime $timeOfRecording']; |
|
109 | 3 | $assignments = [' $this->aggregateRootId = $aggregateRootId;', ' $this->timeOfRecording = $timeOfRecording;']; |
|
110 | |||
111 | 3 | foreach ($event->fields() as $field) { |
|
112 | 3 | $arguments[] = sprintf(' %s $%s', $field['type'], $field['name']); |
|
113 | 3 | $assignments[] = sprintf(' $this->%s = $%s;', $field['name'], $field['name']); |
|
114 | } |
||
115 | |||
116 | 3 | $arguments = join(",\n", $arguments); |
|
117 | 3 | $assignments = join("\n", $assignments); |
|
118 | |||
119 | |||
120 | |||
121 | return <<<EOF |
||
122 | public function __construct( |
||
123 | 3 | $arguments |
|
124 | ) { |
||
125 | 3 | $assignments |
|
126 | } |
||
127 | |||
128 | |||
129 | EOF; |
||
130 | |||
131 | } |
||
132 | |||
133 | 3 | private function dumpCommandConstructor(CommandDefinition $command): string |
|
134 | { |
||
135 | 3 | $arguments = [' AggregateRootId $aggregateRootId', ' PointInTime $timeOfRequest']; |
|
136 | 3 | $assignments = [' $this->aggregateRootId = $aggregateRootId;', ' $this->timeOfRequest = $timeOfRequest;']; |
|
137 | |||
138 | 3 | foreach ($command->fields() as $field) { |
|
139 | 3 | $arguments[] = sprintf(' %s $%s', $field['type'], $field['name']); |
|
140 | 3 | $assignments[] = sprintf(' $this->%s = $%s;', $field['name'], $field['name']); |
|
141 | } |
||
142 | |||
143 | 3 | $arguments = join(",\n", $arguments); |
|
144 | 3 | $assignments = join("\n", $assignments); |
|
145 | |||
146 | |||
147 | |||
148 | return <<<EOF |
||
149 | public function __construct( |
||
150 | 3 | $arguments |
|
151 | ) { |
||
152 | 3 | $assignments |
|
153 | } |
||
154 | |||
155 | EOF; |
||
156 | |||
157 | } |
||
158 | |||
159 | 3 | private function dumpMethods(DefinitionWithFields $command): string |
|
185 | |||
186 | 3 | private function dumpSerializationMethods(EventDefinition $event) |
|
187 | { |
||
188 | 3 | $name = $event->name(); |
|
189 | 3 | $arguments = []; |
|
237 | |||
238 | 2 | private function dumpTestHelpers(EventDefinition $event): string |
|
285 | |||
286 | 2 | private function dumpConstructorValue(array $field, EventDefinition $event): string |
|
299 | |||
300 | /** |
||
301 | * @param CommandDefinition[] $commands |
||
302 | * @return string |
||
303 | */ |
||
304 | 3 | private function dumpCommands(array $commands): string |
|
331 | } |