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