}
}
-// buildStruct adds a struct and its fields to the current XMLNode. All fields any any nested
+// buildStruct adds a struct and its fields to the current XMLNode. All fields and any nested
// types are converted to XMLNodes also.
func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
if !value.IsValid() {
return nil
}
- fieldAdded := false
-
// unwrap payloads
if payload := tag.Get("payload"); payload != "" {
field, _ := value.Type().FieldByName(payload)
child.Attr = append(child.Attr, ns)
}
+ var payloadFields, nonPayloadFields int
+
t := value.Type()
for i := 0; i < value.NumField(); i++ {
member := elemOf(value.Field(i))
mTag := field.Tag
if mTag.Get("location") != "" { // skip non-body members
+ nonPayloadFields++
continue
}
+ payloadFields++
if protocol.CanSetIdempotencyToken(value.Field(i), field) {
token := protocol.GetIdempotencyToken()
if err := b.buildValue(member, child, mTag); err != nil {
return err
}
-
- fieldAdded = true
}
- if fieldAdded { // only append this child if we have one ore more valid members
+ // Only case where the child shape is not added is if the shape only contains
+ // non-payload fields, e.g headers/query.
+ if !(payloadFields == 0 && nonPayloadFields > 0) {
current.AddChild(child)
}