#@ template language="C#" inherits="BaseRequestMarshaller" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#
AddLicenseHeader();
AddCommonUsingStatements();
#>
namespace <#=this.Config.Namespace #>.Model.Internal.MarshallTransformations
{
///
/// <#=this.Operation.Name #> Request Marshaller
///
public class <#=this.Operation.Name #>RequestMarshaller : IMarshallerRequest> , IMarshaller
{
///
/// Marshaller the request object to the HTTP request.
///
///
///
public IRequest Marshall(AmazonWebServiceRequest input)
{
return this.Marshall((<#=this.Operation.Name#>Request)input);
}
///
/// Marshaller the request object to the HTTP request.
///
///
///
public IRequest Marshall(<#=this.Operation.Name #>Request publicRequest)
{
IRequest request = new DefaultRequest(publicRequest, "<#=this.Config.Namespace#>");
request.Parameters.Add("Action", "<#=this.Operation.Name #>");
request.Parameters.Add("Version", "<#=this.Config.ServiceModel.APIVersion#>");
if(publicRequest != null)
{
<#
var requestStructure = this.Operation.RequestStructure;
if(requestStructure != null)
ProcessMembers(0, "", "publicRequest", requestStructure.Members);
#>
}
return request;
}
<#
this.AddRequestSingletonMethod();
#>
}
}
<#+
void ProcessMembers(int level, string parameterContext, string variableName, IEnumerable members)
{
string variableNameFragment = variableName.Replace(".", string.Empty);
foreach(var member in members)
{
if (GeneratorHelpers.UseCustomMarshall(member, this.Operation))
continue;
var marshallName = GeneratorHelpers.DetermineAWSQueryMarshallName(member, this.Operation);
#>
<#=new string(' ', level * 4)#> if(<#=variableName#>.IsSet<#=member.PropertyName#>())
<#=new string(' ', level * 4)#> {
<#+
if(member.IsList )
{
string context = ComposeContext(parameterContext, marshallName);
string listItemContext = ComposeContext(context,
GeneratorHelpers.DetermineAWSQueryListMemberPrefix(member),
variableNameFragment + "listValueIndex",
GeneratorHelpers.DetermineAWSQueryListMemberSuffix(this.Operation, member));
#>
<#=new string(' ', level * 4)#> int <#=variableNameFragment#>listValueIndex = 1;
<#=new string(' ', level * 4)#> foreach(var <#=variableNameFragment#>listValue in <#=variableName#>.<#=member.PropertyName#>)
<#=new string(' ', level * 4)#> {
<#+
if(member.Shape.ListShape.IsStructure)
{
ProcessMembers(level + 2, listItemContext, variableNameFragment + "listValue", member.Shape.ListShape.Members);
}
else
{
if(string.IsNullOrEmpty(member.CustomMarshallerTransformation))
{
#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=listItemContext#>, <#=member.Shape.ListShape.PrimitiveMarshaller(MarshallLocation.Body)#>(<#=variableNameFragment#>listValue));
<#+
}
else
{
#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=listItemContext#>, <#=member.CustomMarshallerTransformation + "(" + variableNameFragment + "listValue)"#>);
<#+
}
}
#>
<#=new string(' ', level * 4)#> <#=variableNameFragment#>listValueIndex++;
<#=new string(' ', level * 4)#> }
<#+
}
else if(member.IsMap)
{
string context = ComposeContext(parameterContext, marshallName);
string mapItemContext = ComposeContext(context, member.Shape.IsFlattened ? "" : "entry", "mapIndex");
string mapKeyContext = ComposeContext(mapItemContext, member.Shape.KeyMarshallName);
string mapValueContext = ComposeContext(mapItemContext, member.Shape.ValueMarshallName);
#>
<#=new string(' ', level * 4)#> int mapIndex = 1;
<#=new string(' ', level * 4)#> foreach(var key in <#=variableName#>.<#=member.PropertyName#>.Keys)
<#=new string(' ', level * 4)#> {
<#=new string(' ', level * 4)#> <#= member.Shape.ValueShape.IsStructure ? member.Shape.ValueShape.Name : member.Shape.ValueShape.GetPrimitiveType() #> value;
<#=new string(' ', level * 4)#> bool hasValue = <#=variableName#>.<#=member.PropertyName#>.TryGetValue(key, out value);
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=mapKeyContext#>, <#=member.Shape.KeyShape.PrimitiveMarshaller(MarshallLocation.Body)#>(key));
<#=new string(' ', level * 4)#> if (hasValue)
<#=new string(' ', level * 4)#> {
<#+
if(member.Shape.ValueShape.IsStructure)
{
ProcessMembers(level + 3, mapValueContext, "value", member.Shape.ValueShape.Members);
}
else
{
if(string.IsNullOrEmpty(member.CustomMarshallerTransformation))
{
#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=mapValueContext#>, <#=member.Shape.ValueShape.PrimitiveMarshaller(MarshallLocation.Body)#>(value));
<#+
}
else
{#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=mapValueContext#>, <#=member.CustomMarshallerTransformation + "(value)"#>);
<#+
}
}
#>
<#=new string(' ', level * 4)#> }
<#=new string(' ', level * 4)#> mapIndex++;
<#=new string(' ', level * 4)#> }
<#+
}
else if(member.IsStructure)
{
string context = ComposeContext(parameterContext, marshallName);
ProcessMembers(level + 1, context, variableName + "." + member.PropertyName, member.Shape.Members);
}
else
{
string context = ComposeContext(parameterContext, marshallName);
string memberProperty = variableName + "." + member.PropertyName + (member.UseNullable ? ".Value" : string.Empty);
if(string.IsNullOrEmpty(member.CustomMarshallerTransformation))
{
#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=context#>, <#=member.PrimitiveMarshaller#>(<#=memberProperty#>));
<#+
}
else
{#>
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=context#>, <#=member.CustomMarshallerTransformation#>(<#=memberProperty#>));
<#+
}
if(member.IsIdempotent)
{
#>
<#=new string(' ', level * 4)#> }
<#=new string(' ', level * 4)#> else if(!(<#=variableName#>.IsSet<#=member.PropertyName#>()))
<#=new string(' ', level * 4)#> {
<#=new string(' ', level * 4)#> request.Parameters.Add(<#=context#>, StringUtils.FromString(Guid.NewGuid().ToString()));
<#+
}
}
#>
<#=new string(' ', level * 4)#> }
<#+
}
}
string ComposeContext(string context, string marshallName)
{
return ComposeContext(context, marshallName, null, null);
}
string ComposeContext(string context, string marshallName, string variableName)
{
return ComposeContext(context, marshallName, variableName, null);
}
string ComposeContext(string context, string marshallName, string variableName, string suffixMember)
{
string nc = context;
if (!string.IsNullOrEmpty(marshallName))
nc = AppendText(nc, marshallName);
if (!string.IsNullOrEmpty(variableName))
nc = AppendVariable(nc, variableName);
if (!string.IsNullOrEmpty(suffixMember))
nc = AppendText(nc, suffixMember);
return nc;
}
private static char quoteChar = '\"';
private static string quote = quoteChar.ToString();
string AppendVariable(string context, string variable)
{
variable = variable.Trim(quoteChar);
return Append(context, variable);
}
string AppendText(string context, string text)
{
if (!text.StartsWith(quote))
text = quote + text;
if (!text.EndsWith(quote))
text = text + quote;
return Append(context, text);
}
string Append(string context, string text)
{
string nc = context;
if (!string.IsNullOrEmpty(nc) && !nc.EndsWith("."))
nc += " + \".\" + ";
nc += text;
return nc;
}
#>