-
Notifications
You must be signed in to change notification settings - Fork 227
/
error.go
142 lines (111 loc) · 2.76 KB
/
error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package gojqx
import (
"fmt"
"strings"
"github.com/wader/gojq"
)
// many of these based on errors from gojq
// TODO: figute out a nicer way for internal/external func name in errors
func funcName(s string) string {
if strings.HasPrefix(s, "_") {
return s[1:]
}
return s
}
type UnaryTypeError struct {
Name string
V any
}
func (err *UnaryTypeError) Error() string {
return fmt.Sprintf("cannot %s: %s", funcName(err.Name), TypeErrorPreview(err.V))
}
type BinopTypeError struct {
Name string
L, R any
}
func (err *BinopTypeError) Error() string {
return "cannot " + funcName(err.Name) + ": " + TypeErrorPreview(err.L) + " and " + TypeErrorPreview(err.R)
}
type NonUpdatableTypeError struct {
Typ string
Key string
}
func (err NonUpdatableTypeError) Error() string {
return fmt.Sprintf("update key %v cannot be applied to: %s", err.Key, err.Typ)
}
type FuncTypeError struct {
Name string
V any
}
func (err FuncTypeError) Error() string {
return funcName(err.Name) + " cannot be applied to: " + TypeErrorPreview(err.V)
}
type FuncArgTypeError struct {
Name string
ArgName string
V any
}
func (err FuncArgTypeError) Error() string {
return fmt.Sprintf("%s %s argument cannot be: %s", funcName(err.Name), err.ArgName, TypeErrorPreview(err.V))
}
type FuncTypeNameError struct {
Name string
Typ string
}
func (err FuncTypeNameError) Error() string {
return funcName(err.Name) + " cannot be applied to: " + err.Typ
}
type ExpectedObjectError struct {
Typ string
}
func (err ExpectedObjectError) Error() string {
return "expected an object but got: " + err.Typ
}
type ExpectedArrayError struct {
Typ string
}
func (err ExpectedArrayError) Error() string {
return "expected an array but got: " + err.Typ
}
type ExpectedObjectWithKeyError struct {
Typ string
Key string
}
func (err ExpectedObjectWithKeyError) Error() string {
return fmt.Sprintf("expected an object with key %q but got: %s", err.Key, err.Typ)
}
type ExpectedArrayWithIndexError struct {
Typ string
Index int
}
func (err ExpectedArrayWithIndexError) Error() string {
return fmt.Sprintf("expected an array with index %d but got: %s", err.Index, err.Typ)
}
type IteratorError struct {
Typ string
}
func (err IteratorError) Error() string {
return "cannot iterate over: " + err.Typ
}
type HasKeyTypeError struct {
L, R string
}
func (err HasKeyTypeError) Error() string {
return "cannot check whether " + err.L + " has a key: " + err.R
}
type ArrayIndexTooLargeError struct {
V any
}
func (err *ArrayIndexTooLargeError) Error() string {
return fmt.Sprintf("array index too large: %v", err.V)
}
func TypeErrorPreview(v any) string {
switch v.(type) {
case nil:
return "null"
case gojq.Iter:
return "gojq.Iter"
default:
return gojq.TypeOf(v) + " (" + gojq.Preview(v) + ")"
}
}