in Libraries/src/Amazon.Lambda.RuntimeSupport/Bootstrap/UserCodeValidator.cs [137:226]
private static string CheckILambdaSerializerType(TypeInfo typeInfo)
{
if (!typeInfo.IsInterface)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_TypeNotInterface, typeInfo.FullName);
}
// check that the Deserialize method exists and is generic
var deserializeMethodInfo = typeInfo.GetMethod("Deserialize");
if (deserializeMethodInfo == null)
{
return Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodNotFound;
}
if (!deserializeMethodInfo.IsGenericMethod)
{
return Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodNotGeneric;
}
// verify that Stream is the only input
var deserializeInputs = deserializeMethodInfo.GetParameters();
if (deserializeInputs.Length != 1)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodHasTooManyParams, deserializeInputs.Length);
}
if (deserializeInputs[0].ParameterType != Types.StreamType)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodHasWrongParam, deserializeInputs[0].ParameterType.FullName,
Types.StreamType.FullName);
}
// verify that T is the return type
var deserializeOutputType = deserializeMethodInfo.ReturnType;
var deserializeGenericArguments = deserializeMethodInfo.GetGenericArguments();
if (deserializeGenericArguments.Length != 1)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodHasWrongNumberGenericArgs,
deserializeGenericArguments.Length);
}
if (deserializeGenericArguments[0] != deserializeOutputType)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_DeserializeMethodHasWrongReturn, deserializeOutputType.FullName);
}
// check that the Serialize method exists, is generic, and returns void
var serializeMethodInfo = typeInfo.GetMethod("Serialize");
if (serializeMethodInfo == null)
{
return Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodNotFound;
}
if (!serializeMethodInfo.IsGenericMethod)
{
return Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodNotGeneric;
}
if (serializeMethodInfo.ReturnType != Types.VoidType)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodHasWrongReturn, serializeMethodInfo.ReturnType.FullName);
}
// verify that T is the first input and Stream is the second input
var serializeInputs = serializeMethodInfo.GetParameters();
var serializeGenericArguments = serializeMethodInfo.GetGenericArguments();
if (serializeInputs.Length != 2)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodHasWrongNumberOfParameters, serializeInputs.Length);
}
if (serializeGenericArguments.Length != 1)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodHasWrongNumberGenericArgs, serializeGenericArguments.Length);
}
if (serializeInputs[0].ParameterType != serializeGenericArguments[0])
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodHasWrongFirstParam, serializeInputs[0].ParameterType.FullName);
}
if (serializeInputs[1].ParameterType != Types.StreamType)
{
return LambdaExceptions.FormatMessage(Errors.UserCodeLoader.ILambdaSerializerMismatch_SerializeMethodHasWrongSecondParam, serializeInputs[1].ParameterType.FullName,
Types.StreamType.FullName);
}
// all good!
return null;
}