in cborl/parse.go [314:396]
func (p *Parser) stepValue(b []byte) ([]byte, bool, error) {
if len(b) == 0 {
return b, false, nil
}
major := b[0] & majorMask
switch major {
case majorUint:
if b[0] < len8b {
err := p.visitor.OnUint8(b[0])
done := false
if err == nil {
done, err = p.onValue()
}
return b[1:], done, err
}
p.state.push(state{major, b[0] & minorMask})
return b[1:], false, nil
case majorNeg:
minor := b[0] & minorMask
if v := minor; v < len8b {
err := p.visitor.OnInt8(int8(^v))
done := false
if err == nil {
done, err = p.onValue()
}
return b[1:], done, err
}
p.state.push(state{major, minor})
return b[1:], false, nil
case majorBytes, majorText:
minor := b[0] & minorMask
if minor == lenIndef {
return nil, false, errIndefByteSeq
} else {
return p.initByteSeq(major, minor, b[1:])
}
case majorArr, majorMap:
minor := b[0] & minorMask
return p.initSub(major, minor, b[1:])
case majorTag:
return nil, false, errTODO()
default:
var (
err error
done bool
)
switch b[0] {
case codeFalse:
err = p.visitor.OnBool(false)
if err == nil {
done, err = p.onValue()
}
return b[1:], done, err
case codeTrue:
err = p.visitor.OnBool(true)
if err == nil {
done, err = p.onValue()
}
return b[1:], done, err
case codeNull, codeUndef:
err = p.visitor.OnNil()
if err == nil {
done, err = p.onValue()
}
return b[1:], done, err
case codeHalfFloat:
return b[1:], false, errTODO()
case codeSingleFloat, codeDoubleFloat:
p.state.push(state{b[0], stStart})
return b[1:], false, nil
}
}
return nil, false, errInvalidCode
}