func()

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
}