@@ -20,6 +20,15 @@ import (
20
20
// Not all functions change their behavior with all of the options below.
21
21
type Mode uint
22
22
23
+ type SyntaxError struct {
24
+ msg string
25
+ err error
26
+ }
27
+
28
+ func (e SyntaxError ) Error () string { return e .msg }
29
+
30
+ func (e SyntaxError ) Unwrap () error { return e .err }
31
+
23
32
const (
24
33
Shortest Mode = 1 << iota // prefer the shortest match.
25
34
Filenames // "*" and "?" don't match slashes; only "**" does
@@ -85,13 +94,13 @@ writeLoop:
85
94
}
86
95
case '\\' :
87
96
if i ++ ; i >= len (pat ) {
88
- return "" , fmt . Errorf ( `\ at end of pattern` )
97
+ return "" , & SyntaxError { msg : `\ at end of pattern` }
89
98
}
90
99
buf .WriteString (regexp .QuoteMeta (string (pat [i ])))
91
100
case '[' :
92
101
name , err := charClass (pat [i :])
93
102
if err != nil {
94
- return "" , err
103
+ return "" , & SyntaxError { msg : "charClass invalid" , err : err }
95
104
}
96
105
if name != "" {
97
106
buf .WriteString (name )
@@ -110,19 +119,19 @@ writeLoop:
110
119
}
111
120
buf .WriteByte (c )
112
121
if i ++ ; i >= len (pat ) {
113
- return "" , fmt . Errorf ( "[ was not matched with a closing ]" )
122
+ return "" , & SyntaxError { msg : "[ was not matched with a closing ]" }
114
123
}
115
124
switch c = pat [i ]; c {
116
125
case '!' , '^' :
117
126
buf .WriteByte ('^' )
118
127
if i ++ ; i >= len (pat ) {
119
- return "" , fmt . Errorf ( "[ was not matched with a closing ]" )
128
+ return "" , & SyntaxError { msg : "[ was not matched with a closing ]" }
120
129
}
121
130
}
122
131
if c = pat [i ]; c == ']' {
123
132
buf .WriteByte (']' )
124
133
if i ++ ; i >= len (pat ) {
125
- return "" , fmt . Errorf ( "[ was not matched with a closing ]" )
134
+ return "" , & SyntaxError { msg : "[ was not matched with a closing ]" }
126
135
}
127
136
}
128
137
rangeStart := byte (0 )
@@ -140,7 +149,7 @@ writeLoop:
140
149
break loopBracket
141
150
}
142
151
if rangeStart != 0 && rangeStart > c {
143
- return "" , fmt .Errorf ("invalid range: %c-%c" , rangeStart , c )
152
+ return "" , & SyntaxError { msg : fmt .Sprintf ("invalid range: %c-%c" , rangeStart , c )}
144
153
}
145
154
if c == '-' {
146
155
rangeStart = pat [i - 1 ]
@@ -149,7 +158,7 @@ writeLoop:
149
158
}
150
159
}
151
160
if i >= len (pat ) {
152
- return "" , fmt . Errorf ( "[ was not matched with a closing ]" )
161
+ return "" , & SyntaxError { msg : "[ was not matched with a closing ]" }
153
162
}
154
163
case '{' :
155
164
if mode & Braces == 0 {
@@ -183,7 +192,7 @@ writeLoop:
183
192
start , err1 := strconv .Atoi (match [1 ])
184
193
end , err2 := strconv .Atoi (match [2 ])
185
194
if err1 != nil || err2 != nil || start > end {
186
- return "" , fmt .Errorf ("invalid range: %q" , match [0 ])
195
+ return "" , & SyntaxError { msg : fmt .Sprintf ("invalid range: %q" , match [0 ])}
187
196
}
188
197
// TODO: can we do better here?
189
198
buf .WriteString ("(?:" )
0 commit comments