| package function |
| |
| import ( |
| "fmt" |
| "runtime/debug" |
| ) |
| |
| // ArgError represents an error with one of the arguments in a call. The |
| // attribute Index represents the zero-based index of the argument in question. |
| // |
| // Its error *may* be a cty.PathError, in which case the error actually |
| // pertains to a nested value within the data structure passed as the argument. |
| type ArgError struct { |
| error |
| Index int |
| } |
| |
| func NewArgErrorf(i int, f string, args ...interface{}) error { |
| return ArgError{ |
| error: fmt.Errorf(f, args...), |
| Index: i, |
| } |
| } |
| |
| func NewArgError(i int, err error) error { |
| return ArgError{ |
| error: err, |
| Index: i, |
| } |
| } |
| |
| // PanicError indicates that a panic occurred while executing either a |
| // function's type or implementation function. This is captured and wrapped |
| // into a normal error so that callers (expected to be language runtimes) |
| // are freed from having to deal with panics in buggy functions. |
| type PanicError struct { |
| Value interface{} |
| Stack []byte |
| } |
| |
| func errorForPanic(val interface{}) error { |
| return PanicError{ |
| Value: val, |
| Stack: debug.Stack(), |
| } |
| } |
| |
| func (e PanicError) Error() string { |
| return fmt.Sprintf("panic in function implementation: %s\n%s", e.Value, e.Stack) |
| } |