// 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")