< 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: 30
Uncovered lines: 0
Coverable lines: 30
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_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{
 3010    private GovernanceMetadataSanitizationResult(
 3011        GovernanceMetadataSanitizationAction action,
 3012        IReadOnlyDictionary<string, string> sanitizedMetadata,
 3013        IReadOnlyList<OperationReason> reasons,
 3014        GovernanceMetadataBudgetValidationResult budgetValidation)
 15    {
 3016        if (!Enum.IsDefined(action))
 17        {
 118            throw new ArgumentOutOfRangeException(nameof(action), action, "Metadata sanitation action must be defined.")
 19        }
 20
 2921        ArgumentNullException.ThrowIfNull(sanitizedMetadata);
 2822        ArgumentNullException.ThrowIfNull(reasons);
 2723        ArgumentNullException.ThrowIfNull(budgetValidation);
 24
 2625        Action = action;
 2626        SanitizedMetadata = sanitizedMetadata;
 2627        Reasons = reasons;
 2628        BudgetValidation = budgetValidation;
 2629    }
 30
 31    /// <summary>
 32    /// Gets the strongest action produced by classification, sanitation, and budget validation.
 33    /// </summary>
 34    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>
 42    public IReadOnlyDictionary<string, string> SanitizedMetadata { get; }
 43
 44    /// <summary>
 45    /// Gets stable machine-readable reasons produced by classifiers or budget validation.
 46    /// </summary>
 47    public IReadOnlyList<OperationReason> Reasons { get; }
 48
 49    /// <summary>
 50    /// Gets the budget validation result evaluated after classifier redaction and dropping are complete.
 51    /// </summary>
 52    public GovernanceMetadataBudgetValidationResult BudgetValidation { get; }
 53
 54    /// <summary>
 55    /// Gets a value indicating whether the sanitized metadata may continue to downstream processing.
 56    /// </summary>
 3257    public bool CanProceed => Action is not GovernanceMetadataSanitizationAction.Deny;
 58
 59    /// <summary>
 60    /// Gets a value indicating whether sanitation denied the metadata collection.
 61    /// </summary>
 862    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    {
 3078        return new GovernanceMetadataSanitizationResult(
 3079            action,
 3080            sanitizedMetadata,
 3081            reasons,
 3082            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    {
 991        if (CanProceed)
 92        {
 493            return;
 94        }
 95
 596        string message = Reasons.Count == 0
 597            ? "Governance metadata sanitation denied the metadata collection."
 598            : $"Governance metadata sanitation denied the metadata collection: {string.Join("; ", Reasons.Select(reason 
 99
 5100        throw new ArgumentException(
 5101            message,
 5102            string.IsNullOrWhiteSpace(parameterName) ? "metadata" : parameterName);
 103    }
 104}