]>
Commit | Line | Data |
---|---|---|
15c0b25d AP |
1 | package function |
2 | ||
3 | import ( | |
4 | "fmt" | |
5 | "runtime/debug" | |
6 | ) | |
7 | ||
8 | // ArgError represents an error with one of the arguments in a call. The | |
9 | // attribute Index represents the zero-based index of the argument in question. | |
10 | // | |
11 | // Its error *may* be a cty.PathError, in which case the error actually | |
12 | // pertains to a nested value within the data structure passed as the argument. | |
13 | type ArgError struct { | |
14 | error | |
15 | Index int | |
16 | } | |
17 | ||
18 | func NewArgErrorf(i int, f string, args ...interface{}) error { | |
19 | return ArgError{ | |
20 | error: fmt.Errorf(f, args...), | |
21 | Index: i, | |
22 | } | |
23 | } | |
24 | ||
25 | func NewArgError(i int, err error) error { | |
26 | return ArgError{ | |
27 | error: err, | |
28 | Index: i, | |
29 | } | |
30 | } | |
31 | ||
32 | // PanicError indicates that a panic occurred while executing either a | |
33 | // function's type or implementation function. This is captured and wrapped | |
34 | // into a normal error so that callers (expected to be language runtimes) | |
35 | // are freed from having to deal with panics in buggy functions. | |
36 | type PanicError struct { | |
37 | Value interface{} | |
38 | Stack []byte | |
39 | } | |
40 | ||
41 | func errorForPanic(val interface{}) error { | |
42 | return PanicError{ | |
43 | Value: val, | |
44 | Stack: debug.Stack(), | |
45 | } | |
46 | } | |
47 | ||
48 | func (e PanicError) Error() string { | |
49 | return fmt.Sprintf("panic in function implementation: %s\n%s", e.Value, e.Stack) | |
50 | } |