in json/parse.go [176:254]
func (p *Parser) feedUntil(b []byte) (int, bool, error) {
var (
err error
reported bool
orig = b
)
for !reported && len(b) > 0 {
switch p.currentState {
case failedState:
if p.err == nil {
p.err = errors.New("invalid parser state")
}
return 0, false, p.err
case startState:
b, reported, err = p.stepStart(b)
case dictState:
b, reported, err = p.stepDict(b, true)
case dictNextFieldState:
b, reported, err = p.stepDict(b, false)
case dictFieldState:
b, err = p.stepDictKey(b)
case dictFieldValueSep:
if b = trimLeft(b); len(b) > 0 {
if b[0] != ':' {
err = errExpectColon
}
b = b[1:]
p.currentState = dictFieldValue
}
case dictFieldValue:
b, reported, err = p.stepValue(b, dictFieldStateEnd)
case dictFieldStateEnd:
b, reported, err = p.stepDictValueEnd(b)
case arrState:
b, reported, err = p.stepArray(b, true)
case arrStateValue:
b, _, err = p.stepValue(b, arrStateNext)
case arrStateNext:
b, reported, err = p.stepArrValueEnd(b)
case nullState:
b, reported, err = p.stepNULL(b)
case trueState:
b, reported, err = p.stepTRUE(b)
case falseState:
b, reported, err = p.stepFALSE(b)
case stringState:
b, reported, err = p.stepString(b)
case numberState:
b, reported, err = p.stepNumber(b)
default:
return 0, false, errFailing
}
if err != nil {
break
}
reported = reported && len(p.states) == 0
}
consumed := len(orig) - len(b)
return consumed, reported, err
}