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>>, }, }