in document/json/decoder.go [183:234]
func (d *Decoder) decodeJSONFloat64(tv float64, rv reflect.Value) error {
switch rv.Kind() {
case reflect.Interface:
rv.Set(reflect.ValueOf(tv))
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
i, accuracy := big.NewFloat(tv).Int64()
if accuracy != big.Exact || rv.OverflowInt(i) {
return &document.UnmarshalTypeError{
Value: fmt.Sprintf("number overflow, %e", tv),
Type: rv.Type(),
}
}
rv.SetInt(i)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
u, accuracy := big.NewFloat(tv).Uint64()
if accuracy != big.Exact || rv.OverflowUint(u) {
return &document.UnmarshalTypeError{
Value: fmt.Sprintf("number overflow, %e", tv),
Type: rv.Type(),
}
}
rv.SetUint(u)
case reflect.Float32, reflect.Float64:
if rv.OverflowFloat(tv) {
return &document.UnmarshalTypeError{
Value: fmt.Sprintf("float overflow, %e", tv),
Type: rv.Type(),
}
}
rv.SetFloat(tv)
default:
rvt := rv.Type()
switch {
case rvt.ConvertibleTo(serde.ReflectTypeOf.BigFloat):
f := big.NewFloat(tv)
rv.Set(reflect.ValueOf(*f).Convert(rvt))
case rvt.ConvertibleTo(serde.ReflectTypeOf.BigInt):
i, accuracy := big.NewFloat(tv).Int(nil)
if accuracy != big.Exact {
return &document.UnmarshalTypeError{
Value: fmt.Sprintf("int overflow, %e", tv),
Type: rv.Type(),
}
}
rv.Set(reflect.ValueOf(*i).Convert(rvt))
default:
return &document.UnmarshalTypeError{Value: "number", Type: rv.Type()}
}
}
return nil
}