shebling_ast/
lib.rs

1use std::fmt;
2
3// TODO: Document.
4
5// region: Token location.
6#[derive(PartialEq)]
7pub struct Span {
8    start: usize,
9    end: usize,
10}
11
12impl Span {
13    pub fn new(start: usize, end: usize) -> Self {
14        Self { start, end }
15    }
16}
17
18impl fmt::Debug for Span {
19    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20        write!(f, "{}..{}", self.start, self.end)
21    }
22}
23
24#[derive(Debug, PartialEq)]
25pub struct Spanned<T>(T, Span);
26
27impl<T> Spanned<T> {
28    pub fn new(token: T, span: Span) -> Self {
29        Self(token, span)
30    }
31
32    pub fn token(&self) -> &T {
33        &self.0
34    }
35}
36// endregion
37
38// region: Redirections.
39#[derive(Debug, PartialEq)]
40pub enum RedirOp {
41    /// `>|`
42    Clobber,
43    /// `>>`
44    DGreat,
45    /// `<<`
46    DLess,
47    /// `<<-`
48    DLessDash,
49    /// `>`
50    Great,
51    /// `>&`
52    GreatAnd,
53    /// `<`
54    Less,
55    /// `<&`
56    LessAnd,
57    /// `<>`
58    LessGreat,
59    /// `<<<`
60    TLess,
61}
62// endregion
63
64// region: Commands.
65#[derive(Debug, PartialEq)]
66pub enum ControlOp {
67    /// `&`
68    And,
69    /// `&&`
70    AndIf,
71    /// `;;`
72    DSemi,
73    /// `\n`
74    Newline,
75    /// `|`
76    Or,
77    /// `|&`
78    OrAnd,
79    /// `||`
80    OrIf,
81    /// `;`
82    Semi,
83}
84// endregion