func()

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
}