(node *yaml.Node)
| 17 | } |
| 18 | |
| 19 | func (v *Var) UnmarshalYAML(node *yaml.Node) error { |
| 20 | switch node.Kind { |
| 21 | case yaml.MappingNode: |
| 22 | var m struct { |
| 23 | Sh *string |
| 24 | Ref string |
| 25 | Map any |
| 26 | Value any |
| 27 | Secret bool |
| 28 | } |
| 29 | if err := node.Decode(&m); err != nil { |
| 30 | return errors.NewTaskfileDecodeError(err, node) |
| 31 | } |
| 32 | // Validate the keys regardless of their order: every key must be known |
| 33 | // and at least one type-defining key must be present. "secret" is a |
| 34 | // modifier, not a type, so it can appear in any position. |
| 35 | hasType := false |
| 36 | for i := 0; i+1 < len(node.Content); i += 2 { |
| 37 | switch node.Content[i].Value { |
| 38 | case "sh", "ref", "map", "value": |
| 39 | hasType = true |
| 40 | case "secret": |
| 41 | // modifier, not a type |
| 42 | default: |
| 43 | return errors.NewTaskfileDecodeError(nil, node).WithMessage(`%q is not a valid variable type. Try "sh", "ref", "map", "value" or using a scalar value`, node.Content[i].Value) |
| 44 | } |
| 45 | } |
| 46 | if !hasType { |
| 47 | return errors.NewTaskfileDecodeError(nil, node).WithMessage(`a variable must define one of "sh", "ref", "map", "value" or be a scalar value`) |
| 48 | } |
| 49 | v.Sh = m.Sh |
| 50 | v.Ref = m.Ref |
| 51 | v.Secret = m.Secret |
| 52 | // Handle both "map" and "value" keys |
| 53 | if m.Map != nil { |
| 54 | v.Value = m.Map |
| 55 | } else if m.Value != nil { |
| 56 | v.Value = m.Value |
| 57 | } |
| 58 | return nil |
| 59 | default: |
| 60 | var value any |
| 61 | if err := node.Decode(&value); err != nil { |
| 62 | return errors.NewTaskfileDecodeError(err, node) |
| 63 | } |
| 64 | v.Value = value |
| 65 | return nil |
| 66 | } |
| 67 | } |
nothing calls this directly
no test coverage detected