1 | <?php declare(strict_types=1); |
||
0 ignored issues
–
show
Coding Style
introduced
by
![]() |
|||
2 | /** |
||
0 ignored issues
–
show
|
|||
3 | * This file is part of the php-state project. |
||
4 | * |
||
5 | * (c) Yannick Voyer <[email protected]> (http://github.com/yvoyer) |
||
6 | */ |
||
0 ignored issues
–
show
|
|||
7 | |||
8 | namespace Star\Component\State; |
||
9 | |||
10 | use Star\Component\State\Transitions\ReadOnlyTransition; |
||
11 | |||
12 | final class TransitionRegistry implements StateRegistry |
||
0 ignored issues
–
show
|
|||
13 | { |
||
0 ignored issues
–
show
|
|||
14 | /** |
||
0 ignored issues
–
show
|
|||
15 | * @var array[] Collection of states indexed by transition name |
||
16 | */ |
||
17 | private $transitions = []; |
||
0 ignored issues
–
show
|
|||
18 | |||
19 | /** |
||
0 ignored issues
–
show
|
|||
20 | * @var array[] Collection of attributes indexed by state name |
||
21 | */ |
||
22 | private $states = []; |
||
0 ignored issues
–
show
|
|||
23 | |||
24 | /** |
||
0 ignored issues
–
show
|
|||
25 | * @param StateTransition $transition |
||
0 ignored issues
–
show
|
|||
26 | */ |
||
0 ignored issues
–
show
|
|||
27 | 47 | public function addTransition(StateTransition $transition): void |
|
0 ignored issues
–
show
|
|||
28 | { |
||
0 ignored issues
–
show
|
|||
29 | 47 | $name = $transition->getName(); |
|
30 | 47 | if (isset($this->transitions[$name])) { |
|
31 | 1 | throw DuplicateEntryException::duplicateTransition($name); |
|
32 | } |
||
33 | |||
34 | 47 | $transition->onRegister($this); |
|
35 | 47 | } |
|
0 ignored issues
–
show
|
|||
36 | |||
37 | /** |
||
0 ignored issues
–
show
|
|||
38 | * @param string $name The transition name |
||
0 ignored issues
–
show
|
|||
39 | * |
||
40 | * @return StateTransition |
||
41 | * @throws NotFoundException |
||
0 ignored issues
–
show
|
|||
42 | */ |
||
43 | 32 | public function getTransition(string $name): StateTransition |
|
44 | { |
||
0 ignored issues
–
show
|
|||
45 | 32 | $transition = null; |
|
0 ignored issues
–
show
|
|||
46 | 32 | if (isset($this->transitions[$name]['to'])) { |
|
47 | 30 | $transition = new ReadOnlyTransition($this->transitions[$name]['to']); |
|
48 | } |
||
49 | |||
50 | 32 | if (! $transition) { |
|
51 | 2 | throw NotFoundException::transitionNotFound($name); |
|
52 | } |
||
53 | |||
54 | 30 | return $transition; |
|
55 | } |
||
0 ignored issues
–
show
|
|||
56 | |||
57 | 35 | public function addAttribute(string $state, string $attribute): void |
|
0 ignored issues
–
show
|
|||
58 | { |
||
0 ignored issues
–
show
|
|||
59 | 35 | $attributes = [$attribute]; |
|
0 ignored issues
–
show
|
|||
60 | 35 | if ($this->hasState($state)) { |
|
61 | 35 | $attributes = \array_merge($this->states[$state], $attributes); |
|
62 | } |
||
63 | |||
64 | 35 | $this->states[$state] = \array_unique($attributes); |
|
65 | 35 | } |
|
0 ignored issues
–
show
|
|||
66 | |||
67 | /** |
||
0 ignored issues
–
show
|
|||
68 | * @param string $state |
||
0 ignored issues
–
show
|
|||
69 | * @param string[] $attributes |
||
0 ignored issues
–
show
|
|||
70 | */ |
||
0 ignored issues
–
show
|
|||
71 | 52 | private function addAttributes(string $state, array $attributes): void |
|
0 ignored issues
–
show
|
|||
72 | { |
||
0 ignored issues
–
show
|
|||
73 | 52 | \array_map( |
|
74 | function ($attribute) use ($state) { |
||
75 | 3 | $this->addAttribute($state, $attribute); |
|
76 | 52 | }, |
|
77 | 52 | $attributes |
|
78 | ); |
||
79 | 52 | } |
|
0 ignored issues
–
show
|
|||
80 | |||
81 | 30 | public function transitionStartsFrom(string $transition, string $state): bool |
|
0 ignored issues
–
show
|
|||
82 | { |
||
0 ignored issues
–
show
|
|||
83 | 30 | $from = []; |
|
0 ignored issues
–
show
|
|||
84 | 30 | if (isset($this->transitions[$transition]['from'])) { |
|
85 | 30 | $from = $this->transitions[$transition]['from']; |
|
86 | } |
||
87 | |||
88 | 30 | return \in_array($state, $from, true); |
|
0 ignored issues
–
show
|
|||
89 | } |
||
0 ignored issues
–
show
|
|||
90 | |||
91 | 10 | public function hasAttribute(string $state, string $attribute): bool |
|
0 ignored issues
–
show
|
|||
92 | { |
||
0 ignored issues
–
show
|
|||
93 | 10 | if (! $this->hasState($state)) { |
|
94 | return false; |
||
0 ignored issues
–
show
|
|||
95 | } |
||
96 | |||
97 | 10 | return \in_array($attribute, $this->states[$state]); |
|
98 | } |
||
0 ignored issues
–
show
|
|||
99 | |||
100 | 54 | public function hasState(string $name): bool |
|
0 ignored issues
–
show
|
|||
101 | { |
||
0 ignored issues
–
show
|
|||
102 | 54 | return \array_key_exists($name, $this->states); |
|
103 | } |
||
0 ignored issues
–
show
|
|||
104 | |||
105 | 3 | public function acceptTransitionVisitor(TransitionVisitor $visitor): void |
|
0 ignored issues
–
show
|
|||
106 | { |
||
0 ignored issues
–
show
|
|||
107 | 3 | foreach ($this->transitions as $transition => $states) { |
|
108 | 3 | $visitor->visitTransition($transition); |
|
109 | |||
110 | 3 | foreach ($states['from'] as $from) { |
|
111 | 3 | $visitor->visitFromState($from, $this->states[$from]); |
|
112 | } |
||
113 | 3 | $visitor->visitToState($states['to'], $this->states[$states['to']]); |
|
114 | } |
||
115 | 3 | } |
|
0 ignored issues
–
show
|
|||
116 | |||
117 | 2 | public function acceptStateVisitor(StateVisitor $visitor): void |
|
0 ignored issues
–
show
|
|||
118 | { |
||
0 ignored issues
–
show
|
|||
119 | 2 | foreach ($this->states as $state => $attributes) { |
|
120 | 2 | $visitor->visitState($state, $attributes); |
|
121 | } |
||
122 | 2 | } |
|
0 ignored issues
–
show
|
|||
123 | |||
124 | /** |
||
0 ignored issues
–
show
|
|||
125 | * @param string $transition |
||
0 ignored issues
–
show
|
|||
126 | * @param string $stateName |
||
0 ignored issues
–
show
|
|||
127 | * @param string[] $attributes |
||
0 ignored issues
–
show
|
|||
128 | */ |
||
0 ignored issues
–
show
|
|||
129 | 52 | public function registerStartingState(string $transition, string $stateName, array $attributes = []): void |
|
0 ignored issues
–
show
|
|||
130 | { |
||
0 ignored issues
–
show
|
|||
131 | 52 | $this->initState($stateName); |
|
132 | 52 | $this->addAttributes($stateName, $attributes); |
|
133 | 52 | $this->transitions[$transition]['from'][] = $stateName; |
|
134 | 52 | } |
|
0 ignored issues
–
show
|
|||
135 | |||
136 | /** |
||
0 ignored issues
–
show
|
|||
137 | * @param string $transition |
||
0 ignored issues
–
show
|
|||
138 | * @param string $stateName |
||
0 ignored issues
–
show
|
|||
139 | * @param string[] $attributes |
||
0 ignored issues
–
show
|
|||
140 | */ |
||
0 ignored issues
–
show
|
|||
141 | 48 | public function registerDestinationState(string $transition, string $stateName, array $attributes = []): void |
|
0 ignored issues
–
show
|
|||
142 | { |
||
0 ignored issues
–
show
|
|||
143 | 48 | $this->initState($stateName); |
|
144 | 48 | $this->addAttributes($stateName, $attributes); |
|
145 | 48 | $this->transitions[$transition]['to'] = $stateName; |
|
146 | 48 | } |
|
0 ignored issues
–
show
|
|||
147 | |||
148 | /** |
||
0 ignored issues
–
show
|
|||
149 | * @param string $state |
||
0 ignored issues
–
show
|
|||
150 | */ |
||
0 ignored issues
–
show
|
|||
151 | 52 | private function initState(string $state): void |
|
0 ignored issues
–
show
|
|||
152 | { |
||
0 ignored issues
–
show
|
|||
153 | 52 | if (!$this->hasState($state)) { |
|
0 ignored issues
–
show
|
|||
154 | 52 | $this->states[$state] = []; |
|
0 ignored issues
–
show
|
|||
155 | } |
||
156 | 52 | } |
|
0 ignored issues
–
show
|
|||
157 | } |
||
0 ignored issues
–
show
|
|||
158 |