<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/walk/read.go
diff options
context:
space:
mode:
Diffstat (limited to 'walk/read.go')
-rw-r--r--walk/read.go19
1 files changed, 10 insertions, 9 deletions
diff --git a/walk/read.go b/walk/read.go
index f123369..e46ae58 100644
--- a/walk/read.go
+++ b/walk/read.go
@@ -19,8 +19,7 @@ const (
type JSONInStructure int
const (
- JSONInRoot JSONInStructure = iota
- JSONInMap
+ JSONInMap JSONInStructure = iota
JSONInArray
)
@@ -49,7 +48,7 @@ func NewJSONIn(reader *bufio.Reader) JSONIn {
return JSONIn {
path: make([]Atom, 0, 256),
reader: reader,
- structure: []JSONInStructure{JSONInRoot},
+ structure: []JSONInStructure{},
state: JSONInValueStart,
readBuffer: make([]Atom, 0, 256),
readIndex: 0,
@@ -227,7 +226,7 @@ func (in *JSONIn) Read() (WalkItem, error) {
}
func (in *JSONIn) AssertDone() {
- if len(in.structure) != 1 || in.structure[0] != JSONInRoot {
+ if len(in.structure) != 0 || in.state != JSONInValueEnd || in.readIndex < len(in.readBuffer) {
panic("Input ended on incomplete JSON root")
}
}
@@ -259,14 +258,15 @@ func (in *JSONIn) fillReadBuffer() error {
panic("Invalid JSONInState")
}
valueStart: {
+ if len(in.structure) == 0 {
+ goto value
+ }
innermost := in.structure[len(in.structure) - 1]
switch innermost {
case JSONInMap:
goto mapValue
case JSONInArray:
goto arrayValue
- case JSONInRoot:
- goto value
default:
panic("Invalid JSONInStructure")
}
@@ -430,10 +430,11 @@ func (in *JSONIn) fillReadBuffer() error {
in.state = JSONInValueEnd
return err
}
- innermost := in.structure[len(in.structure) - 1]
- if innermost == JSONInRoot {
+ if len(in.structure) == 0 {
panic("More input after root JSON object ends")
- } else if innermost == JSONInMap && r == '}' {
+ }
+ innermost := in.structure[len(in.structure) - 1]
+ if innermost == JSONInMap && r == '}' {
in.structure = in.structure[:len(in.structure) - 1]
in.pushActionBuffer(ActionPopPath)
in.pushActionBuffer(ActionReadValue)