in runtime/serde/serde-xml/common/src/aws/smithy/kotlin/runtime/serde/xml/XmlDeserializer.kt [37:68]
override fun deserializeStruct(descriptor: SdkObjectDescriptor): Deserializer.FieldIterator {
if (firstStructCall) {
if (!descriptor.hasTrait<XmlSerialName>()) throw DeserializationException("Top-level struct $descriptor requires a XmlSerialName trait but has none.")
firstStructCall = false
reader.nextToken() // Matching field descriptors to children tags so consume the start element of top-level struct
val structToken = if (descriptor.hasTrait<XmlError>()) {
reader.seek<XmlToken.BeginElement> { it.name == descriptor.expectTrait<XmlError>().errorTag }
} else {
reader.seek<XmlToken.BeginElement>()
} ?: throw DeserializationException("Could not find a begin element for new struct")
if (validateRootElement) {
descriptor.requireNameMatch(structToken.name.tag)
}
}
// Consume any remaining terminating tokens from previous deserialization
reader.seek<XmlToken.BeginElement>()
// Because attributes set on the root node of the struct, we must read the values before creating the subtree
val attribFields = reader.tokenAttributesToFieldLocations(descriptor)
val parentToken = if (reader.lastToken is XmlToken.BeginElement) {
reader.lastToken as XmlToken.BeginElement
} else {
throw DeserializationException("Expected last parsed token to be ${XmlToken.BeginElement::class} but was ${reader.lastToken}")
}
return XmlStructDeserializer(descriptor, reader.subTreeReader(), parentToken, attribFields)
}