in Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/GeneratedMethodModelBuilder.cs [119:191]
private static IList<ParameterModel> BuildParameters(IMethodSymbol lambdaMethodSymbol,
LambdaMethodModel lambdaMethodModel, GeneratorExecutionContext context)
{
var parameters = new List<ParameterModel>();
var contextParameter = new ParameterModel
{
Name = "context",
Type = new TypeModel
{
FullName = TypeFullNames.ILambdaContext
}
};
if (lambdaMethodSymbol.HasAttribute(context, TypeFullNames.RestApiAttribute))
{
var symbol = context.Compilation.GetTypeByMetadataName(TypeFullNames.APIGatewayProxyRequest);
var type = TypeModelBuilder.Build(symbol, context);
var requestParameter = new ParameterModel
{
Name = "request",
Type = type
};
parameters.Add(requestParameter);
parameters.Add(contextParameter);
}
else if (lambdaMethodSymbol.HasAttribute(context, TypeFullNames.HttpApiAttribute))
{
var version = GetHttpApiVersion(lambdaMethodSymbol, context);
TypeModel type;
switch (version)
{
case HttpApiVersion.V1:
{
var symbol = context.Compilation.GetTypeByMetadataName(TypeFullNames.APIGatewayProxyRequest);
type = TypeModelBuilder.Build(symbol, context);
break;
}
case HttpApiVersion.V2:
{
var symbol = context.Compilation.GetTypeByMetadataName(TypeFullNames.APIGatewayHttpApiV2ProxyRequest);
type = TypeModelBuilder.Build(symbol, context);
break;
}
default:
throw new ArgumentOutOfRangeException();
}
var requestParameter = new ParameterModel
{
Name = "request",
Type = type
};
parameters.Add(requestParameter);
parameters.Add(contextParameter);
}
else
{
// Lambda method with no event attribute are plain lambda functions, therefore, generated method will have
// same parameter as original method except DI injected parameters
foreach (var param in lambdaMethodModel.Parameters)
{
if (param.Attributes.Any(att => att.Type.FullName == TypeFullNames.FromServiceAttribute))
{
continue;
}
parameters.Add(param);
}
}
return parameters;
}