< Summary

Information
Class: Intentum.Runtime.RuntimeExtensions
Assembly: Intentum.Runtime
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Runtime/RuntimeExtensions.cs
Line coverage
87%
Covered lines: 48
Uncovered lines: 7
Coverable lines: 55
Total lines: 116
Line coverage: 87.2%
Branch coverage
91%
Covered branches: 11
Total branches: 12
Branch coverage: 91.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
Decide(...)100%11100%
Decide(...)100%110%
Decide(...)100%11100%
DecideWithRateLimit(...)100%22100%
DecideWithRateLimitAsync()100%22100%
ToLocalizedString(...)87.5%8893.33%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Runtime/RuntimeExtensions.cs

#LineLine coverage
 1using Intentum.Core.Intents;
 2using Intentum.Runtime.Engine;
 3using Intentum.Runtime.Localization;
 4using Intentum.Runtime.Policy;
 5using Intentum.Runtime.RateLimiting;
 6
 7namespace Intentum.Runtime;
 8
 9public static class RuntimeExtensions
 10{
 11    [Obsolete("Use DecideWithRateLimitAsync for async scenarios. This method will be removed in v2.0.")]
 12    [System.Diagnostics.CodeAnalysis.SuppressMessage("Intentionality", "S1133", Justification = "Deprecated until v2.0 f
 13    public static PolicyDecision Decide(
 14        this Intent intent,
 15        IntentPolicy policy)
 116    {
 117        ArgumentNullException.ThrowIfNull(intent);
 118        ArgumentNullException.ThrowIfNull(policy);
 119        return IntentPolicyEngine.Evaluate(intent, policy);
 120    }
 21
 22    /// <summary>
 23    /// Decides using context-aware policy (intent + system load, region, etc.).
 24    /// </summary>
 25    public static PolicyDecision Decide(
 26        this Intent intent,
 27        PolicyContext context,
 28        ContextAwareIntentPolicy policy)
 029    {
 030        ArgumentNullException.ThrowIfNull(intent);
 031        ArgumentNullException.ThrowIfNull(context);
 032        ArgumentNullException.ThrowIfNull(policy);
 033        return ContextAwarePolicyEngine.Evaluate(intent, context, policy);
 034    }
 35
 36    /// <summary>
 37    /// Decides using an A/B policy variant set (selector picks which policy applies to this intent).
 38    /// </summary>
 39    public static PolicyDecision Decide(
 40        this Intent intent,
 41        PolicyVariantSet variantSet)
 342    {
 343        ArgumentNullException.ThrowIfNull(intent);
 344        ArgumentNullException.ThrowIfNull(variantSet);
 345        return variantSet.Decide(intent);
 346    }
 47
 48    /// <summary>
 49    /// Decides policy and, when decision is RateLimit, checks the rate limiter.
 50    /// Returns the policy decision; use <paramref name="rateLimitResult"/> when decision is RateLimit.
 51    /// </summary>
 52    public static PolicyDecision DecideWithRateLimit(
 53        this Intent intent,
 54        IntentPolicy policy,
 55        IRateLimiter rateLimiter,
 56        RateLimitOptions options,
 57        out RateLimitResult? rateLimitResult,
 58        CancellationToken cancellationToken = default)
 259    {
 260        ArgumentNullException.ThrowIfNull(intent);
 261        ArgumentNullException.ThrowIfNull(policy);
 262        ArgumentNullException.ThrowIfNull(rateLimiter);
 263        ArgumentNullException.ThrowIfNull(options);
 64
 265        var decision = IntentPolicyEngine.Evaluate(intent, policy);
 266        rateLimitResult = null;
 267        if (decision != PolicyDecision.RateLimit)
 168            return decision;
 169        var result = rateLimiter.TryAcquireAsync(options.Key, options.Limit, options.Window, cancellationToken).AsTask()
 170        rateLimitResult = result;
 171        return decision;
 272    }
 73
 74    /// <summary>
 75    /// Async version: decides policy and, when decision is RateLimit, checks the rate limiter.
 76    /// </summary>
 77    public static async ValueTask<(PolicyDecision Decision, RateLimitResult? RateLimitResult)> DecideWithRateLimitAsync(
 78        this Intent intent,
 79        IntentPolicy policy,
 80        IRateLimiter rateLimiter,
 81        RateLimitOptions options,
 82        CancellationToken cancellationToken = default)
 283    {
 284        ArgumentNullException.ThrowIfNull(intent);
 285        ArgumentNullException.ThrowIfNull(policy);
 286        ArgumentNullException.ThrowIfNull(rateLimiter);
 287        ArgumentNullException.ThrowIfNull(options);
 88
 289        var decision = IntentPolicyEngine.Evaluate(intent, policy);
 290        if (decision != PolicyDecision.RateLimit)
 191            return (decision, null);
 192        var result = await rateLimiter.TryAcquireAsync(options.Key, options.Limit, options.Window, cancellationToken);
 193        return (decision, result);
 294    }
 95
 96    public static string ToLocalizedString(
 97        this PolicyDecision decision,
 98        IIntentumLocalizer localizer)
 1099    {
 10100        ArgumentNullException.ThrowIfNull(localizer);
 101
 10102        var key = decision switch
 10103        {
 1104            PolicyDecision.Allow => LocalizationKeys.DecisionAllow,
 1105            PolicyDecision.Observe => LocalizationKeys.DecisionObserve,
 1106            PolicyDecision.Warn => LocalizationKeys.DecisionWarn,
 1107            PolicyDecision.Block => LocalizationKeys.DecisionBlock,
 2108            PolicyDecision.Escalate => LocalizationKeys.DecisionEscalate,
 2109            PolicyDecision.RequireAuth => LocalizationKeys.DecisionRequireAuth,
 2110            PolicyDecision.RateLimit => LocalizationKeys.DecisionRateLimit,
 0111            _ => decision.ToString()
 10112        };
 113
 10114        return localizer.Get(key);
 10115    }
 116}