in src/Core/Compiling/Policy/QuotaCompiler.cs [18:100]
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<QuotaConfig>(context, "quota", out var values))
{
return;
}
var element = new XElement("quota");
var isCallsAdded = element.AddAttribute(values, nameof(QuotaConfig.Calls), "calls");
var isBandwidthAdded = element.AddAttribute(values, nameof(QuotaConfig.Bandwidth), "bandwidth");
if (!isCallsAdded && !isBandwidthAdded)
{
context.Report(Diagnostic.Create(
CompilationErrors.AtLeastOneOfTwoShouldBeDefined,
node.GetLocation(),
"quota",
nameof(QuotaConfig.Calls),
nameof(QuotaConfig.Bandwidth)
));
return;
}
if (!element.AddAttribute(values, nameof(QuotaConfig.RenewalPeriod), "renewal-period"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"quota",
nameof(QuotaConfig.RenewalPeriod)
));
return;
}
if (values.TryGetValue(nameof(QuotaConfig.Apis), out var apis))
{
foreach (var api in apis.UnnamedValues!)
{
if (api.Type != nameof(ApiQuota))
{
context.Report(Diagnostic.Create(
CompilationErrors.PolicyArgumentIsNotOfRequiredType,
api.Node.GetLocation(),
"quota.api",
nameof(ApiQuota)
));
continue;
}
if (!Handle(context, "api", api, out var apiElement))
{
continue;
}
element.Add(apiElement);
if (api.NamedValues!.TryGetValue(nameof(ApiQuota.Operations), out var operations))
{
foreach (var operation in operations.UnnamedValues!)
{
if (operation.Type != nameof(OperationQuota))
{
context.Report(Diagnostic.Create(
CompilationErrors.PolicyArgumentIsNotOfRequiredType,
operation.Node.GetLocation(),
"quota.api.operation",
nameof(OperationQuota)
));
continue;
}
if (Handle(context, "operation", operation, out var operationElement))
{
apiElement.Add(operationElement);
}
}
}
}
}
context.AddPolicy(element);
}