in cborl/parse.go [153:289]
func (p *Parser) execStep(b []byte) ([]byte, bool, error) {
var (
err error
done bool
)
switch p.state.current.major {
case stFail:
return b, false, p.err
case stValue:
b, done, err = p.stepValue(b)
case stLen:
b = p.stepLen(b)
case majorUint:
b, done, err = p.stepUint(b)
case majorNeg:
b, done, err = p.stepNeg(b)
case codeSingleFloat:
b, done, err = p.stepSingleFloat(b)
case codeDoubleFloat:
b, done, err = p.stepDoubleFloat(b)
case majorBytes | stStartX:
if p.length.current == 0 {
err = p.visitor.OnArrayStart(0, structform.ByteType)
if err == nil {
err = p.visitor.OnArrayFinished()
p.length.pop()
if err == nil {
done, err = p.popState()
}
}
break
}
p.state.current.major &= ^stStartX
if len(b) == 0 {
break
}
fallthrough
case majorBytes:
b, done, err = p.stepBytes(b)
case majorText | stStartX:
if p.length.current == 0 {
p.length.pop()
err = p.visitor.OnString("")
if err == nil {
done, err = p.popState()
}
break
}
p.state.current.major &= ^stStartX
if len(b) == 0 {
break
}
fallthrough
case majorText:
b, done, err = p.stepText(b)
case stStartArr:
err = p.visitor.OnArrayStart(int(p.length.current), structform.AnyType)
if err != nil {
break
}
p.state.pop()
fallthrough
case majorArr:
b, done, err = p.stepArray(b)
case stStartIndefArr:
err = p.visitor.OnArrayStart(-1, structform.AnyType)
if err != nil {
break
}
p.state.pop()
fallthrough
case majorArr | stIndef:
if b[0] == codeBreak {
b = b[1:]
err = p.visitor.OnArrayFinished()
if err == nil {
done, err = p.popState()
}
} else {
b, done, err = p.stepValue(b)
}
case stStartMap:
err = p.visitor.OnObjectStart(int(p.length.current), structform.AnyType)
if err != nil {
break
}
p.state.pop()
fallthrough
case majorMap:
b, done, err = p.stepMap(b)
case stStartIndefMap:
err = p.visitor.OnObjectStart(-1, structform.AnyType)
if err != nil {
break
}
p.state.pop()
fallthrough
case majorMap | stIndef:
if b[0] == codeBreak {
err = p.visitor.OnObjectFinished()
b = b[1:]
if err == nil {
done, err = p.popState()
}
} else {
b, done, err = p.initMapKey(b)
}
case stKey | stStartX:
if p.length.current == 0 {
err = errEmptyKey
break
}
p.state.current.major &= (^stStartX)
fallthrough
case stKey:
b, done, err = p.stepKey(b)
case stElem:
p.state.pop()
b, done, err = p.stepValue(b)
default:
err = errTODO()
}
return b, done, err
}