diff --git a/CHANGELOG.md b/CHANGELOG.md index ee00ae3d..65591a89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Improve error reporting when parsing YAML: in some situations where you + would just see an generic error, you'll now see the actual error with + more detail: the YAML line the failed to parse, for exemple + [#467](https://github.com/go-task/task/issues/467). - A JSON Schema was published [here](https://json.schemastore.org/taskfile.json) - and is automatically being used by some editors like Visual Studio Code ([#135](https://github.com/go-task/task/issues/135)). diff --git a/taskfile/cmd.go b/taskfile/cmd.go index c992dd30..9835e8c0 100644 --- a/taskfile/cmd.go +++ b/taskfile/cmd.go @@ -1,7 +1,6 @@ package taskfile import ( - "errors" "strings" ) @@ -20,13 +19,6 @@ type Dep struct { Vars *Vars } -var ( - // ErrCantUnmarshalCmd is returned for invalid command YAML - ErrCantUnmarshalCmd = errors.New("task: can't unmarshal cmd value") - // ErrCantUnmarshalDep is returned for invalid dependency YAML - ErrCantUnmarshalDep = errors.New("task: can't unmarshal dep value") -) - // UnmarshalYAML implements yaml.Unmarshaler interface func (c *Cmd) UnmarshalYAML(unmarshal func(interface{}) error) error { var cmd string @@ -53,12 +45,12 @@ func (c *Cmd) UnmarshalYAML(unmarshal func(interface{}) error) error { Task string Vars *Vars } - if err := unmarshal(&taskCall); err == nil { - c.Task = taskCall.Task - c.Vars = taskCall.Vars - return nil + if err := unmarshal(&taskCall); err != nil { + return err } - return ErrCantUnmarshalCmd + c.Task = taskCall.Task + c.Vars = taskCall.Vars + return nil } // UnmarshalYAML implements yaml.Unmarshaler interface @@ -72,10 +64,10 @@ func (d *Dep) UnmarshalYAML(unmarshal func(interface{}) error) error { Task string Vars *Vars } - if err := unmarshal(&taskCall); err == nil { - d.Task = taskCall.Task - d.Vars = taskCall.Vars - return nil + if err := unmarshal(&taskCall); err != nil { + return err } - return ErrCantUnmarshalDep + d.Task = taskCall.Task + d.Vars = taskCall.Vars + return nil } diff --git a/taskfile/included_taskfile.go b/taskfile/included_taskfile.go index 67d7891d..a5eaba86 100644 --- a/taskfile/included_taskfile.go +++ b/taskfile/included_taskfile.go @@ -6,11 +6,6 @@ import ( "gopkg.in/yaml.v3" ) -var ( - // ErrCantUnmarshalIncludedTaskfile is returned for invalid var YAML. - ErrCantUnmarshalIncludedTaskfile = errors.New("task: can't unmarshal included value") -) - // IncludedTaskfile represents information about included tasksfile type IncludedTaskfile struct { Taskfile string @@ -98,12 +93,11 @@ func (it *IncludedTaskfile) UnmarshalYAML(unmarshal func(interface{}) error) err Taskfile string Dir string } - if err := unmarshal(&includedTaskfile); err == nil { - it.Dir = includedTaskfile.Dir - it.Taskfile = includedTaskfile.Taskfile - it.AdvancedImport = true - return nil + if err := unmarshal(&includedTaskfile); err != nil { + return err } - - return ErrCantUnmarshalIncludedTaskfile + it.Dir = includedTaskfile.Dir + it.Taskfile = includedTaskfile.Taskfile + it.AdvancedImport = true + return nil } diff --git a/taskfile/task.go b/taskfile/task.go index 40c66b58..4acae7b8 100644 --- a/taskfile/task.go +++ b/taskfile/task.go @@ -1,9 +1,5 @@ package taskfile -import ( - "errors" -) - // Tasks represents a group of tasks type Tasks map[string]*Task @@ -28,11 +24,6 @@ type Task struct { IgnoreError bool } -var ( - // ErrCantUnmarshalTask is returned for invalid task YAML - ErrCantUnmarshalTask = errors.New("task: can't unmarshal task value") -) - func (t *Task) Name() string { if t.Label != "" { return t.Label @@ -71,26 +62,24 @@ func (t *Task) UnmarshalYAML(unmarshal func(interface{}) error) error { Prefix string IgnoreError bool `yaml:"ignore_error"` } - if err := unmarshal(&task); err == nil { - t.Cmds = task.Cmds - t.Deps = task.Deps - t.Label = task.Label - t.Desc = task.Desc - t.Summary = task.Summary - t.Sources = task.Sources - t.Generates = task.Generates - t.Status = task.Status - t.Preconditions = task.Preconditions - t.Dir = task.Dir - t.Vars = task.Vars - t.Env = task.Env - t.Silent = task.Silent - t.Method = task.Method - t.Prefix = task.Prefix - t.IgnoreError = task.IgnoreError - - return nil + if err := unmarshal(&task); err != nil { + return err } - - return ErrCantUnmarshalTask + t.Cmds = task.Cmds + t.Deps = task.Deps + t.Label = task.Label + t.Desc = task.Desc + t.Summary = task.Summary + t.Sources = task.Sources + t.Generates = task.Generates + t.Status = task.Status + t.Preconditions = task.Preconditions + t.Dir = task.Dir + t.Vars = task.Vars + t.Env = task.Env + t.Silent = task.Silent + t.Method = task.Method + t.Prefix = task.Prefix + t.IgnoreError = task.IgnoreError + return nil } diff --git a/taskfile/var.go b/taskfile/var.go index 294343f2..502ff5cc 100644 --- a/taskfile/var.go +++ b/taskfile/var.go @@ -7,11 +7,6 @@ import ( "gopkg.in/yaml.v3" ) -var ( - // ErrCantUnmarshalVar is returned for invalid var YAML. - ErrCantUnmarshalVar = errors.New("task: can't unmarshal var value") -) - // Vars is a string[string] variables map. type Vars struct { Keys []string @@ -124,10 +119,9 @@ func (v *Var) UnmarshalYAML(unmarshal func(interface{}) error) error { var sh struct { Sh string } - if err := unmarshal(&sh); err == nil { - v.Sh = sh.Sh - return nil + if err := unmarshal(&sh); err != nil { + return err } - - return ErrCantUnmarshalVar + v.Sh = sh.Sh + return nil }