Skip to content

Commit

Permalink
[ProtocolTests] Serialize timestamps and enums nested into lists or m…
Browse files Browse the repository at this point in the history
…aps of Query String (#3272)

* Serialize timestamps and enums nested into lists or maps of Query String
  • Loading branch information
SergeyRyabinin authored Jan 30, 2025
1 parent 0f223eb commit 0c27d67
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 78 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ void AllQueryStringTypesRequest::AddQueryStringParameters(URI& uri) const
{
for(const auto& item : m_queryTimestampList)
{
ss << item;
ss << item.ToGmtString(Aws::Utils::DateFormat::ISO_8601);
uri.AddQueryStringParameter("TimestampList", ss.str());
ss.str("");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void OmitsSerializingEmptyListsRequest::AddQueryStringParameters(URI& uri) const
{
for(const auto& item : m_queryTimestampList)
{
ss << item;
ss << item.ToGmtString(Aws::Utils::DateFormat::ISO_8601);
uri.AddQueryStringParameter("TimestampList", ss.str());
ss.str("");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ void AllQueryStringTypesRequest::AddQueryStringParameters(URI& uri) const
{
for(const auto& item : m_queryTimestampList)
{
ss << item;
ss << item.ToGmtString(Aws::Utils::DateFormat::ISO_8601);
uri.AddQueryStringParameter("TimestampList", ss.str());
ss.str("");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,81 +3,7 @@ void ${typeInfo.className}::AddQueryStringParameters(URI& uri) const
Aws::StringStream ss;
#foreach($memberEntry in $shape.members.entrySet())
#if($memberEntry.value.usedForQueryString && !$memberEntry.value.customizedQuery)
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberEntry.key))
#set($spaces = '')
#if(!$memberEntry.value.required)
if($CppViewHelper.computeVariableHasBeenSetName($memberEntry.key))
{
#set($spaces = ' ')
#end
#if($memberEntry.value.shape.enum)
${spaces}ss << ${memberEntry.value.shape.name}Mapper::GetNameFor${memberEntry.value.shape.name}(${memberVarName});
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#elseif($memberEntry.value.shape.timeStamp)
${spaces}ss << ${memberVarName}.ToGmtString(Aws::Utils::DateFormat::$CppViewHelper.computeTimestampFormatInQueryString($memberEntry.value.shape));
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#elseif($memberEntry.value.shape.map)
${spaces}for(auto& item : ${memberVarName})
${spaces}{
#if(!$memberEntry.value.shape.mapValue.shape.list)
${spaces} ss << item.second;
${spaces} uri.AddQueryStringParameter(item.first.c_str(), ss.str());
${spaces} ss.str("");
#else##URL query Key has multiple values, multiply key per https://smithy.io/2.0/spec/http-bindings.html#id9
${spaces} for(auto& innerItem : item.second)
${spaces} {
${spaces} ss << innerItem;
${spaces} uri.AddQueryStringParameter(item.first.c_str(), ss.str());
${spaces} ss.str("");
${spaces} }
#end##if(!$memberEntry.value.shape.map.mapValue.shape.list)
${spaces}}
#elseif($memberEntry.value.shape.list)
${spaces}for(const auto& item : $memberVarName)
${spaces}{
#if($memberEntry.value.shape.listMember.shape.enum)
${spaces} ss << ${memberEntry.value.shape.listMember.shape.name}Mapper::GetNameFor${memberEntry.value.shape.listMember.shape.name}(item);
#else
${spaces} ss << item;
#end
${spaces} uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces} ss.str("");
${spaces}}
#else
#if($operation.arnEndpointAllowed && $operation.arnLocation.equals("querystring") && $operation.arnEndpointMemberName.equals($$memberEntry.key) && !$serviceModel.endpointRules))
${spaces}${metadata.classNamePrefix}ARN arn($CppViewHelper.computeMemberVariableName($operation.arnEndpointMemberName));
${spaces}if (arn && arn.Validate().IsSuccess())
${spaces}{
${spaces} if (arn.GetResourceType() == ARNResourceType::BUCKET)
${spaces} {
${spaces} ss << arn.GetResourceId();
${spaces} }
${spaces} else if (arn.GetResourceType() == ARNResourceType::OUTPOST)
${spaces} {
${spaces} ss << arn.GetSubResourceId();
${spaces} }
${spaces} else
${spaces} {
${spaces} // It's a valid ARN, but has incorrect resource type.
${spaces} assert(false);
${spaces} }
${spaces}}
${spaces}else
${spaces}{
${spaces} ss << ${memberVarName};
${spaces}}
#else
${spaces}ss << ${memberVarName};
#end
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#end
#if(!$memberEntry.value.required)
}

#end
#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/request/AddRequestQueryParameter.vm")
#end
#end
#if($shape.customizedQuery)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#macro( serializeElement $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)
${memberVarName}.ToGmtString(Aws::Utils::DateFormat::$CppViewHelper.computeTimestampFormatInQueryString($shapeMember.shape));
#else
$memberVarName;
#end
#end##macro serializeElement
#macro( serializeMap $spaces $shapeMember $memberVarName )
${spaces}for(auto& item : ${memberVarName})
${spaces}{
#if(!$shapeMember.shape.mapValue.shape.list)
${spaces} ss << #serializeElement($shapeMember.shape.mapValue, "item.second")
${spaces} uri.AddQueryStringParameter(item.first.c_str(), ss.str());
${spaces} ss.str("");
#else##URL query Key has multiple values, multiply key per https://smithy.io/2.0/spec/http-bindings.html#id9
${spaces} for(auto& innerItem : item.second)
${spaces} {
${spaces} ss << #serializeElement($shapeMember.shape.mapValue, "innerItem")
${spaces} uri.AddQueryStringParameter(item.first.c_str(), ss.str());
${spaces} ss.str("");
${spaces} }
#end##if(!$shapeMember.shape.map.mapValue.shape.list)
${spaces}}
#end##macro serializeMap
#macro( serializeList $spaces $shapeMember $memberVarName )
${spaces}for(const auto& item : $memberVarName)
${spaces}{
${spaces} ss << #serializeElement($shapeMember.shape.listMember, "item")
${spaces} uri.AddQueryStringParameter("${shapeMember.locationName}", ss.str());
${spaces} ss.str("");
${spaces}}
#end##macro serializeList
#set($memberVarName = $CppViewHelper.computeMemberVariableName($memberEntry.key))
#set($spaces = '')
#if(!$memberEntry.value.required)
if($CppViewHelper.computeVariableHasBeenSetName($memberEntry.key))
{
#set($spaces = ' ')
#end
#if($memberEntry.value.shape.map)
#serializeMap($spaces, $memberEntry.value, $memberVarName)
#elseif($memberEntry.value.shape.list)
#serializeList($spaces, $memberEntry.value, $memberVarName)
##TODO remove the check for enum and timestamp and the following block (everything until next "${spaces}ss << ${memberVarName};" once it is safe to remove endpoint rules check)
#elseif($memberEntry.value.shape.enum || $memberEntry.value.shape.timeStamp)
${spaces}ss << #serializeElement($memberEntry.value, $memberVarName)
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#else
#if($operation.arnEndpointAllowed && $operation.arnLocation.equals("querystring") && $operation.arnEndpointMemberName.equals($$memberEntry.key) && !$serviceModel.endpointRules))
${spaces}${metadata.classNamePrefix}ARN arn($CppViewHelper.computeMemberVariableName($operation.arnEndpointMemberName));
${spaces}if (arn && arn.Validate().IsSuccess())
${spaces}{
${spaces} if (arn.GetResourceType() == ARNResourceType::BUCKET)
${spaces} {
${spaces} ss << arn.GetResourceId();
${spaces} }
${spaces} else if (arn.GetResourceType() == ARNResourceType::OUTPOST)
${spaces} {
${spaces} ss << arn.GetSubResourceId();
${spaces} }
${spaces} else
${spaces} {
${spaces} // It's a valid ARN, but has incorrect resource type.
${spaces} assert(false);
${spaces} }
${spaces}}
${spaces}else
${spaces}{
${spaces} ss << ${memberVarName};
${spaces}}
#else
${spaces}ss << ${memberVarName};
#end
${spaces}uri.AddQueryStringParameter("${memberEntry.value.locationName}", ss.str());
${spaces}ss.str("");
#end
#if(!$memberEntry.value.required)
}

#end

0 comments on commit 0c27d67

Please sign in to comment.