using System.Collections.Immutable; using System.Text.Json.Serialization; namespace StellaOps.Scanner.SmartDiff.Output; /// /// SARIF 2.1.0 log model for Smart-Diff output. /// Per Sprint 3500.4 - Smart-Diff Binary Analysis. /// public sealed record SarifLog( [property: JsonPropertyName("version")] string Version, [property: JsonPropertyName("$schema")] string Schema, [property: JsonPropertyName("runs")] ImmutableArray Runs); /// /// A single SARIF run representing one analysis execution. /// public sealed record SarifRun( [property: JsonPropertyName("tool")] SarifTool Tool, [property: JsonPropertyName("results")] ImmutableArray Results, [property: JsonPropertyName("invocations")] ImmutableArray? Invocations = null, [property: JsonPropertyName("artifacts")] ImmutableArray? Artifacts = null, [property: JsonPropertyName("versionControlProvenance")] ImmutableArray? VersionControlProvenance = null, [property: JsonPropertyName("properties")] ImmutableSortedDictionary? Properties = null); /// /// Tool information for the SARIF run. /// public sealed record SarifTool( [property: JsonPropertyName("driver")] SarifToolComponent Driver, [property: JsonPropertyName("extensions")] ImmutableArray? Extensions = null); /// /// Tool component (driver or extension). /// public sealed record SarifToolComponent( [property: JsonPropertyName("name")] string Name, [property: JsonPropertyName("version")] string Version, [property: JsonPropertyName("informationUri")] string? InformationUri = null, [property: JsonPropertyName("rules")] ImmutableArray? Rules = null, [property: JsonPropertyName("supportedTaxonomies")] ImmutableArray? SupportedTaxonomies = null); /// /// Reference to a tool component. /// public sealed record SarifToolComponentReference( [property: JsonPropertyName("name")] string Name, [property: JsonPropertyName("guid")] string? Guid = null); /// /// Rule definition. /// public sealed record SarifReportingDescriptor( [property: JsonPropertyName("id")] string Id, [property: JsonPropertyName("name")] string? Name = null, [property: JsonPropertyName("shortDescription")] SarifMessage? ShortDescription = null, [property: JsonPropertyName("fullDescription")] SarifMessage? FullDescription = null, [property: JsonPropertyName("defaultConfiguration")] SarifReportingConfiguration? DefaultConfiguration = null, [property: JsonPropertyName("helpUri")] string? HelpUri = null); /// /// Rule configuration. /// public sealed record SarifReportingConfiguration( [property: JsonPropertyName("level")] SarifLevel Level = SarifLevel.Warning, [property: JsonPropertyName("enabled")] bool Enabled = true); /// /// SARIF message with text. /// public sealed record SarifMessage( [property: JsonPropertyName("text")] string Text, [property: JsonPropertyName("markdown")] string? Markdown = null); /// /// SARIF result level. /// [JsonConverter(typeof(JsonStringEnumConverter))] public enum SarifLevel { [JsonStringEnumMemberName("none")] None, [JsonStringEnumMemberName("note")] Note, [JsonStringEnumMemberName("warning")] Warning, [JsonStringEnumMemberName("error")] Error } /// /// A single result/finding. /// public sealed record SarifResult( [property: JsonPropertyName("ruleId")] string RuleId, [property: JsonPropertyName("level")] SarifLevel Level, [property: JsonPropertyName("message")] SarifMessage Message, [property: JsonPropertyName("locations")] ImmutableArray? Locations = null, [property: JsonPropertyName("fingerprints")] ImmutableSortedDictionary? Fingerprints = null, [property: JsonPropertyName("partialFingerprints")] ImmutableSortedDictionary? PartialFingerprints = null, [property: JsonPropertyName("properties")] ImmutableSortedDictionary? Properties = null); /// /// Location of a result. /// public sealed record SarifLocation( [property: JsonPropertyName("physicalLocation")] SarifPhysicalLocation? PhysicalLocation = null, [property: JsonPropertyName("logicalLocations")] ImmutableArray? LogicalLocations = null); /// /// Physical file location. /// public sealed record SarifPhysicalLocation( [property: JsonPropertyName("artifactLocation")] SarifArtifactLocation ArtifactLocation, [property: JsonPropertyName("region")] SarifRegion? Region = null); /// /// Artifact location (file path). /// public sealed record SarifArtifactLocation( [property: JsonPropertyName("uri")] string Uri, [property: JsonPropertyName("uriBaseId")] string? UriBaseId = null, [property: JsonPropertyName("index")] int? Index = null); /// /// Region within a file. /// public sealed record SarifRegion( [property: JsonPropertyName("startLine")] int? StartLine = null, [property: JsonPropertyName("startColumn")] int? StartColumn = null, [property: JsonPropertyName("endLine")] int? EndLine = null, [property: JsonPropertyName("endColumn")] int? EndColumn = null); /// /// Logical location (namespace, class, function). /// public sealed record SarifLogicalLocation( [property: JsonPropertyName("name")] string Name, [property: JsonPropertyName("fullyQualifiedName")] string? FullyQualifiedName = null, [property: JsonPropertyName("kind")] string? Kind = null); /// /// Invocation information. /// public sealed record SarifInvocation( [property: JsonPropertyName("executionSuccessful")] bool ExecutionSuccessful, [property: JsonPropertyName("startTimeUtc")] DateTimeOffset? StartTimeUtc = null, [property: JsonPropertyName("endTimeUtc")] DateTimeOffset? EndTimeUtc = null, [property: JsonPropertyName("workingDirectory")] SarifArtifactLocation? WorkingDirectory = null, [property: JsonPropertyName("commandLine")] string? CommandLine = null); /// /// Artifact (file) information. /// public sealed record SarifArtifact( [property: JsonPropertyName("location")] SarifArtifactLocation Location, [property: JsonPropertyName("mimeType")] string? MimeType = null, [property: JsonPropertyName("hashes")] ImmutableSortedDictionary? Hashes = null); /// /// Version control information. /// public sealed record SarifVersionControlDetails( [property: JsonPropertyName("repositoryUri")] string RepositoryUri, [property: JsonPropertyName("revisionId")] string? RevisionId = null, [property: JsonPropertyName("branch")] string? Branch = null);