in oss/client.go [968:1029]
func unmarshalBodyXmlMix(result any, output *OperationOutput) error {
var err error
var body []byte
if output.Body != nil {
defer output.Body.Close()
if body, err = io.ReadAll(output.Body); err != nil {
return err
}
}
if len(body) == 0 {
return nil
}
val := reflect.ValueOf(result)
switch val.Kind() {
case reflect.Pointer, reflect.Interface:
if val.IsNil() {
return nil
}
val = val.Elem()
}
if val.Kind() != reflect.Struct || output == nil {
return nil
}
t := val.Type()
idx := -1
for k := 0; k < t.NumField(); k++ {
if tag, ok := t.Field(k).Tag.Lookup("output"); ok {
tokens := strings.Split(tag, ",")
if len(tokens) < 2 {
continue
}
// header|query|body,filed_name,[required,time,usermeta...]
switch tokens[0] {
case "body":
idx = k
break
}
}
}
if idx >= 0 {
dst := val.Field(idx)
if dst.IsNil() {
dst.Set(reflect.New(dst.Type().Elem()))
}
err = xml.Unmarshal(body, dst.Interface())
} else {
err = xml.Unmarshal(body, result)
}
if err != nil {
err = &DeserializationError{
Err: err,
Snapshot: body,
}
}
return err
}