< Summary

Information
Class: AsiBackbone.Core.Metadata.GovernanceMetadataSanitizationResult
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Metadata/GovernanceMetadataSanitizationResult.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 104
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%22100%
get_Action()100%11100%
get_SanitizedMetadata()100%11100%
get_Reasons()100%11100%
get_BudgetValidation()100%11100%
get_CanProceed()100%11100%
get_IsDenied()100%11100%
Create(...)100%11100%
ThrowIfDenied(...)100%66100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Metadata/GovernanceMetadataSanitizationResult.cs

#LineLine coverage
 1using AsiBackbone.Core.Results;
 2
 3namespace AsiBackbone.Core.Metadata;
 4
 5/// <summary>
 6/// Represents the provider-neutral result of governance metadata sanitation and budget validation.
 7/// </summary>
 8public sealed class GovernanceMetadataSanitizationResult
 9{
 5110    private GovernanceMetadataSanitizationResult(
 5111        GovernanceMetadataSanitizationAction action,
 5112        IReadOnlyDictionary<string, string> sanitizedMetadata,
 5113        IReadOnlyList<OperationReason> reasons,
 5114        GovernanceMetadataBudgetValidationResult budgetValidation)
 15    {
 5116        if (!Enum.IsDefined(action))
 17        {
 218            throw new ArgumentOutOfRangeException(nameof(action), action, "Metadata sanitation action must be defined.")
 19        }
 20
 4921        ArgumentNullException.ThrowIfNull(sanitizedMetadata);
 4722        ArgumentNullException.ThrowIfNull(reasons);
 4523        ArgumentNullException.ThrowIfNull(budgetValidation);
 24
 4325        Action = action;
 4326        SanitizedMetadata = sanitizedMetadata;
 4327        Reasons = reasons;
 4328        BudgetValidation = budgetValidation;
 4329    }
 30
 31    /// <summary>
 32    /// Gets the strongest action produced by classification, sanitation, and budget validation.
 33    /// </summary>
 6534    public GovernanceMetadataSanitizationAction Action { get; }
 35
 36    /// <summary>
 37    /// Gets metadata that may be passed forward when <see cref="CanProceed" /> is <see langword="true" />.
 38    /// </summary>
 39    /// <remarks>
 40    /// This collection is empty when sanitation is denied so callers cannot accidentally persist or emit a denied paylo
 41    /// </remarks>
 1442    public IReadOnlyDictionary<string, string> SanitizedMetadata { get; }
 43
 44    /// <summary>
 45    /// Gets stable machine-readable reasons produced by classifiers or budget validation.
 46    /// </summary>
 2847    public IReadOnlyList<OperationReason> Reasons { get; }
 48
 49    /// <summary>
 50    /// Gets the budget validation result evaluated after classifier redaction and dropping are complete.
 51    /// </summary>
 1252    public GovernanceMetadataBudgetValidationResult BudgetValidation { get; }
 53
 54    /// <summary>
 55    /// Gets a value indicating whether the sanitized metadata may continue to downstream processing.
 56    /// </summary>
 5557    public bool CanProceed => Action is not GovernanceMetadataSanitizationAction.Deny;
 58
 59    /// <summary>
 60    /// Gets a value indicating whether sanitation denied the metadata collection.
 61    /// </summary>
 1662    public bool IsDenied => !CanProceed;
 63
 64    /// <summary>
 65    /// Creates a governance metadata sanitation result.
 66    /// </summary>
 67    /// <param name="action">The strongest sanitation action.</param>
 68    /// <param name="sanitizedMetadata">The safe metadata available for downstream processing.</param>
 69    /// <param name="reasons">The classifier and budget reasons.</param>
 70    /// <param name="budgetValidation">The post-sanitation budget validation result.</param>
 71    /// <returns>A governance metadata sanitation result.</returns>
 72    public static GovernanceMetadataSanitizationResult Create(
 73        GovernanceMetadataSanitizationAction action,
 74        IReadOnlyDictionary<string, string> sanitizedMetadata,
 75        IReadOnlyList<OperationReason> reasons,
 76        GovernanceMetadataBudgetValidationResult budgetValidation)
 77    {
 5178        return new GovernanceMetadataSanitizationResult(
 5179            action,
 5180            sanitizedMetadata,
 5181            reasons,
 5182            budgetValidation);
 83    }
 84
 85    /// <summary>
 86    /// Throws an <see cref="ArgumentException" /> when sanitation denied the metadata collection.
 87    /// </summary>
 88    /// <param name="parameterName">The optional caller parameter name associated with the metadata.</param>
 89    public void ThrowIfDenied(string? parameterName = null)
 90    {
 1891        if (CanProceed)
 92        {
 893            return;
 94        }
 95
 1096        string message = Reasons.Count == 0
 1097            ? "Governance metadata sanitation denied the metadata collection."
 1698            : $"Governance metadata sanitation denied the metadata collection: {string.Join("; ", Reasons.Select(reason 
 99
 10100        throw new ArgumentException(
 10101            message,
 10102            string.IsNullOrWhiteSpace(parameterName) ? "metadata" : parameterName);
 103    }
 104}