@@ -58,6 +58,7 @@ type Scanner struct {
58
58
tokenDepth int
59
59
repeateSpecialChar bool // only '}' can be repeated
60
60
prev string
61
+ err error
61
62
}
62
63
63
64
// NewScanner returns a new Scanner to read from r.
@@ -75,6 +76,20 @@ func NewScanner(r io.Reader) *Scanner {
75
76
return s
76
77
}
77
78
79
+ // Err returns the first non-EOF error that was encountered by the Scanner.
80
+ func (s * Scanner ) Err () error {
81
+ if s .err == io .EOF {
82
+ return nil
83
+ }
84
+ return s .err
85
+ }
86
+
87
+ func (s * Scanner ) setErr (err error ) {
88
+ if s .err == nil || s .err != io .EOF {
89
+ s .err = err
90
+ }
91
+ }
92
+
78
93
// Scan reads the next token from source and returns it.. It returns io.EOF at the end of the source. Scanner errors are
79
94
// returned when encountered.
80
95
func (s * Scanner ) Scan () (Token , error ) { //nolint: funlen, gocognit, gocyclo
@@ -88,21 +103,26 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
88
103
var r , quote string
89
104
90
105
for {
106
+ if s .err != nil {
107
+ return Token {}, s .err
108
+ }
109
+
91
110
switch {
92
111
case s .prev != "" :
93
- r = s .prev
94
- s .prev = ""
112
+ r , s .prev = s .prev , ""
95
113
case readNext :
96
114
if ! s .scanner .Scan () {
97
115
if tok .Len () > 0 {
98
116
return Token {Text : tok .String (), Line : s .tokenStartLine , IsQuoted : lexState == inQuote }, nil
99
117
}
100
118
101
119
if s .tokenDepth > 0 {
102
- return Token {}, & scannerError {line : s .tokenStartLine , msg : "unexpected end of file, expecting }" }
120
+ s .setErr (& scannerError {line : s .tokenStartLine , msg : "unexpected end of file, expecting }" })
121
+ return Token {}, s .err
103
122
}
104
123
105
- return Token {}, io .EOF
124
+ s .setErr (io .EOF )
125
+ return Token {}, s .err
106
126
}
107
127
108
128
nextRune := s .scanner .Text ()
@@ -185,7 +205,8 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
185
205
186
206
// only } can be repeated
187
207
if s .repeateSpecialChar && r != "}" {
188
- return Token {}, newScannerErrf (s .tokenStartLine , "unxpected %q" , r )
208
+ s .setErr (newScannerErrf (s .tokenStartLine , "unxpected %q" , r ))
209
+ return Token {}, s .err
189
210
}
190
211
191
212
s .repeateSpecialChar = true
@@ -196,7 +217,8 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
196
217
if r == "}" {
197
218
s .tokenDepth --
198
219
if s .tokenDepth < 0 {
199
- return Token {}, & scannerError {line : s .tokenStartLine , msg : `unexpected "}"` }
220
+ s .setErr (& scannerError {line : s .tokenStartLine , msg : `unexpected "}"` })
221
+ return Token {}, s .err
200
222
}
201
223
}
202
224
0 commit comments