1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#[derive(Debug, PartialEq)]
pub struct Resource<'ast> {
    pub body: Vec<ResourceEntry<'ast>>,
}

#[derive(Debug, PartialEq)]
pub enum ResourceEntry<'ast> {
    Entry(Entry<'ast>),
    Junk(&'ast str),
}

#[derive(Debug, PartialEq)]
pub enum Entry<'ast> {
    Message(Message<'ast>),
    Term(Term<'ast>),
    Comment(Comment<'ast>),
}

#[derive(Debug, PartialEq)]
pub struct Message<'ast> {
    pub id: Identifier<'ast>,
    pub value: Option<Pattern<'ast>>,
    pub attributes: Vec<Attribute<'ast>>,
    pub comment: Option<Comment<'ast>>,
}

#[derive(Debug, PartialEq)]
pub struct Term<'ast> {
    pub id: Identifier<'ast>,
    pub value: Pattern<'ast>,
    pub attributes: Vec<Attribute<'ast>>,
    pub comment: Option<Comment<'ast>>,
}

#[derive(Debug, PartialEq)]
pub struct Pattern<'ast> {
    pub elements: Vec<PatternElement<'ast>>,
}

#[derive(Debug, PartialEq)]
pub enum PatternElement<'ast> {
    TextElement(&'ast str),
    Placeable(Expression<'ast>),
}

#[derive(Debug, PartialEq)]
pub struct Attribute<'ast> {
    pub id: Identifier<'ast>,
    pub value: Pattern<'ast>,
}

#[derive(Debug, PartialEq)]
pub struct Identifier<'ast> {
    pub name: &'ast str,
}

#[derive(Debug, PartialEq)]
pub struct Variant<'ast> {
    pub key: VariantKey<'ast>,
    pub value: Pattern<'ast>,
    pub default: bool,
}

#[derive(Debug, PartialEq)]
pub enum VariantKey<'ast> {
    Identifier { name: &'ast str },
    NumberLiteral { value: &'ast str },
}

#[derive(Debug, PartialEq)]
pub enum Comment<'ast> {
    Comment { content: Vec<&'ast str> },
    GroupComment { content: Vec<&'ast str> },
    ResourceComment { content: Vec<&'ast str> },
}

#[derive(Debug, PartialEq)]
pub enum InlineExpression<'ast> {
    StringLiteral {
        value: &'ast str,
    },
    NumberLiteral {
        value: &'ast str,
    },
    FunctionReference {
        id: Identifier<'ast>,
        arguments: Option<CallArguments<'ast>>,
    },
    MessageReference {
        id: Identifier<'ast>,
        attribute: Option<Identifier<'ast>>,
    },
    TermReference {
        id: Identifier<'ast>,
        attribute: Option<Identifier<'ast>>,
        arguments: Option<CallArguments<'ast>>,
    },
    VariableReference {
        id: Identifier<'ast>,
    },
    Placeable {
        expression: Box<Expression<'ast>>,
    },
}

#[derive(Debug, PartialEq)]
pub struct CallArguments<'ast> {
    pub positional: Vec<InlineExpression<'ast>>,
    pub named: Vec<NamedArgument<'ast>>,
}

#[derive(Debug, PartialEq)]
pub struct NamedArgument<'ast> {
    pub name: Identifier<'ast>,
    pub value: InlineExpression<'ast>,
}

#[derive(Debug, PartialEq)]
pub enum Expression<'ast> {
    InlineExpression(InlineExpression<'ast>),
    SelectExpression {
        selector: InlineExpression<'ast>,
        variants: Vec<Variant<'ast>>,
    },
}