From 46ba96d6b4cc9d748639eda6bbee2ca8cd557d41 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 2 Sep 2023 01:06:01 +0000 Subject: [PATCH 1/2] basic: refactor error handling Signed-off-by: Alejandro Mery --- basic/error.go | 22 ++++++++++------------ basic/token.go | 4 +++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/basic/error.go b/basic/error.go index fec162d..24a9c17 100644 --- a/basic/error.go +++ b/basic/error.go @@ -10,24 +10,22 @@ var ( errInvalidToken = errors.New("invalid token") ) -func newErrInvalidToken(t *token) *lexer.Error { - err := &lexer.Error{ - Line: t.pos.Line, - Column: t.pos.Column, - Content: t.value, - Err: errInvalidToken, - } - return err -} - -func (dec *decoder) OnError(pos lexer.Position, content string, err error) error { - err = &lexer.Error{ +func newError(pos lexer.Position, content, hint string, err error) *lexer.Error { + return &lexer.Error{ Line: pos.Line, Column: pos.Column, Content: content, + Hint: hint, Err: err, } +} +func newErrInvalidToken(t *token) *lexer.Error { + return newError(t.pos, t.value, "", errInvalidToken) +} + +func (dec *decoder) OnError(pos lexer.Position, content string, err error) error { + err = newError(pos, content, "", err) dec.executeFinal() return err } diff --git a/basic/token.go b/basic/token.go index 4f2103b..fc2862b 100644 --- a/basic/token.go +++ b/basic/token.go @@ -149,6 +149,8 @@ func (dec *decoder) OnToken(pos lexer.Position, typ parser.TokenType, value stri return nil default: // unacceptable - return newErrInvalidToken(t) + err := newErrInvalidToken(t) + dec.executeFinal() + return err } } From d75b2dbc78d730869bc522d46e97738b5353d05e Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Sat, 2 Sep 2023 01:39:46 +0000 Subject: [PATCH 2/2] basic: rename and document queue related methods Signed-off-by: Alejandro Mery --- basic/token.go | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/basic/token.go b/basic/token.go index fc2862b..c480446 100644 --- a/basic/token.go +++ b/basic/token.go @@ -32,21 +32,21 @@ func (dec *decoder) executeFinal() { func (dec *decoder) execute(typ parser.TokenType) { switch typ { case parser.TokenSectionEnd: - name1, ok1 := dec.getValue(1, parser.TokenSectionName) + name1, ok1 := dec.queueValue(1, parser.TokenSectionName) if ok1 { - name2, ok2 := dec.getValue(2, parser.TokenSectionSubname) + name2, ok2 := dec.queueValue(2, parser.TokenSectionSubname) dec.addSection(name1, name2, ok2) } - dec.reset() + dec.queueReset() case parser.TokenFieldValue: - key, _ := dec.getValue(0, parser.TokenFieldKey) - value, _ := dec.getValue(1, parser.TokenFieldValue) + key, _ := dec.queueValue(0, parser.TokenFieldKey) + value, _ := dec.queueValue(1, parser.TokenFieldValue) dec.addField(key, value) - dec.reset() + dec.queueReset() } } @@ -82,7 +82,8 @@ func (dec *decoder) addField(key, value string) { } } -func (dec *decoder) getValue(idx int, typ parser.TokenType) (string, bool) { +// queueValue extracts the value of element on the queue if the type matches. +func (dec *decoder) queueValue(idx int, typ parser.TokenType) (string, bool) { switch { case idx < 0 || idx >= len(dec.queue): // out of range @@ -95,40 +96,48 @@ func (dec *decoder) getValue(idx int, typ parser.TokenType) (string, bool) { } } -func (dec *decoder) reset() { +// queueReset removes all tokens from the queue +func (dec *decoder) queueReset() { dec.queue = dec.queue[:0] } -func (dec *decoder) depth(depth int) bool { +// queueDepth confirms the current depth of the queue +func (dec *decoder) queueDepth(depth int) bool { return len(dec.queue) == depth } -func (dec *decoder) depthAfter(depth int, typ parser.TokenType) bool { - _, ok := dec.getValue(depth-1, typ) - if ok { - return len(dec.queue) == depth +// queueDepthType confirms the current depth of the queue and the type of the last +// element. +func (dec *decoder) queueDepthType(depth int, typ parser.TokenType) bool { + if dec.queueDepth(depth) { + return dec.queueType(depth-1, typ) } return false } +// queueType tells if the specified element on the queue is of the required type. +func (dec *decoder) queueType(idx int, typ parser.TokenType) bool { + _, ok := dec.queueValue(idx, typ) + return ok +} + func (dec *decoder) typeOK(typ parser.TokenType) bool { switch typ { case parser.TokenSectionStart, parser.TokenFieldKey: // first token only - return dec.depth(0) + return dec.queueDepth(0) case parser.TokenSectionName: // right after TokenSectionStart - return dec.depthAfter(1, parser.TokenSectionStart) + return dec.queueDepthType(1, parser.TokenSectionStart) case parser.TokenSectionSubname: // right after TokenSectionName - return dec.depthAfter(2, parser.TokenSectionName) + return dec.queueDepthType(2, parser.TokenSectionName) case parser.TokenSectionEnd: // only on a section with name - _, ok := dec.getValue(1, parser.TokenSectionName) - return ok + return dec.queueType(1, parser.TokenSectionName) case parser.TokenFieldValue: // right after a TokenFieldKey - return dec.depthAfter(1, parser.TokenFieldKey) + return dec.queueDepthType(1, parser.TokenFieldKey) default: // never return false