Issues (1)

src/Loader/WinzouArrayLoader.php (1 issue)

Labels
Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Dflydev\FiniteStateMachine\Loader;
6
7
use Dflydev\FiniteStateMachine\Contracts\Loader;
8
use Dflydev\FiniteStateMachine\Graph\Graph;
9
use Dflydev\FiniteStateMachine\Graph\GraphResolver;
10
use Dflydev\FiniteStateMachine\Guard\Guard;
11
use Dflydev\FiniteStateMachine\Guard\GuardCallbackResolver;
12
use Dflydev\FiniteStateMachine\Guard\GuardCollection;
13
use Dflydev\FiniteStateMachine\State\State;
14
use Dflydev\FiniteStateMachine\State\StateCollection;
15
use Dflydev\FiniteStateMachine\Transition\Transition;
16
use Dflydev\FiniteStateMachine\Transition\TransitionCollection;
17
use Dflydev\FiniteStateMachine\TransitionEvent\TransitionEvent;
18
use Dflydev\FiniteStateMachine\TransitionEvent\TransitionEventCallbackResolver;
19
use Dflydev\FiniteStateMachine\TransitionEvent\TransitionEventCollection;
20
21
class WinzouArrayLoader implements Loader
22
{
23
    private GraphResolver $graphResolver;
24
    private GuardCallbackResolver $guardCallbackResolver;
25
    private TransitionEventCallbackResolver $transitionEventCallbackResolver;
26
27 21
    public function __construct(
28
        GraphResolver $graphResolver,
29
        ?GuardCallbackResolver $guardCallbackResolver = null,
30
        ?TransitionEventCallbackResolver $transitionEventCallbackResolver = null
31
    ) {
32 21
        $this->graphResolver = $graphResolver;
33 21
        $this->guardCallbackResolver = $guardCallbackResolver ?? new GuardCallbackResolver();
34 21
        $this->transitionEventCallbackResolver = $transitionEventCallbackResolver ?? new TransitionEventCallbackResolver();
35 21
    }
36
37 21
    public function load($resource): void
38
    {
39 21
        $stateCollection = new StateCollection();
40 21
        $transitionCollection = new TransitionCollection();
41 21
        $guardCollection = new GuardCollection();
42 21
        $transitionEventCollection = new TransitionEventCollection();
43
44 21
        foreach ($resource['transitions'] as $name => $transition) {
45 21
            $transitionCollection->add(new Transition(
46 21
                $name,
47 21
                $transition['to'],
48 21
                $transition['from'],
49 21
                $transition['metadata'] ?? []
50
            ));
51
        }
52
53 21
        foreach ($resource['states'] as $state) {
54 21
            $stateCollection->add(State::normalTyped(
55 21
                is_array($state) ? $state['name'] : $state,
56 21
                is_array($state) ? $state['metadata'] ?? [] : []
57
            ));
58
        }
59
60 21
        if (isset($resource['callbacks']['guard'])) {
61 21
            foreach ($resource['callbacks']['guard'] as $name => $setup) {
62 21
                $transitionNames = $setup['on'] ?? [];
63 21
                $fromStateNames = $setup['from'] ?? [];
64 21
                $toStateNames = $setup['to'] ?? [];
65 21
                $do = $setup['do'] ?? fn(): bool => false;
0 ignored issues
show
A parse error occurred: Syntax error, unexpected ':', expecting T_DOUBLE_ARROW on line 65 at column 42
Loading history...
66
67 21
                $guardCollection->add(new Guard(
68
                    $name,
69 21
                    is_array($transitionNames) ? $transitionNames : [$transitionNames],
70 21
                    is_array($fromStateNames) ? $fromStateNames : [$fromStateNames],
71 21
                    is_array($toStateNames) ? $toStateNames : [$toStateNames],
72 21
                    $this->guardCallbackResolver->resolve($do)
73
                ));
74
            }
75
        }
76
77 21
        foreach (['before', 'after'] as $when) {
78 21
            if (isset($resource['callbacks'][$when])) {
79 21
                foreach ($resource['callbacks'][$when] as $name => $setup) {
80 21
                    $transitionNames = $setup['on'] ?? [];
81 21
                    $fromStateNames = $setup['from'] ?? [];
82 21
                    $toStateNames = $setup['to'] ?? [];
83
                    $do = $setup['do'] ?? function (): void {
84 21
                    };
85
86 21
                    $transitionEventCollection->add(new TransitionEvent(
87
                        $when,
88
                        $name,
89 21
                        is_array($transitionNames) ? $transitionNames : [$transitionNames],
90 21
                        is_array($fromStateNames) ? $fromStateNames : [$fromStateNames],
91 21
                        is_array($toStateNames) ? $toStateNames : [$toStateNames],
92 21
                        $this->transitionEventCallbackResolver->resolve($do)
93
                    ));
94
                }
95
            }
96
        }
97
98 21
        $graph = new Graph(
99 21
            $resource['class'],
100 21
            $resource['graph'] ?? 'default',
101
            $resource,
102 21
            $resource['metadata'] ?? [],
103
            $stateCollection,
104
            $transitionCollection,
105
            $guardCollection,
106
            $transitionEventCollection
107
        );
108
109 21
        $this->graphResolver->register($graph);
110 21
    }
111
112
    public function supports($resource): bool
113
    {
114
        return is_array($resource) && isset($resource['class'], $resource['states'], $resource['transitions']);
115
    }
116
}
117