mirror of
https://github.com/go-task/task.git
synced 2026-06-11 09:51:50 +00:00
feat(requires): support variable references in enum constraints (#2678)
This commit is contained in:
@@ -22,9 +22,56 @@ func (r *Requires) DeepCopy() *Requires {
|
||||
}
|
||||
}
|
||||
|
||||
// Enum represents an enum constraint for a required variable.
|
||||
// It can either be a static list of values or a reference to another variable.
|
||||
type Enum struct {
|
||||
Ref string
|
||||
Value []string
|
||||
}
|
||||
|
||||
func (e *Enum) DeepCopy() *Enum {
|
||||
if e == nil {
|
||||
return nil
|
||||
}
|
||||
return &Enum{
|
||||
Ref: e.Ref,
|
||||
Value: deepcopy.Slice(e.Value),
|
||||
}
|
||||
}
|
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler interface.
|
||||
func (e *Enum) UnmarshalYAML(node *yaml.Node) error {
|
||||
switch node.Kind {
|
||||
case yaml.SequenceNode:
|
||||
// Static list of values: enum: ["a", "b"]
|
||||
var values []string
|
||||
if err := node.Decode(&values); err != nil {
|
||||
return errors.NewTaskfileDecodeError(err, node)
|
||||
}
|
||||
e.Value = values
|
||||
return nil
|
||||
|
||||
case yaml.MappingNode:
|
||||
// Reference to another variable: enum: { ref: .VAR }
|
||||
var refStruct struct {
|
||||
Ref string
|
||||
}
|
||||
if err := node.Decode(&refStruct); err != nil {
|
||||
return errors.NewTaskfileDecodeError(err, node)
|
||||
}
|
||||
if refStruct.Ref == "" {
|
||||
return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("enum")
|
||||
}
|
||||
e.Ref = refStruct.Ref
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("enum")
|
||||
}
|
||||
|
||||
type VarsWithValidation struct {
|
||||
Name string
|
||||
Enum []string
|
||||
Enum *Enum
|
||||
}
|
||||
|
||||
func (v *VarsWithValidation) DeepCopy() *VarsWithValidation {
|
||||
@@ -33,7 +80,7 @@ func (v *VarsWithValidation) DeepCopy() *VarsWithValidation {
|
||||
}
|
||||
return &VarsWithValidation{
|
||||
Name: v.Name,
|
||||
Enum: v.Enum,
|
||||
Enum: v.Enum.DeepCopy(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +100,7 @@ func (v *VarsWithValidation) UnmarshalYAML(node *yaml.Node) error {
|
||||
case yaml.MappingNode:
|
||||
var vv struct {
|
||||
Name string
|
||||
Enum []string
|
||||
Enum *Enum
|
||||
}
|
||||
if err := node.Decode(&vv); err != nil {
|
||||
return errors.NewTaskfileDecodeError(err, node)
|
||||
|
||||
Reference in New Issue
Block a user