github.com/alkemics/goflow@v0.2.1/wrappers/bind/renderers.go (about) 1 package bind 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/alkemics/goflow" 8 ) 9 10 type nodeRenderer struct { 11 goflow.NodeRenderer 12 13 bindMap map[string]goflow.Field 14 absentInputNames map[string]struct{} 15 } 16 17 func (n nodeRenderer) Inputs() []goflow.Field { 18 boundInputs := make([]goflow.Field, len(n.NodeRenderer.Inputs())) 19 for i, input := range n.NodeRenderer.Inputs() { 20 f := input 21 if bf, ok := n.bindMap[f.Name]; ok { 22 f = bf 23 } 24 boundInputs[i] = f 25 } 26 return boundInputs 27 } 28 29 func (n nodeRenderer) Run(inputs, outputs []goflow.Field) (string, error) { 30 statements := make([]string, len(n.absentInputNames)+1) 31 i := 0 32 for _, input := range inputs { 33 if _, ok := n.absentInputNames[input.Name]; !ok { 34 continue 35 } 36 statements[i] = fmt.Sprintf("var %s %s", input.Name, input.Type) 37 i++ 38 } 39 40 stmts, err := n.NodeRenderer.Run(inputs, outputs) 41 if err != nil { 42 return "", err 43 } 44 45 statements[len(n.absentInputNames)] = stmts 46 return strings.Join(statements, "\n"), nil 47 } 48 49 type bindingNode struct { 50 id string 51 inputs []goflow.Field 52 output goflow.Field 53 } 54 55 func (n bindingNode) ID() string { 56 return n.id 57 } 58 59 func (n bindingNode) Doc() string { return "" } 60 61 func (n bindingNode) Previous() []string { 62 return nil 63 } 64 65 func (n bindingNode) Imports() []goflow.Import { 66 return nil 67 } 68 69 func (n bindingNode) Dependencies() []goflow.Field { 70 return nil 71 } 72 73 func (n bindingNode) Inputs() []goflow.Field { 74 return n.inputs 75 } 76 77 func (n bindingNode) Outputs() []goflow.Field { 78 return []goflow.Field{n.output} 79 } 80 81 func (n bindingNode) Run(inputs, outputs []goflow.Field) (string, error) { 82 return Run(inputs, outputs) 83 } 84 85 type graphRenderer struct { 86 goflow.GraphRenderer 87 88 wrappedNodes []goflow.NodeRenderer 89 bindingNodes []bindingNode 90 } 91 92 func (g graphRenderer) Nodes() []goflow.NodeRenderer { 93 nodes := make([]goflow.NodeRenderer, len(g.wrappedNodes)+len(g.bindingNodes)) 94 copy(nodes, g.wrappedNodes) 95 96 for i, n := range g.bindingNodes { 97 nodes[len(g.wrappedNodes)+i] = n 98 } 99 100 return nodes 101 }