func()

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
}