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
}