flow.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package approve_former
  2. import "strings"
  3. const flowTemplate = `apiVersion: argoproj.io/v1alpha1
  4. kind: WorkflowTemplate
  5. metadata:
  6. name: [[ .name ]]
  7. spec:
  8. entrypoint: approve-flow
  9. templates:
  10. - name: approve-flow
  11. dag:
  12. tasks:
  13. [[- if .childNodesContentLines ]]
  14. [[- range .childNodesContentLines ]]
  15. [[ . ]]
  16. [[- end ]]
  17. [[- else ]]
  18. - name: node
  19. template: approval
  20. [[- end ]]
  21. - name: approval
  22. suspend: {}
  23. inputs:
  24. parameters:
  25. - name: approve
  26. default: '通过'
  27. enum:
  28. - '通过'
  29. - '拒绝'
  30. outputs:
  31. parameters:
  32. - name: approve
  33. valueFrom:
  34. supplied: {}
  35. `
  36. type Flow struct {
  37. Name string
  38. ChildNodes []Node
  39. }
  40. func NewFlow(name string, childNodes ...Node) *Flow {
  41. return &Flow{
  42. Name: name,
  43. ChildNodes: childNodes,
  44. }
  45. }
  46. func (flow *Flow) GetName() string {
  47. return flow.Name
  48. }
  49. func (flow *Flow) GetChildNodes() []Node {
  50. return flow.ChildNodes
  51. }
  52. func (flow *Flow) Render(_ ...Node) (string, error) {
  53. childNodesContents := make([]string, 0)
  54. for i, childNode := range flow.ChildNodes {
  55. var childNodeContent string
  56. if i == 0 {
  57. content, err := childNode.Render()
  58. if err != nil {
  59. return "", err
  60. }
  61. childNodeContent = content
  62. } else {
  63. upperNodes := make([]Node, 0)
  64. upperChildNodes := flow.ChildNodes[i-1].GetChildNodes()
  65. if len(upperChildNodes) == 0 {
  66. upperNodes = append(upperNodes, flow.ChildNodes[i-1])
  67. } else {
  68. upperNodes = append(upperNodes, upperChildNodes...)
  69. }
  70. content, err := childNode.Render(upperNodes...)
  71. if err != nil {
  72. return "", err
  73. }
  74. childNodeContent = content
  75. }
  76. childNodesContents = append(childNodesContents, strings.Split(childNodeContent, "\n")...)
  77. }
  78. return render("flow", flowTemplate, map[string]any{
  79. "name": flow.Name,
  80. "childNodesContentLines": childNodesContents,
  81. })
  82. }