< Summary

Information
Class: AsiBackbone.Core.HostIntegration.GovernedOperationExecutionReceiptCanonicalPayload
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/HostIntegration/GovernedOperationExecutionReceiptCanonicalPayload.cs
Line coverage
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 68
Line coverage: 100%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Create(...)50%22100%
BuildArtifactId(...)50%22100%
FilterMetadata(...)100%44100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/HostIntegration/GovernedOperationExecutionReceiptCanonicalPayload.cs

#LineLine coverage
 1using System.Globalization;
 2using AsiBackbone.Core.Serialization;
 3using AsiBackbone.Core.Signing;
 4
 5namespace AsiBackbone.Core.HostIntegration;
 6
 7/// <summary>
 8/// Builds deterministic signing payloads for governed operation execution receipts.
 9/// </summary>
 10public static class GovernedOperationExecutionReceiptCanonicalPayload
 11{
 12    /// <summary>
 13    /// Builds a provider-neutral canonical payload for an execution receipt.
 14    /// </summary>
 15    public static CanonicalPayload Create(
 16        GovernedOperationExecutionReceipt receipt,
 17        CanonicalPayloadOptions? options = null)
 18    {
 419        ArgumentNullException.ThrowIfNull(receipt);
 420        CanonicalPayloadOptions effectiveOptions = options ?? CanonicalPayloadOptions.Default;
 21
 422        SortedDictionary<string, object?> content = new(StringComparer.Ordinal)
 423        {
 424            ["completedUtc"] = receipt.CompletedUtc.ToUniversalTime().ToString("yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'", Cultu
 425            ["completedWithoutMutation"] = receipt.CompletedWithoutMutation,
 426            ["decisionAuditRecordId"] = receipt.DecisionAuditRecordId,
 427            ["executionAttemptId"] = receipt.ExecutionAttemptId,
 428            ["metadata"] = FilterMetadata(receipt.Metadata, effectiveOptions),
 429            ["mutationBatchId"] = receipt.MutationBatchId,
 430            ["mutationManifestAlgorithm"] = receipt.MutationManifestAlgorithm,
 431            ["mutationManifestHash"] = receipt.MutationManifestHash,
 432            ["mutationRecordCount"] = receipt.MutationRecordCount,
 433            ["operationExecutionId"] = receipt.OperationExecutionId,
 434            ["persistenceOutcome"] = receipt.PersistenceOutcome.ToString(),
 435            ["persistenceProvider"] = receipt.PersistenceProvider
 436        };
 37
 438        return CanonicalPayload.Create(
 439            CanonicalArtifactTypes.GovernedOperationExecutionReceipt,
 440            BuildArtifactId(receipt),
 441            AsiBackboneSchemaVersions.StableArtifactsV1,
 442            effectiveOptions.CanonicalizationVersion,
 443            content);
 44    }
 45
 46    private static string BuildArtifactId(GovernedOperationExecutionReceipt receipt)
 47    {
 448        return receipt.ExecutionAttemptId is null
 449            ? receipt.OperationExecutionId
 450            : $"{receipt.OperationExecutionId}:{receipt.ExecutionAttemptId}";
 51    }
 52
 53    private static SortedDictionary<string, object?> FilterMetadata(
 54        IReadOnlyDictionary<string, string> metadata,
 55        CanonicalPayloadOptions options)
 56    {
 457        SortedDictionary<string, object?> filtered = new(StringComparer.Ordinal);
 2458        foreach (KeyValuePair<string, string> item in metadata)
 59        {
 860            if (options.AllowsMetadataKey(item.Key))
 61            {
 462                filtered[item.Key] = item.Value;
 63            }
 64        }
 65
 466        return filtered;
 67    }
 68}