in openapi-diff/src/modeler/AutoRest.Swagger/Model/Operation.cs [181:249]
private void CheckParameters(ComparisonContext<ServiceDefinition> context, Operation priorOperation)
{
ServiceDefinition currentRoot = context.CurrentRoot;
ServiceDefinition previousRoot = context.PreviousRoot;
context.PushProperty("parameters");
List<(SwaggerParameter param, bool isGlobal)> currParamsResolved =
Parameters.Select(param => ResolveParam(param, currentRoot)).ToList();
List<(SwaggerParameter param, bool isGlobal)> priorParamsResolved =
priorOperation.Parameters.Select(param => ResolveParam(param, previousRoot)).ToList();
DetectChangedParameterLocation(context, currParamsResolved, priorParamsResolved);
DetectChangedParameterOrder(context, currParamsResolved, priorParamsResolved);
foreach (var paramInfo in priorParamsResolved)
{
(SwaggerParameter oldParam, bool _) = paramInfo;
SwaggerParameter newParam = FindParameterEx(oldParam, Parameters, currentRoot.Parameters);
// we should use PushItemByName instead of PushProperty because Swagger `parameters` is
// an array of parameters.
context.PushItemByName(oldParam.Name);
if (newParam != null)
{
newParam.Compare(context, oldParam);
}
else if (oldParam.IsRequired)
{
// Removed required parameter
context.LogBreakingChange(ComparisonMessages.RemovedRequiredParameter, oldParam.Name);
} else {
// Removed optional parameter
context.LogBreakingChange(ComparisonMessages.RemovedOptionalParameter, oldParam.Name);
}
context.Pop();
}
// Check that no required or optional parameters were added.
List<SwaggerParameter> allParameters = Parameters.Select(
param =>
string.IsNullOrWhiteSpace(param.Reference)
? param
: FindReferencedParameter(param.Reference, currentRoot.Parameters))
.Where(p => p != null).ToList();
foreach (SwaggerParameter newParam in allParameters)
{
SwaggerParameter oldParam = FindParameterEx(newParam, priorOperation.Parameters, previousRoot.Parameters);
if (oldParam != null)
continue;
// Did not find required parameter in the old swagger i.e. required parameter is added
context.PushItemByName(newParam.Name);
context.LogBreakingChange(
newParam.IsRequired
? ComparisonMessages.AddingRequiredParameter
: ComparisonMessages.AddingOptionalParameter,
newParam.Name);
context.Pop();
}
context.Pop();
}