Assisted-by: GLM 5.3 Flash
This commit is contained in:
@@ -26,6 +26,7 @@ var timeType = reflect.TypeFor[time.Time]()
|
||||
var (
|
||||
unmarshalerType = reflect.TypeFor[Unmarshaler]()
|
||||
textUnmarshalerType = reflect.TypeFor[encoding.TextUnmarshaler]()
|
||||
numberType = reflect.TypeFor[Number]()
|
||||
)
|
||||
|
||||
// The per-type flags record which interface lookups a decode into that type
|
||||
@@ -181,6 +182,8 @@ func (d *decoder) assign(data any, dst reflect.Value) error {
|
||||
return setDuration(dst, v)
|
||||
}
|
||||
return setBasic(dst, reflect.ValueOf(v), "string")
|
||||
case Number:
|
||||
return setNumber(dst, v)
|
||||
case bool:
|
||||
return setBasic(dst, reflect.ValueOf(v), "bool")
|
||||
case int64:
|
||||
@@ -389,6 +392,28 @@ func setDuration(dst reflect.Value, s string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// setNumber stores a Number, the literal UseNumber keeps. A Number destination
|
||||
// takes the literal as it is; every other destination takes the evaluated
|
||||
// value through the ordinary rules, so an integer field, a float field and a
|
||||
// duration field all read a Number the way they read the evaluated kind.
|
||||
func setNumber(dst reflect.Value, n Number) error {
|
||||
if dst.Type() == numberType {
|
||||
dst.SetString(string(n))
|
||||
return nil
|
||||
}
|
||||
v, err := decodeNumber(string(n))
|
||||
if err != nil {
|
||||
return fmt.Errorf("interpres: %w", err)
|
||||
}
|
||||
switch v := v.(type) {
|
||||
case int64:
|
||||
return setInt(dst, v)
|
||||
case float64:
|
||||
return setFloat(dst, v)
|
||||
}
|
||||
return fmt.Errorf("interpres: cannot assign number to %s", dst.Type())
|
||||
}
|
||||
|
||||
func setInt(dst reflect.Value, v int64) error {
|
||||
switch dst.Kind() {
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
|
||||
Reference in New Issue
Block a user