use compact_str::CompactString;
use frost_lexer::Span;
#[derive(Debug, Clone, PartialEq, Default)]
pub struct Program {
pub commands: Vec<CompleteCommand>,
pub syntax_errors: Vec<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CompleteCommand {
pub list: List,
pub is_async: bool,
}
#[derive(Debug, Clone, PartialEq)]
pub struct List {
pub first: Pipeline,
pub rest: Vec<(ListOp, Pipeline)>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ListOp {
And,
Or,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Pipeline {
pub bang: bool,
pub commands: Vec<Command>,
pub pipe_stderr: Vec<bool>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Command {
Simple(SimpleCommand),
Subshell(Subshell),
BraceGroup(BraceGroup),
If(Box<IfClause>),
For(Box<ForClause>),
While(Box<WhileClause>),
Until(Box<UntilClause>),
Case(Box<CaseClause>),
Select(Box<SelectClause>),
FunctionDef(Box<FunctionDef>),
Coproc(Box<Coproc>),
Time(Box<TimeClause>),
ArithCmd(CompactString),
Cond(Box<CondExpr>),
CFor(Box<CForClause>),
Repeat(Box<RepeatClause>),
TryAlways(Box<TryAlwaysClause>),
}
#[derive(Debug, Clone, PartialEq)]
pub enum CondExpr {
Unary(CondOp, Word),
Binary(Word, CondOp, Word),
Not(Box<CondExpr>),
And(Box<CondExpr>, Box<CondExpr>),
Or(Box<CondExpr>, Box<CondExpr>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CondOp {
FileExists, IsFile, IsDir, IsSymlink, IsReadable, IsWritable, IsExecutable, IsNonEmpty, IsBlockDev, IsCharDev, IsFifo, IsSocket, IsSetuid, IsSetgid, IsSticky, OwnedByUser, OwnedByGroup, ModifiedSinceRead, IsTty, OptionSet, VarIsSet, StrEmpty, StrNonEmpty, StrEq, StrNeq, StrLt, StrGt, StrMatch, IntEq,
IntNe,
IntLt,
IntLe,
IntGt,
IntGe,
NewerThan, OlderThan, SameFile, }
#[derive(Debug, Clone, PartialEq)]
pub struct CForClause {
pub init: CompactString,
pub condition: CompactString,
pub step: CompactString,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RepeatClause {
pub count: Word,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TryAlwaysClause {
pub try_body: Vec<CompleteCommand>,
pub always_body: Vec<CompleteCommand>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct SimpleCommand {
pub assignments: Vec<Assignment>,
pub words: Vec<Word>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Word {
pub parts: Vec<WordPart>,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum WordPart {
Literal(CompactString),
SingleQuoted(CompactString),
DoubleQuoted(Vec<WordPart>),
AnsiCQuoted(CompactString),
DollarVar(CompactString),
DollarBrace {
param: CompactString,
operator: Option<CompactString>,
arg: Option<Box<Word>>,
},
ParamExp(Box<ParamExpansion>),
CommandSub(Box<Program>),
ArithSub(CompactString),
Glob(GlobKind),
Tilde(CompactString),
BraceExp(BraceExpansion),
ProcessSub {
kind: ProcessSubKind,
body: Box<Program>,
},
ExtGlob {
op: ExtGlobOp,
pattern: CompactString,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct ParamExpansion {
pub flags: Vec<ParamFlag>,
pub length: bool,
pub is_set_test: bool,
pub name: CompactString,
pub nested: Option<Box<ParamExpansion>>,
pub subscript: Option<Subscript>,
pub modifier: Option<ParamModifier>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Subscript {
Index(CompactString),
All,
Star,
Pattern {
reverse: bool,
pattern: CompactString,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum ParamModifier {
Default { colon: bool, word: Box<Word> },
Assign { colon: bool, word: Box<Word> },
Alternative { colon: bool, word: Box<Word> },
Error { colon: bool, word: Box<Word> },
TrimPrefix { longest: bool, pattern: Box<Word> },
TrimSuffix { longest: bool, pattern: Box<Word> },
Substitute {
anchor: SubAnchor,
pattern: Box<Word>,
replacement: Option<Box<Word>>,
},
Substring {
offset: Box<Word>,
length: Option<Box<Word>>,
},
Case(CaseOp),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubAnchor {
First,
All,
Start,
End,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CaseOp {
UpperFirst,
UpperAll,
LowerFirst,
LowerAll,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParamFlag {
Lower, Upper, Capitalize, Split, Join, SplitSep(char), JoinSep(char), SortAsc, SortDesc, Unique, Keys, Values, TypeFlag, Prompt, Quote, Unquote, Expand, Words, Visible, }
#[derive(Debug, Clone, PartialEq)]
pub enum BraceExpansion {
List(Vec<CompactString>),
Range {
start: CompactString,
end: CompactString,
step: Option<CompactString>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProcessSubKind {
Input,
Output,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ExtGlobOp {
Star,
Plus,
Question,
At,
Not,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GlobKind {
Star,
Question,
At,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Redirect {
pub fd: Option<u32>,
pub op: RedirectOp,
pub target: Word,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RedirectOp {
Less,
Greater,
DoubleGreater,
GreaterPipe,
GreaterBang,
AmpGreater,
AmpDoubleGreater,
DoubleLess,
TripleLess,
DoubleLessDash,
LessGreater,
FdDup,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Assignment {
pub name: CompactString,
pub subscript: Option<CompactString>,
pub op: AssignOp,
pub value: Option<Word>,
pub array_value: Option<Vec<Word>>,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignOp {
Assign,
Append,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Subshell {
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BraceGroup {
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct IfClause {
pub condition: Vec<CompleteCommand>,
pub then_body: Vec<CompleteCommand>,
pub elifs: Vec<(Vec<CompleteCommand>, Vec<CompleteCommand>)>,
pub else_body: Option<Vec<CompleteCommand>>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ForClause {
pub var: CompactString,
pub words: Option<Vec<Word>>,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct WhileClause {
pub condition: Vec<CompleteCommand>,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct UntilClause {
pub condition: Vec<CompleteCommand>,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CaseClause {
pub word: Word,
pub items: Vec<CaseItem>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CaseItem {
pub patterns: Vec<Word>,
pub body: Vec<CompleteCommand>,
pub terminator: CaseTerminator,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CaseTerminator {
DoubleSemi,
SemiAnd,
SemiPipe,
}
#[derive(Debug, Clone, PartialEq)]
pub struct SelectClause {
pub var: CompactString,
pub words: Option<Vec<Word>>,
pub body: Vec<CompleteCommand>,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct FunctionDef {
pub name: CompactString,
pub body: Command,
pub redirects: Vec<Redirect>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Coproc {
pub name: Option<CompactString>,
pub command: Command,
}
#[derive(Debug, Clone, PartialEq)]
pub struct TimeClause {
pub pipeline: Pipeline,
}