Skip to content

Commit

Permalink
[ProtocolTests] Union type dereference and XML nested maps/lists seri…
Browse files Browse the repository at this point in the history
…alization
  • Loading branch information
SergeyRyabinin committed Feb 26, 2025
1 parent f8d10ef commit 1036061
Show file tree
Hide file tree
Showing 9 changed files with 135 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,11 @@ ${spaces}}
#elseif($member.value.shape.enum)
${spaces}ss << "${location}=" << ${member.value.shape.name}Mapper::GetNameFor${member.value.shape.name}(${memberVarName}) << "&";
#elseif($member.value.shape.structure)
#if($member.shape.isMutuallyReferencedWith($shape) || $member.shape.getName() == $shape.getName())
${spaces}${memberVarName}->OutputToStream(ss, "${location}");
#else
${spaces}${memberVarName}.OutputToStream(ss, "${location}");
#end
#elseif($member.value.shape.double)
${spaces}ss << "${location}=" << StringUtils::URLEncode(${memberVarName}) << "&";
#elseif($member.value.shape.boolean)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@ void ${typeInfo.className}::OutputToStream(Aws::OStream& oStream, const char* lo
#if($member.shape.structure)
${spaces}Aws::StringStream ${lowerCaseVarName}LocationAndMemberSs;
${spaces}${lowerCaseVarName}LocationAndMemberSs << location << index << locationValue << ".${memberName}";
#if($member.shape.isMutuallyReferencedWith($shape) || $member.shape.getName() == $shape.getName())
${spaces}${memberVarName}->OutputToStream(oStream, ${lowerCaseVarName}LocationAndMemberSs.str().c_str());
#else
${spaces}${memberVarName}.OutputToStream(oStream, ${lowerCaseVarName}LocationAndMemberSs.str().c_str());
#end
#elseif($member.shape.string)
${spaces}oStream << location << index << locationValue << ".${memberName}=" << StringUtils::URLEncode(${memberVarName}.c_str()) << "&";
#elseif($member.shape.timeStamp)
Expand Down Expand Up @@ -211,7 +215,11 @@ void ${typeInfo.className}::OutputToStream(Aws::OStream& oStream, const char* lo
#if($member.shape.structure)
${spaces}Aws::String ${lowerCaseVarName}LocationAndMember(location);
${spaces}${lowerCaseVarName}LocationAndMember += ".${memberName}";
#if($member.shape.isMutuallyReferencedWith($shape) || $member.shape.getName() == $shape.getName())
${spaces}${memberVarName}->OutputToStream(oStream, ${lowerCaseVarName}LocationAndMember.c_str());
#else
${spaces}${memberVarName}.OutputToStream(oStream, ${lowerCaseVarName}LocationAndMember.c_str());
#end
#elseif($member.shape.string)
${spaces}oStream << location << ".${memberName}=" << StringUtils::URLEncode(${memberVarName}.c_str()) << "&";
#elseif($member.shape.timeStamp)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,104 +1,6 @@
##-------------------- serializeElementToText macro
#macro( serializeElementToText $shapeMember $memberVarName )
##/* --- the actual shape member is $shapeMember; the actual shape is $shapeMember.shape; --- */
#if($shapeMember.shape.enum)
${shapeMember.shape.name}Mapper::GetNameFor${shapeMember.shape.name}(${memberVarName})##
#elseif($shapeMember.shape.timeStamp)
#if($member.shape.timestampFormat != "unixTimestamp")
#set($macro.timestamptFormatStr = $CppViewHelper.computeTimestampFormatInXml($shapeMember.shape))
${memberVarName}.ToGmtString(Aws::Utils::DateFormat::${macro.timestamptFormatStr})##
#else
StringUtils::to_string(${memberVarName}.Seconds())##
#end
#elseif($shapeMember.shape.boolean)
std::boolalpha << ${memberVarName}##
#elseif($shapeMember.shape.blob)
HashingUtils::Base64Encode(${memberVarName})##
#else
${memberVarName}##
#end
#end##macro serializeElementToText
##-------------------- serializeXmlPayloadElement macro
#macro( serializeXmlPayloadElement $spaces $serializationName $lowerCaseVarName $shapeMember $memberVarName $parentNode="parentNode")
#if($shapeMember.xmlAttribute)
#if($shapeMember.shape.boolean || $shapeMember.shape.primitive)
${spaces}ss << #serializeElementToText($shapeMember, $memberVarName);
${spaces}${parentNode}.SetAttributeValue("${serializationName}", ss.str());
${spaces}ss.str("");
#else
${spaces}${parentNode}.SetAttributeValue("${serializationName}", #serializeElementToText($shapeMember, $memberVarName));
#end
#else##($shapeMember.xmlAttribute)
${spaces}XmlNode ${lowerCaseVarName}Node = ${parentNode}.CreateChildElement("${serializationName}");
#if($shapeMember.shape.boolean || $shapeMember.shape.primitive)
${spaces}ss << #serializeElementToText($shapeMember, $memberVarName);
${spaces}${lowerCaseVarName}Node.SetText(ss.str());
${spaces}ss.str("");
#else
#if($shapeMember.shape.structure)
#if($shapeMember.shape.isMutuallyReferencedWith($shape) || $member.value.shape.getName() == $shape.getName())
${spaces}${memberVarName}->AddToNode(${lowerCaseVarName}Node);
#else
${spaces}${memberVarName}.AddToNode(${lowerCaseVarName}Node);
#end
#else
${spaces}${lowerCaseVarName}Node.SetText(#serializeElementToText($shapeMember, $memberVarName));
#end
#end
#end
#end##macro serializeXmlPayloadElement
##-------------------- serializeXmlListPayloadElement macro
#macro( serializeXmlListPayloadElement $spaces $serializationName $lowerCaseVarName $member $memberVarName )
#if(!($member.locationName && $member.shape.flattened) && !(${member.shape.listMember.locationName} && ${member.isFlattened()}))
${spaces}XmlNode ${lowerCaseVarName}ParentNode = parentNode.CreateChildElement("${serializationName}");
#end
${spaces}for(const auto& item : $memberVarName)
${spaces}{
#set($macro.listElParentNode = "parentNode")
#set($macro.listElSerializationName = "")
#if($member.locationName && $member.shape.flattened)
#set($macro.listElSerializationName = ${member.locationName})
#elseif(${member.shape.listMember.locationName} && ${member.isFlattened()})
#set($macro.listElSerializationName = ${member.shape.listMember.locationName})
#elseif(${member.shape.listMember.locationName})
#set($macro.listElSerializationName = ${member.shape.listMember.locationName})
#set($macro.listElParentNode = "${lowerCaseVarName}ParentNode")
#else
#set($macro.listElSerializationName = ${member.shape.listMember.shape.name})
#set($macro.listElParentNode = "${lowerCaseVarName}ParentNode")
#end
#set($macro.listSpaces = $spaces + " ")
#serializeXmlPayloadElement($macro.listSpaces, $macro.listElSerializationName, $lowerCaseVarName, $member.shape.listMember, "item", $macro.listElParentNode)
${spaces}}
#end##macro serializeXmlListPayloadElement
##-------------------- serializeXmlMapPayloadElement macro
#macro( serializeXmlMapPayloadElement $spaces $serializationName $lowerCaseVarName $member $memberVarName )
##https://smithy.io/2.0/spec/protocol-traits.html#xml-map-serialization
##TODO: might not be 100% correct, pending validation by protocol tests
##// /* --- the actual shape member is $member; the actual shape is $member.shape; --- */
##// /* --- key member: ${member.shape.mapKey} */
##// /* --- key shape: ${member.shape.mapKey.shape} */
##// /* --- key member: ${member.shape.mapValue} */
##// /* --- key shape: ${member.shape.mapValue.shape} */
#set($macro.mapEntryParentNode = "parentNode")
#if(!($member.locationName && $member.shape.flattened))
${spaces}XmlNode ${lowerCaseVarName}ParentNode = parentNode.CreateChildElement("${serializationName}");
#set($macro.mapEntryParentNode = "${lowerCaseVarName}ParentNode")
#end
${spaces}for(const auto& mapItem : $memberVarName)
${spaces}{
#set($macro.mapSpaces = $spaces + " ")
#set($macro.mapEntrySerializationName = "#if($member.locationName)$member.locationName#{else}entry#end")
${spaces} XmlNode ${lowerCaseVarName}MapEntryNode = ${macro.mapEntryParentNode}.CreateChildElement("${macro.mapEntrySerializationName}");
#set($macro.mapKeySerializationName = "#if($member.shape.mapKey.locationName)$member.shape.mapKey.locationName#{else}key#end")
#serializeXmlPayloadElement($macro.mapSpaces, $macro.mapKeySerializationName, "${lowerCaseVarName}Key", $member.shape.mapKey, "mapItem.first", "${lowerCaseVarName}MapEntryNode")
#set($macro.mapValueSerializationName = "#if($member.shape.mapValue.locationName)$member.shape.mapValue.locationName#{else}value#end")
#serializeXmlPayloadElement($macro.mapSpaces, $macro.mapValueSerializationName, "${lowerCaseVarName}Value", $member.shape.mapValue, "mapItem.second", "${lowerCaseVarName}MapEntryNode")
${spaces}}
#end##macro serializeXmlMapPayloadElement
##-------------------- END OF MACROS, ACTUAL TEMPLATE BEGINS --------------------
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlSerializeTemplateMacros/AllXmlSerializeTemplateMacros.vm")
#if($member.shape.enum || $member.shape.boolean || $member.shape.primitive || $member.shape.timeStamp || $member.shape.structure || $member.shape.blob)
#serializeXmlPayloadElement($spaces, $serializationName, $lowerCaseVarName, $member, $memberVarName)
#serializeXmlSinglePayloadElement($spaces, $serializationName, $lowerCaseVarName, $member, $memberVarName)
#elseif($member.shape.string)
#if($member.xmlAttribute)
${spaces}parentNode.SetAttributeValue("${serializationName}", ${memberVarName});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
if(!${lowerCaseVarName}Node.IsNull())
#end
{
#if($member.shape.isMutuallyReferencedWith($shape) || $member.value.shape.getName() == $shape.getName())
#if($member.shape.isMutuallyReferencedWith($shape) || $member.shape.getName() == $shape.getName())
${memberVarName} = Aws::MakeShared<$CppViewHelper.computeCppType($member.shape)>("${typeInfo.className}", #deserializeXmlSingleElement($member, $srcXmlarName, "", true));
#else
${memberVarName} = #deserializeXmlSingleElement($member, $srcXmlarName, "", true);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlSerializeTemplateMacros/serializeXmlListPayloadElement.vm")
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlSerializeTemplateMacros/serializeXmlMapPayloadElement.vm")
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlSerializeTemplateMacros/serializeXmlSingleElementToText.vm")
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlSerializeTemplateMacros/serializeXmlSinglePayloadElement.vm")
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
##-------------------- serializeXmlListPayloadElement macro
#macro( serializeXmlListPayloadElement $spaces $serializationName $lowerCaseVarName $member $memberVarName $isNested=false $parentNode="parentNode" )
## // /* --- the actual shape member is $member; */
## // /* --- the actual shape is $member.shape; --- */
## // /* --- list member: ${member.shape.listMember} */
#set($macro.listMemberParentNode = $parentNode)
#if(!$isNested && !($member.locationName && $member.shape.flattened) && !(${member.shape.listMember.locationName} && ${member.isFlattened()}))
${spaces}XmlNode ${lowerCaseVarName}ParentNode = ${parentNode}.CreateChildElement("${serializationName}");
#set($macro.listMemberParentNode = "${lowerCaseVarName}ParentNode")
#end
#if($macro.listMemberParentNode == "${lowerCaseVarName}Node")
#set($lowerCaseVarName = "${lowerCaseVarName}Nested")
#end
#set($macro.listItemVarName = "item")
#if($memberVarName == "item")
#set($macro.listItemVarName = "${lowerCaseVarName}Item")
#end
${spaces}for(const auto& $macro.listItemVarName : $memberVarName)
${spaces}{
#set($macro.listSpaces = $spaces + " ")
#set($macro.listMemberSerializationName = ${CppViewHelper.ifNotNullOrEmpty($member.shape.listMember.locationName, "member")})
#if($member.isFlattened() || $member.shape.flattened || $isNested)
## if list is flattened than the name of repeated XML element is ShapeMember name in parent name OR explicitly set by parent's locationName
#set($macro.listMemberSerializationName = ${CppViewHelper.ifNotNullOrEmpty($member.locationName, $serializationName)})
#end
#serializeXmlSinglePayloadElement($macro.listSpaces, $macro.listMemberSerializationName, $lowerCaseVarName, $member.shape.listMember, $macro.listItemVarName, $macro.listMemberParentNode)
${spaces}}
#end##macro serializeXmlListPayloadElement
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
##-------------------- serializeXmlMapPayloadElement macro
#macro( serializeXmlMapPayloadElement $spaces $serializationName $lowerCaseVarName $member $memberVarName $isNested=false $parentNode="parentNode" )
##https://smithy.io/2.0/spec/protocol-traits.html#xml-map-serialization
##TODO: might not be 100% correct, pending validation by protocol tests
##// /* --- the actual shape member is $member; the actual shape is $member.shape; --- */
##// /* --- key member: ${member.shape.mapKey} */
##// /* --- key shape: ${member.shape.mapKey.shape} */
##// /* --- key member: ${member.shape.mapValue} */
##// /* --- key shape: ${member.shape.mapValue.shape} */
#set($macro.mapEntryParentNode = $parentNode)
#if(!$isNested && !($member.locationName && $member.shape.flattened))
##Nested maps appear to be always flattened
${spaces}XmlNode ${lowerCaseVarName}ParentNode = ${parentNode}.CreateChildElement("${serializationName}");
#set($macro.mapEntryParentNode = "${lowerCaseVarName}ParentNode")
#end
#set($macro.mapItemVarName = "mapItem")
#if($memberVarName == "mapItem.second")
#set($macro.mapItemVarName = "${lowerCaseVarName}NestedItem")
#end
${spaces}for(const auto& $macro.mapItemVarName : $memberVarName)
${spaces}{
#set($macro.mapSpaces = $spaces + " ")
#set($macro.mapEntrySerializationName = "#if($member.locationName)$member.locationName#{else}entry#end")
${spaces} XmlNode ${lowerCaseVarName}MapEntryNode = ${macro.mapEntryParentNode}.CreateChildElement("${macro.mapEntrySerializationName}");
#set($macro.mapKeySerializationName = "#if($member.shape.mapKey.locationName)$member.shape.mapKey.locationName#{else}key#end")
#serializeXmlSinglePayloadElement($macro.mapSpaces, $macro.mapKeySerializationName, "${lowerCaseVarName}Key", $member.shape.mapKey, "${macro.mapItemVarName}.first", "${lowerCaseVarName}MapEntryNode")
#set($macro.mapValueSerializationName = "#if($member.shape.mapValue.locationName)$member.shape.mapValue.locationName#{else}value#end")
#serializeXmlSinglePayloadElement($macro.mapSpaces, $macro.mapValueSerializationName, "${lowerCaseVarName}Value", $member.shape.mapValue, "${macro.mapItemVarName}.second", "${lowerCaseVarName}MapEntryNode")
${spaces}}
#end##macro serializeXmlMapPayloadElement
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
##-------------------- serializeXmlSingleElementToText macro
#macro( serializeXmlSingleElementToText $shapeMember $memberVarName $parentNode="parentNode" )
##/* --- the actual shape member is $shapeMember; the actual shape is $shapeMember.shape; --- */
#if($shapeMember.shape.enum)
${shapeMember.shape.name}Mapper::GetNameFor${shapeMember.shape.name}(${memberVarName})##
#elseif($shapeMember.shape.timeStamp)
#if($member.shape.timestampFormat != "unixTimestamp")
#set($macro.timestamptFormatStr = $CppViewHelper.computeTimestampFormatInXml($shapeMember.shape))
${memberVarName}.ToGmtString(Aws::Utils::DateFormat::${macro.timestamptFormatStr})##
#else
StringUtils::to_string(${memberVarName}.Seconds())##
#end
#elseif($shapeMember.shape.boolean)
std::boolalpha << ${memberVarName}##
#elseif($shapeMember.shape.blob)
HashingUtils::Base64Encode(${memberVarName})##
#elseif($shapeMember.shape.primitive || $shapeMember.shape.string)
${memberVarName}##
#else
${memberVarName} /* serialization to text guessed for unknown shape type ${shapeMember.shape.type} */##
#end
#end##macro serializeXmlSingleElementToText
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
##-------------------- serializeXmlSinglePayloadElement macro
#macro( serializeXmlSinglePayloadElement $spaces $serializationName $lowerCaseVarName $shapeMember $memberVarName $parentNode="parentNode")
#if($shapeMember.xmlAttribute)
## member should be serialized an XML Attribute
#if($shapeMember.shape.boolean || $shapeMember.shape.primitive)
${spaces}ss << #serializeXmlSingleElementToText($shapeMember, $memberVarName);
${spaces}${parentNode}.SetAttributeValue("${serializationName}", ss.str());
${spaces}ss.str("");
#else
${spaces}${parentNode}.SetAttributeValue("${serializationName}", #serializeXmlSingleElementToText($shapeMember, $memberVarName));
#end
#break##return
#end##($shapeMember.xmlAttribute)
## member should be serialized to an XML Element not Attribute
${spaces}XmlNode ${lowerCaseVarName}Node = ${parentNode}.CreateChildElement("${serializationName}");
#if($shapeMember.shape.boolean || $shapeMember.shape.primitive)
${spaces}ss << #serializeXmlSingleElementToText($shapeMember, $memberVarName);
${spaces}${lowerCaseVarName}Node.SetText(ss.str());
${spaces}ss.str("");
#else
#if($shapeMember.shape.structure)
#if($shapeMember.shape.isMutuallyReferencedWith($shape) || $member.shape.getName() == $shape.getName())
##Also covers the union case
${spaces}${memberVarName}->AddToNode(${lowerCaseVarName}Node);
#else
${spaces}${memberVarName}.AddToNode(${lowerCaseVarName}Node);
#end
#elseif($shapeMember.shape.list)
#serializeXmlListPayloadElement($spaces, $serializationName, $lowerCaseVarName, $shapeMember, $memberVarName, true, "${lowerCaseVarName}Node")
#elseif($shapeMember.shape.map)
#serializeXmlMapPayloadElement($spaces, $serializationName, $lowerCaseVarName, $shapeMember, $memberVarName, true, "${lowerCaseVarName}Node")
#else
${spaces}${lowerCaseVarName}Node.SetText(#serializeXmlSingleElementToText($shapeMember, $memberVarName));
#end
#end
#end##macro serializeXmlSinglePayloadElement

0 comments on commit 1036061

Please sign in to comment.