func()

in dax/internal/cbor/decimal.go [116:171]


func (r *Reader) ReadDecimal() (*Decimal, error) {
	hdr, value, err := r.readTypeHeader()
	if err != nil {
		return nil, err
	}
	switch hdr & MajorTypeMask {
	case PosInt:
		v := new(big.Int).SetUint64(value)
		return NewDecimal(v, 0), nil

	case NegInt:
		v := new(big.Int)
		v.SetUint64(value)
		v.Not(v)
		return NewDecimal(v, 0), nil

	case Tag:
		// TODO skip other tags.
		switch int(value) {
		case TagPosBigInt:
			v, err := r.readBigInt(0)
			if err == nil {
				return NewDecimal(v, 0), nil
			}
			return nil, err

		case TagNegBigInt:
			v, err := r.readBigInt(-1)
			if err == nil {
				return NewDecimal(v, 0), nil
			}
			return nil, err

		case TagDecimal:
			size, err := r.ReadArrayLength()
			if err == nil && size == 2 {
				var scale int
				var v *big.Int
				scale, err = r.ReadInt()
				if err == nil {
					v, err = r.ReadBigInt()
				}
				if err == nil {
					return NewDecimal(v, -scale), nil
				}
			}
			if err != nil {
				return nil, err
			}
		}

	case Simple:
		// FIXME: convertible floats.
	}
	return nil, ErrNaN
}