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