in Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Validation/LambdaFunctionValidator.cs [91:161]
private static void ValidateApiGatewayEvents(LambdaFunctionModel lambdaFunctionModel, Location methodLocation, List<Diagnostic> diagnostics)
{
// If the method does not contain any APIGatewayEvents, then it cannot return IHttpResults and can also not have parameters that are annotated with HTTP API attributes
if (!lambdaFunctionModel.LambdaMethod.Events.Contains(EventType.API))
{
if (lambdaFunctionModel.LambdaMethod.ReturnsIHttpResults)
{
diagnostics.Add(Diagnostic.Create(DiagnosticDescriptors.HttpResultsOnNonApiFunction, methodLocation));
}
foreach (var parameter in lambdaFunctionModel.LambdaMethod.Parameters)
{
if (parameter.Attributes.Any(att =>
att.Type.FullName == TypeFullNames.FromBodyAttribute ||
att.Type.FullName == TypeFullNames.FromHeaderAttribute ||
att.Type.FullName == TypeFullNames.FromRouteAttribute ||
att.Type.FullName == TypeFullNames.FromQueryAttribute))
{
diagnostics.Add(Diagnostic.Create(DiagnosticDescriptors.ApiParametersOnNonApiFunction, methodLocation));
}
}
return;
}
// Validate FromRoute, FromQuery and FromHeader parameters
foreach (var parameter in lambdaFunctionModel.LambdaMethod.Parameters)
{
if (parameter.Attributes.Any(att => att.Type.FullName == TypeFullNames.FromQueryAttribute))
{
var fromQueryAttribute = parameter.Attributes.First(att => att.Type.FullName == TypeFullNames.FromQueryAttribute) as AttributeModel<APIGateway.FromQueryAttribute>;
// Use parameter name as key, if Name has not specified explicitly in the attribute definition.
var parameterKey = fromQueryAttribute?.Data?.Name ?? parameter.Name;
if (!parameter.Type.IsPrimitiveType() && !parameter.Type.IsPrimitiveEnumerableType())
{
diagnostics.Add(Diagnostic.Create(DiagnosticDescriptors.UnsupportedMethodParameterType, methodLocation, parameter.Name, parameter.Type.FullName));
}
}
foreach (var att in parameter.Attributes)
{
var parameterAttributeName = string.Empty;
switch (att.Type.FullName)
{
case TypeFullNames.FromQueryAttribute:
var fromQueryAttribute = (AttributeModel<APIGateway.FromQueryAttribute>)att;
parameterAttributeName = fromQueryAttribute.Data.Name;
break;
case TypeFullNames.FromRouteAttribute:
var fromRouteAttribute = (AttributeModel<APIGateway.FromRouteAttribute>)att;
parameterAttributeName = fromRouteAttribute.Data.Name;
break;
case TypeFullNames.FromHeaderAttribute:
var fromHeaderAttribute = (AttributeModel<APIGateway.FromHeaderAttribute>)att;
parameterAttributeName = fromHeaderAttribute.Data.Name;
break;
default:
break;
}
if (!string.IsNullOrEmpty(parameterAttributeName) && !_parameterAttributeNameRegex.IsMatch(parameterAttributeName))
{
diagnostics.Add(Diagnostic.Create(DiagnosticDescriptors.InvalidParameterAttributeName, methodLocation, parameterAttributeName, parameter.Name));
}
}
}
}