chore: simplify http query array parsing (#4637)

This commit is contained in:
Kevin Wan
2025-02-09 01:00:52 +08:00
committed by GitHub
parent 507ff96546
commit f747585518
5 changed files with 38 additions and 116 deletions

View File

@@ -131,7 +131,7 @@ func (u *Unmarshaler) fillMapFromString(value reflect.Value, mapValue any) error
}
func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value,
mapValue any, fullName string, opts *fieldOptionsWithContext) error {
mapValue any, fullName string) error {
if !value.CanSet() {
return errValueNotSettable
}
@@ -152,10 +152,6 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value,
return nil
}
if u.opts.fromArray {
refValue = makeStringSlice(refValue, opts)
}
var valid bool
conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap())
@@ -174,7 +170,7 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value,
return err
}
case reflect.Slice:
if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue, sliceFullName, opts); err != nil {
if err := u.fillSlice(dereffedBaseType, conv.Index(i), ithValue, sliceFullName); err != nil {
return err
}
default:
@@ -288,7 +284,7 @@ func (u *Unmarshaler) fillSliceWithDefault(derefedType reflect.Type, value refle
defaultCacheLock.Unlock()
}
return u.fillSlice(derefedType, value, slice, fullName, nil)
return u.fillSlice(derefedType, value, slice, fullName)
}
func (u *Unmarshaler) fillStructElement(baseType reflect.Type, target reflect.Value,
@@ -359,7 +355,7 @@ func (u *Unmarshaler) generateMap(keyType, elemType reflect.Type, mapValue any,
switch dereffedElemKind {
case reflect.Slice:
target := reflect.New(dereffedElemType)
if err := u.fillSlice(elemType, target.Elem(), keythData, mapFullName, nil); err != nil {
if err := u.fillSlice(elemType, target.Elem(), keythData, mapFullName); err != nil {
return emptyValue, err
}
@@ -604,7 +600,7 @@ func (u *Unmarshaler) processFieldNotFromString(fieldType reflect.Type, value re
parent: vp.parent,
}, fullName)
case typeKind == reflect.Slice && valueKind == reflect.Slice:
return u.fillSlice(fieldType, value, mapValue, fullName, opts)
return u.fillSlice(fieldType, value, mapValue, fullName)
case valueKind == reflect.Map && typeKind == reflect.Map:
return u.fillMap(fieldType, value, mapValue, fullName)
case valueKind == reflect.String && typeKind == reflect.Map:
@@ -985,7 +981,7 @@ func (u *Unmarshaler) unmarshal(i, v any, fullName string) error {
return errTypeMismatch
}
return u.fillSlice(elemType, reflect.ValueOf(v).Elem(), iv, fullName, nil)
return u.fillSlice(elemType, reflect.ValueOf(v).Elem(), iv, fullName)
default:
return errUnsupportedType
}
@@ -1189,39 +1185,6 @@ func join(elem ...string) string {
return builder.String()
}
func makeStringSlice(refValue reflect.Value, opts *fieldOptionsWithContext) reflect.Value {
if refValue.Len() != 1 {
return refValue
}
element := refValue.Index(0)
if element.Kind() != reflect.String {
return refValue
}
val, ok := element.Interface().(string)
if !ok {
return refValue
}
// comma mode is on by default or display designations are split by commas
if opts == nil || opts.FormArrayComma {
splits := strings.Split(val, comma)
if len(splits) <= 1 {
return refValue
}
slice := reflect.MakeSlice(stringSliceType, len(splits), len(splits))
for i, split := range splits {
// allow empty strings
slice.Index(i).Set(reflect.ValueOf(split))
}
return slice
} else {
return refValue
}
}
func newInitError(name string) error {
return fmt.Errorf("field %q is not set", name)
}