forked from scipipe/scipipe
/
subworkflow.go
60 lines (46 loc) · 1.35 KB
/
subworkflow.go
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
// An example that shows how to create a sub-network / sub-workflow that can be
// used as a component
package main
import sp "github.com/scipipe/scipipe"
func main() {
// Main workflow
wfl := sp.NewWorkflow("foobar_wf", 4)
// Sub-workflow
NewFooBarSubWorkflow(wfl, "foobar_subwf")
// Run
wfl.Run()
}
// ------------------------------------------------
// FooBarSubWorkflow
// ------------------------------------------------
type FooBarSubWorkflow struct {
name string
Procs map[string]*sp.Process
Out *sp.OutPort
}
func NewFooBarSubWorkflow(wf *sp.Workflow, name string) *FooBarSubWorkflow {
fbn := &FooBarSubWorkflow{
name: name,
Procs: make(map[string]*sp.Process),
}
fbn.Procs["foo"] = sp.NewProc(wf, "foo", "echo foo > {o:foo}")
fbn.Procs["foo"].SetOut("foo", "foo.txt")
fbn.Procs["f2b"] = sp.NewProc(wf, "f2b", "sed 's/foo/bar/g' {i:foo} > {o:bar}")
fbn.Procs["f2b"].SetOut("bar", "{i:foo|%.txt}.bar.txt")
// Connect together inner processes
fbn.Procs["foo"].Out("foo").To(fbn.Procs["f2b"].In("foo"))
// Connect last port of inner process to subnetwork out-port
fbn.Out = fbn.Procs["f2b"].Out("bar")
return fbn
}
func (wf *FooBarSubWorkflow) Name() string {
return wf.name
}
func (wf *FooBarSubWorkflow) Run() {
for _, proc := range wf.Procs {
go proc.Run()
}
}
func (wf *FooBarSubWorkflow) Ready() bool {
return wf.Out.Ready()
}