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  }