using System.Collections.Immutable; namespace StellaOps.PolicyDsl; public abstract record SyntaxNode(SourceSpan Span); public sealed record PolicyDocumentNode( string Name, string Syntax, ImmutableDictionary Metadata, ImmutableArray Profiles, ImmutableDictionary Settings, ImmutableArray Rules, SourceSpan Span) : SyntaxNode(Span); public sealed record PolicyProfileNode( string Name, ImmutableArray Items, SourceSpan Span) : SyntaxNode(Span); public abstract record PolicyProfileItemNode(SourceSpan Span); public sealed record PolicyProfileMapNode( string Name, ImmutableArray Entries, SourceSpan Span) : PolicyProfileItemNode(Span); public sealed record PolicyProfileMapEntryNode( string Source, decimal Weight, SourceSpan Span) : SyntaxNode(Span); public sealed record PolicyProfileEnvNode( string Name, ImmutableArray Entries, SourceSpan Span) : PolicyProfileItemNode(Span); public sealed record PolicyProfileEnvEntryNode( PolicyExpression Condition, decimal Weight, SourceSpan Span) : SyntaxNode(Span); public sealed record PolicyProfileScalarNode( string Name, PolicyLiteralValue Value, SourceSpan Span) : PolicyProfileItemNode(Span); public sealed record PolicyRuleNode( string Name, int Priority, PolicyExpression When, ImmutableArray ThenActions, ImmutableArray ElseActions, string? Because, SourceSpan Span) : SyntaxNode(Span); public abstract record PolicyActionNode(SourceSpan Span); public sealed record PolicyAssignmentActionNode( PolicyReference Target, PolicyExpression Value, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyAnnotateActionNode( PolicyReference Target, PolicyExpression Value, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyIgnoreActionNode( PolicyExpression? Until, string? Because, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyEscalateActionNode( PolicyExpression? To, PolicyExpression? When, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyRequireVexActionNode( ImmutableDictionary Conditions, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyWarnActionNode( PolicyExpression? Message, SourceSpan Span) : PolicyActionNode(Span); public sealed record PolicyDeferActionNode( PolicyExpression? Until, SourceSpan Span) : PolicyActionNode(Span); public abstract record PolicyExpression(SourceSpan Span); public sealed record PolicyLiteralExpression(object? Value, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyListExpression(ImmutableArray Items, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyIdentifierExpression(string Name, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyMemberAccessExpression(PolicyExpression Target, string Member, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyInvocationExpression(PolicyExpression Target, ImmutableArray Arguments, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyIndexerExpression(PolicyExpression Target, PolicyExpression Index, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyUnaryExpression(PolicyUnaryOperator Operator, PolicyExpression Operand, SourceSpan Span) : PolicyExpression(Span); public sealed record PolicyBinaryExpression(PolicyExpression Left, PolicyBinaryOperator Operator, PolicyExpression Right, SourceSpan Span) : PolicyExpression(Span); public enum PolicyUnaryOperator { Not, } public enum PolicyBinaryOperator { And, Or, Equal, NotEqual, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual, In, NotIn, } public sealed record PolicyReference(ImmutableArray Segments, SourceSpan Span) { public override string ToString() => string.Join(".", Segments); } public abstract record PolicyLiteralValue(SourceSpan Span); public sealed record PolicyStringLiteral(string Value, SourceSpan Span) : PolicyLiteralValue(Span); public sealed record PolicyNumberLiteral(decimal Value, SourceSpan Span) : PolicyLiteralValue(Span); public sealed record PolicyBooleanLiteral(bool Value, SourceSpan Span) : PolicyLiteralValue(Span); public sealed record PolicyListLiteral(ImmutableArray Items, SourceSpan Span) : PolicyLiteralValue(Span);