1 mod helper;
2 
3 #[cfg(feature = "serde")]
4 use serde::{Deserialize, Serialize};
5 
6 #[derive(Debug, PartialEq, Clone)]
7 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8 pub struct Resource<S> {
9     pub body: Vec<Entry<S>>,
10 }
11 
12 #[derive(Debug, PartialEq, Clone)]
13 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
14 #[cfg_attr(feature = "serde", serde(tag = "type"))]
15 pub enum Entry<S> {
16     Message(Message<S>),
17     Term(Term<S>),
18     Comment(Comment<S>),
19     GroupComment(Comment<S>),
20     ResourceComment(Comment<S>),
21     Junk { content: S },
22 }
23 
24 #[derive(Debug, PartialEq, Clone)]
25 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
26 pub struct Message<S> {
27     pub id: Identifier<S>,
28     pub value: Option<Pattern<S>>,
29     pub attributes: Vec<Attribute<S>>,
30     pub comment: Option<Comment<S>>,
31 }
32 
33 #[derive(Debug, PartialEq, Clone)]
34 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
35 pub struct Term<S> {
36     pub id: Identifier<S>,
37     pub value: Pattern<S>,
38     pub attributes: Vec<Attribute<S>>,
39     pub comment: Option<Comment<S>>,
40 }
41 
42 #[derive(Debug, PartialEq, Clone)]
43 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44 pub struct Pattern<S> {
45     pub elements: Vec<PatternElement<S>>,
46 }
47 
48 #[derive(Debug, PartialEq, Clone)]
49 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
50 #[cfg_attr(feature = "serde", serde(tag = "type"))]
51 pub enum PatternElement<S> {
52     TextElement { value: S },
53     Placeable { expression: Expression<S> },
54 }
55 
56 #[derive(Debug, PartialEq, Clone)]
57 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58 pub struct Attribute<S> {
59     pub id: Identifier<S>,
60     pub value: Pattern<S>,
61 }
62 
63 #[derive(Debug, PartialEq, Clone)]
64 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
65 pub struct Identifier<S> {
66     pub name: S,
67 }
68 
69 #[derive(Debug, PartialEq, Clone)]
70 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71 #[cfg_attr(feature = "serde", serde(tag = "type"))]
72 pub struct Variant<S> {
73     pub key: VariantKey<S>,
74     pub value: Pattern<S>,
75     pub default: bool,
76 }
77 
78 #[derive(Debug, PartialEq, Clone)]
79 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80 #[cfg_attr(feature = "serde", serde(tag = "type"))]
81 pub enum VariantKey<S> {
82     Identifier { name: S },
83     NumberLiteral { value: S },
84 }
85 
86 #[derive(Debug, PartialEq, Clone)]
87 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88 #[cfg_attr(feature = "serde", serde(from = "helper::CommentDef<S>"))]
89 pub struct Comment<S> {
90     pub content: Vec<S>,
91 }
92 
93 #[derive(Debug, PartialEq, Clone)]
94 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
95 #[cfg_attr(feature = "serde", serde(tag = "type"))]
96 pub struct CallArguments<S> {
97     pub positional: Vec<InlineExpression<S>>,
98     pub named: Vec<NamedArgument<S>>,
99 }
100 
101 #[derive(Debug, PartialEq, Clone)]
102 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
103 #[cfg_attr(feature = "serde", serde(tag = "type"))]
104 pub struct NamedArgument<S> {
105     pub name: Identifier<S>,
106     pub value: InlineExpression<S>,
107 }
108 
109 #[derive(Debug, PartialEq, Clone)]
110 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
111 #[cfg_attr(feature = "serde", serde(tag = "type"))]
112 pub enum InlineExpression<S> {
113     StringLiteral {
114         value: S,
115     },
116     NumberLiteral {
117         value: S,
118     },
119     FunctionReference {
120         id: Identifier<S>,
121         arguments: Option<CallArguments<S>>,
122     },
123     MessageReference {
124         id: Identifier<S>,
125         attribute: Option<Identifier<S>>,
126     },
127     TermReference {
128         id: Identifier<S>,
129         attribute: Option<Identifier<S>>,
130         arguments: Option<CallArguments<S>>,
131     },
132     VariableReference {
133         id: Identifier<S>,
134     },
135     Placeable {
136         expression: Box<Expression<S>>,
137     },
138 }
139 
140 #[derive(Debug, PartialEq, Clone)]
141 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
142 #[cfg_attr(feature = "serde", serde(untagged))]
143 pub enum Expression<S> {
144     SelectExpression {
145         selector: InlineExpression<S>,
146         variants: Vec<Variant<S>>,
147     },
148     InlineExpression(InlineExpression<S>),
149 }
150