using System.Collections.Immutable; namespace StellaOps.Scanner.EntryTrace.Parsing; public abstract record ShellNode(ShellSpan Span); public sealed record ShellScript(ImmutableArray Nodes); public sealed record ShellSpan(int StartLine, int StartColumn, int EndLine, int EndColumn); public sealed record ShellCommandNode( string Command, ImmutableArray Arguments, ShellSpan Span) : ShellNode(Span); public sealed record ShellIncludeNode( string PathExpression, ImmutableArray Arguments, ShellSpan Span) : ShellNode(Span); public sealed record ShellExecNode( ImmutableArray Arguments, ShellSpan Span) : ShellNode(Span); public sealed record ShellIfNode( ImmutableArray Branches, ShellSpan Span) : ShellNode(Span); public sealed record ShellConditionalBranch( ShellConditionalKind Kind, ImmutableArray Body, ShellSpan Span, string? PredicateSummary); public enum ShellConditionalKind { If, Elif, Else } public sealed record ShellCaseNode( ImmutableArray Arms, ShellSpan Span) : ShellNode(Span); public sealed record ShellCaseArm( ImmutableArray Patterns, ImmutableArray Body, ShellSpan Span); public sealed record ShellRunPartsNode( string DirectoryExpression, ImmutableArray Arguments, ShellSpan Span) : ShellNode(Span);