using System.Collections.Immutable; using System.Linq; namespace StellaOps.Aoc; public sealed record AocGuardOptions { private static readonly ImmutableHashSet DefaultRequiredTopLevel = new[] { "tenant", "source", "upstream", "content", "linkset", }.ToImmutableHashSet(StringComparer.OrdinalIgnoreCase); private static readonly ImmutableHashSet DefaultAllowedTopLevel = DefaultRequiredTopLevel .Union(new[] { "_id", "identifiers", "attributes", "supersedes", "createdAt", "created_at", "ingestedAt", "ingested_at", "links", "advisory_key" }, StringComparer.OrdinalIgnoreCase) .ToImmutableHashSet(StringComparer.OrdinalIgnoreCase); public static AocGuardOptions Default { get; } = new(); public ImmutableHashSet RequiredTopLevelFields { get; init; } = DefaultRequiredTopLevel; /// /// Optional allowlist for top-level fields. Unknown fields trigger ERR_AOC_007. /// public ImmutableHashSet AllowedTopLevelFields { get; init; } = DefaultAllowedTopLevel; /// /// When true, signature metadata is required under upstream.signature. /// public bool RequireSignatureMetadata { get; init; } = true; /// /// When true, tenant must be a non-empty string. /// public bool RequireTenant { get; init; } = true; }