in src/Core/Compiling/Policy/EmitMetricCompiler.cs [18:93]
public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
{
if (!node.TryExtractingConfigParameter<EmitMetricConfig>(context, "emit-metric", out var values))
{
return;
}
var element = new XElement("emit-metric");
if (!element.AddAttribute(values, nameof(EmitMetricConfig.Name), "name"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"emit-metric",
nameof(EmitMetricConfig.Name)
));
return;
}
element.AddAttribute(values, nameof(EmitMetricConfig.Value), "value");
element.AddAttribute(values, nameof(EmitMetricConfig.Namespace), "namespace");
if (!values.TryGetValue(nameof(EmitMetricConfig.Dimensions), out var dimensionsInitializer))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"emit-metric",
nameof(EmitMetricConfig.Dimensions)
));
return;
}
var dimensions = dimensionsInitializer.UnnamedValues ?? Array.Empty<InitializerValue>();
if (dimensions.Count == 0)
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterIsEmpty,
dimensionsInitializer.Node.GetLocation(),
"emit-metric",
nameof(EmitMetricConfig.Dimensions)
));
return;
}
foreach (var dimension in dimensions)
{
if (!dimension.TryGetValues<MetricDimensionConfig>(out var result))
{
context.Report(Diagnostic.Create(
CompilationErrors.PolicyArgumentIsNotOfRequiredType,
dimension.Node.GetLocation(),
"emit-metric.dimension",
nameof(MetricDimensionConfig)
));
continue;
}
var dimensionElement = new XElement("dimension");
if (!dimensionElement.AddAttribute(result, nameof(MetricDimensionConfig.Name), "name"))
{
context.Report(Diagnostic.Create(
CompilationErrors.RequiredParameterNotDefined,
node.GetLocation(),
"emit-metric.dimension",
nameof(MetricDimensionConfig.Name)
));
continue;
}
dimensionElement.AddAttribute(result, nameof(MetricDimensionConfig.Value), "value");
element.Add(dimensionElement);
}
context.AddPolicy(element);
}