1
0

for.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package ast
  2. import (
  3. "gopkg.in/yaml.v3"
  4. "github.com/go-task/task/v3/errors"
  5. "github.com/go-task/task/v3/internal/deepcopy"
  6. "github.com/go-task/task/v3/internal/omap"
  7. )
  8. type For struct {
  9. From string
  10. List []any
  11. Matrix omap.OrderedMap[string, []any]
  12. Var string
  13. Split string
  14. As string
  15. }
  16. func (f *For) UnmarshalYAML(node *yaml.Node) error {
  17. switch node.Kind {
  18. case yaml.ScalarNode:
  19. var from string
  20. if err := node.Decode(&from); err != nil {
  21. return errors.NewTaskfileDecodeError(err, node)
  22. }
  23. f.From = from
  24. return nil
  25. case yaml.SequenceNode:
  26. var list []any
  27. if err := node.Decode(&list); err != nil {
  28. return errors.NewTaskfileDecodeError(err, node)
  29. }
  30. f.List = list
  31. return nil
  32. case yaml.MappingNode:
  33. var forStruct struct {
  34. Matrix omap.OrderedMap[string, []any]
  35. Var string
  36. Split string
  37. As string
  38. }
  39. if err := node.Decode(&forStruct); err != nil {
  40. return errors.NewTaskfileDecodeError(err, node)
  41. }
  42. if forStruct.Var == "" && forStruct.Matrix.Len() == 0 {
  43. return errors.NewTaskfileDecodeError(nil, node).WithMessage("invalid keys in for")
  44. }
  45. if forStruct.Var != "" && forStruct.Matrix.Len() != 0 {
  46. return errors.NewTaskfileDecodeError(nil, node).WithMessage("cannot use both var and matrix in for")
  47. }
  48. f.Matrix = forStruct.Matrix
  49. f.Var = forStruct.Var
  50. f.Split = forStruct.Split
  51. f.As = forStruct.As
  52. return nil
  53. }
  54. return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("for")
  55. }
  56. func (f *For) DeepCopy() *For {
  57. if f == nil {
  58. return nil
  59. }
  60. return &For{
  61. From: f.From,
  62. List: deepcopy.Slice(f.List),
  63. Matrix: f.Matrix.DeepCopy(),
  64. Var: f.Var,
  65. Split: f.Split,
  66. As: f.As,
  67. }
  68. }