-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathWorkflow.php
127 lines (115 loc) · 4.64 KB
/
Workflow.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
<?php
declare(strict_types=1);
namespace Kiboko\Component\Satellite\Builder;
use PhpParser\Builder;
use PhpParser\Node;
final class Workflow implements Builder
{
private array $jobs = [];
public function __construct(
private readonly Node\Expr $runtime
) {
}
public function addPipeline(string $code, string $pipelineFilename): self
{
$this->jobs[] = fn (Node\Expr $runtime) => new Node\Expr\MethodCall(
var: $runtime,
name: new Node\Identifier('job'),
args: [
new Node\Arg(
new Node\Expr\StaticCall(
new Node\Name\FullyQualified('Kiboko\Component\Workflow\JobCode'),
new Node\Identifier('fromString'),
[
new Node\Arg(new Node\Scalar\String_($code)),
],
),
),
new Node\Arg(
new Node\Expr\MethodCall(
var: new Node\Expr\Variable('runtime'),
name: 'loadPipeline',
args: [
new Node\Arg(
new Node\Expr\StaticCall(
new Node\Name\FullyQualified('Kiboko\Component\Workflow\JobCode'),
new Node\Identifier('fromString'),
[
new Node\Arg(new Node\Scalar\String_($code)),
],
),
),
new Node\Arg(
value: new Node\Expr\BinaryOp\Concat(
left: new Node\Scalar\MagicConst\Dir(),
right: new Node\Scalar\Encapsed(
parts: [
new Node\Scalar\EncapsedStringPart('/'),
new Node\Scalar\EncapsedStringPart($pipelineFilename),
],
),
),
),
],
),
),
],
);
return $this;
}
public function addAction(string $code, string $pipelineFilename): self
{
$this->jobs[] = fn (Node\Expr $runtime) => new Node\Expr\MethodCall(
var: $runtime,
name: new Node\Identifier('job'),
args: [
new Node\Arg(
new Node\Expr\StaticCall(
new Node\Name\FullyQualified('Kiboko\Component\Workflow\JobCode'),
new Node\Identifier('fromString'),
[
new Node\Arg(new Node\Scalar\String_($code)),
],
),
),
new Node\Arg(
new Node\Expr\MethodCall(
var: new Node\Expr\Variable('runtime'),
name: 'loadAction',
args: [
new Node\Arg(
new Node\Expr\StaticCall(
new Node\Name\FullyQualified('Kiboko\Component\Workflow\JobCode'),
new Node\Identifier('fromString'),
[
new Node\Arg(new Node\Scalar\String_($code)),
],
),
),
new Node\Arg(
value: new Node\Expr\BinaryOp\Concat(
left: new Node\Scalar\MagicConst\Dir(),
right: new Node\Scalar\Encapsed(
parts: [
new Node\Scalar\EncapsedStringPart('/'),
new Node\Scalar\EncapsedStringPart($pipelineFilename),
],
),
),
),
],
),
),
],
);
return $this;
}
public function getNode(): Node
{
$workflow = $this->runtime;
foreach ($this->jobs as $job) {
$workflow = $job($workflow);
}
return $workflow;
}
}