1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package ast
- import (
- "gopkg.in/yaml.v3"
- "github.com/go-task/task/v3/errors"
- "github.com/go-task/task/v3/internal/deepcopy"
- "github.com/go-task/task/v3/internal/omap"
- )
- type For struct {
- From string
- List []any
- Matrix omap.OrderedMap[string, []any]
- Var string
- Split string
- As string
- }
- func (f *For) UnmarshalYAML(node *yaml.Node) error {
- switch node.Kind {
- case yaml.ScalarNode:
- var from string
- if err := node.Decode(&from); err != nil {
- return errors.NewTaskfileDecodeError(err, node)
- }
- f.From = from
- return nil
- case yaml.SequenceNode:
- var list []any
- if err := node.Decode(&list); err != nil {
- return errors.NewTaskfileDecodeError(err, node)
- }
- f.List = list
- return nil
- case yaml.MappingNode:
- var forStruct struct {
- Matrix omap.OrderedMap[string, []any]
- Var string
- Split string
- As string
- }
- if err := node.Decode(&forStruct); err != nil {
- return errors.NewTaskfileDecodeError(err, node)
- }
- if forStruct.Var == "" && forStruct.Matrix.Len() == 0 {
- return errors.NewTaskfileDecodeError(nil, node).WithMessage("invalid keys in for")
- }
- if forStruct.Var != "" && forStruct.Matrix.Len() != 0 {
- return errors.NewTaskfileDecodeError(nil, node).WithMessage("cannot use both var and matrix in for")
- }
- f.Matrix = forStruct.Matrix
- f.Var = forStruct.Var
- f.Split = forStruct.Split
- f.As = forStruct.As
- return nil
- }
- return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("for")
- }
- func (f *For) DeepCopy() *For {
- if f == nil {
- return nil
- }
- return &For{
- From: f.From,
- List: deepcopy.Slice(f.List),
- Matrix: f.Matrix.DeepCopy(),
- Var: f.Var,
- Split: f.Split,
- As: f.As,
- }
- }
|