@@ -58,6 +58,7 @@ type Scanner struct {
5858 tokenDepth int
5959 repeateSpecialChar bool // only '}' can be repeated
6060 prev string
61+ err error
6162}
6263
6364// NewScanner returns a new Scanner to read from r.
@@ -75,6 +76,20 @@ func NewScanner(r io.Reader) *Scanner {
7576 return s
7677}
7778
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+
7893// Scan reads the next token from source and returns it.. It returns io.EOF at the end of the source. Scanner errors are
7994// returned when encountered.
8095func (s * Scanner ) Scan () (Token , error ) { //nolint: funlen, gocognit, gocyclo
@@ -88,21 +103,26 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
88103 var r , quote string
89104
90105 for {
106+ if s .err != nil {
107+ return Token {}, s .err
108+ }
109+
91110 switch {
92111 case s .prev != "" :
93- r = s .prev
94- s .prev = ""
112+ r , s .prev = s .prev , ""
95113 case readNext :
96114 if ! s .scanner .Scan () {
97115 if tok .Len () > 0 {
98116 return Token {Text : tok .String (), Line : s .tokenStartLine , IsQuoted : lexState == inQuote }, nil
99117 }
100118
101119 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
103122 }
104123
105- return Token {}, io .EOF
124+ s .setErr (io .EOF )
125+ return Token {}, s .err
106126 }
107127
108128 nextRune := s .scanner .Text ()
@@ -185,7 +205,8 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
185205
186206 // only } can be repeated
187207 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
189210 }
190211
191212 s .repeateSpecialChar = true
@@ -196,7 +217,8 @@ func (s *Scanner) Scan() (Token, error) { //nolint: funlen, gocognit, gocyclo
196217 if r == "}" {
197218 s .tokenDepth --
198219 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
200222 }
201223 }
202224
0 commit comments