| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package script |
| |
| import ( |
| "errors" |
| "fmt" |
| ) |
| |
| // ErrUnexpectedSuccess indicates that a script command that was expected to |
| // fail (as indicated by a "!" prefix) instead completed successfully. |
| var ErrUnexpectedSuccess = errors.New("unexpected success") |
| |
| // A CommandError describes an error resulting from attempting to execute a |
| // specific command. |
| type CommandError struct { |
| File string |
| Line int |
| Op string |
| Args []string |
| Err error |
| } |
| |
| func cmdError(cmd *command, err error) *CommandError { |
| return &CommandError{ |
| File: cmd.file, |
| Line: cmd.line, |
| Op: cmd.name, |
| Args: cmd.args, |
| Err: err, |
| } |
| } |
| |
| func (e *CommandError) Error() string { |
| if len(e.Args) == 0 { |
| return fmt.Sprintf("%s:%d: %s: %v", e.File, e.Line, e.Op, e.Err) |
| } |
| return fmt.Sprintf("%s:%d: %s %s: %v", e.File, e.Line, e.Op, quoteArgs(e.Args), e.Err) |
| } |
| |
| func (e *CommandError) Unwrap() error { return e.Err } |
| |
| // A UsageError reports the valid arguments for a command. |
| // |
| // It may be returned in response to invalid arguments. |
| type UsageError struct { |
| Name string |
| Command Cmd |
| } |
| |
| func (e *UsageError) Error() string { |
| usage := e.Command.Usage() |
| suffix := "" |
| if usage.Async { |
| suffix = " [&]" |
| } |
| return fmt.Sprintf("usage: %s %s%s", e.Name, usage.Args, suffix) |
| } |
| |
| // ErrUsage may be returned by a Command to indicate that it was called with |
| // invalid arguments; its Usage method may be called to obtain details. |
| var ErrUsage = errors.New("invalid usage") |