in src/Core/Compiling/Policy/RateLimitCompiler.cs [18:79]
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<RateLimitConfig>(context, "rate-limit", out var values))
{
return;
}
var element = new XElement("rate-limit");
if (!element.AddAttribute(values, nameof(RateLimitConfig.Calls), "calls"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"rate-limit-by-key",
nameof(RateLimitConfig.Calls)
));
return;
}
if (!element.AddAttribute(values, nameof(RateLimitConfig.RenewalPeriod), "renewal-period"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"rate-limit-by-key",
nameof(RateLimitConfig.RenewalPeriod)
));
return;
}
element.AddAttribute(values, nameof(RateLimitConfig.RetryAfterHeaderName), "retry-after-header-name");
element.AddAttribute(values, nameof(RateLimitConfig.RetryAfterVariableName), "retry-after-variable-name");
element.AddAttribute(values, nameof(RateLimitConfig.RemainingCallsHeaderName), "remaining-calls-header-name");
element.AddAttribute(values, nameof(RateLimitConfig.RemainingCallsVariableName), "remaining-calls-variable-name");
element.AddAttribute(values, nameof(RateLimitConfig.TotalCallsHeaderName), "total-calls-header-name");
if (values.TryGetValue(nameof(RateLimitConfig.Apis), out var apis))
{
foreach (var api in apis.UnnamedValues!)
{
if(!Handle(context, "api", api, out var apiElement))
{
continue;
}
element.Add(apiElement);
if (api.NamedValues!.TryGetValue(nameof(ApiRateLimit.Operations), out var operations))
{
foreach (var operation in operations.UnnamedValues!)
{
if(Handle(context, "operation", operation, out var operationElement))
{
apiElement.Add(operationElement);
}
}
}
}
}
context.AddPolicy(element);
}