public void Handle()

in src/Core/Compiling/Policy/RetryCompiler.cs [26:107]


    public void Handle(ICompilationContext context, InvocationExpressionSyntax node)
    {
        if (node.ArgumentList.Arguments.Count != 2)
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.ArgumentCountMissMatchForPolicy,
                node.ArgumentList.GetLocation(),
                "retry"));
            return;
        }

        ExpressionSyntax configExpression = node.ArgumentList.Arguments[0].Expression;
        if (!configExpression.TryExtractingConfig<RetryConfig>(context, "retry",
                out IReadOnlyDictionary<string, InitializerValue>? config))
        {
            return;
        }

        ExpressionSyntax childPoliciesLambdaExpression = node.ArgumentList.Arguments[1].Expression;
        if (childPoliciesLambdaExpression is not LambdaExpressionSyntax lambda)
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.ValueShouldBe,
                childPoliciesLambdaExpression.GetLocation(),
                "retry",
                nameof(LambdaExpressionSyntax)));
            return;
        }

        if (lambda.Block is null)
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.NotSupportedStatement,
                lambda.GetLocation(),
                childPoliciesLambdaExpression.GetType().FullName
            ));
            return;
        }

        XElement element = new("retry");
        if (!element.AddAttribute(config, nameof(RetryConfig.Condition), "condition"))
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.RequiredParameterNotDefined,
                node.GetLocation(),
                "retry",
                nameof(RetryConfig.Condition)
            ));
            return;
        }

        if (!element.AddAttribute(config, nameof(RetryConfig.Count), "count"))
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.RequiredParameterNotDefined,
                node.GetLocation(),
                "retry",
                nameof(RetryConfig.Count)
            ));
            return;
        }

        if (!element.AddAttribute(config, nameof(RetryConfig.Interval), "interval"))
        {
            context.Report(Diagnostic.Create(
                CompilationErrors.RequiredParameterNotDefined,
                node.GetLocation(),
                "retry",
                nameof(RetryConfig.Interval)
            ));
            return;
        }

        element.AddAttribute(config, nameof(RetryConfig.MaxInterval), "max-interval");
        element.AddAttribute(config, nameof(RetryConfig.Delta), "delta");
        element.AddAttribute(config, nameof(RetryConfig.FirstFastRetry), "first-fast-retry");

        SubCompilationContext subContext = new(context, element);
        _blockCompiler.Value.Compile(subContext, lambda.Block);

        context.AddPolicy(element);
    }