1#[macro_use]
2extern crate serde_derive;
3
4extern crate serde;
5extern crate serde_json;
6
7pub mod walk;
8
9#[derive(Clone, Debug, PartialEq, Deserialize)]
10pub struct Module {
11 #[serde(rename = "moduleName")]
12 pub name: Vec<String>,
13 pub imports: Vec<Import>,
14 pub exports: Vec<String>,
15 pub decls: Vec<Decl>,
16 pub foreign: Vec<String>,
17}
18
19#[derive(Clone, Debug, PartialEq, Deserialize)]
20pub struct Import {
21 #[serde(rename = "moduleName")]
22 pub module: Vec<String>,
23}
24
25#[derive(Clone, Debug, PartialEq, Deserialize)]
26#[serde(tag = "bindType")]
27pub enum Decl {
28 NonRec(Bind),
29 Rec { binds: Vec<Bind> },
30}
31
32#[derive(Clone, Debug, PartialEq, Deserialize)]
33pub struct Bind {
34 pub identifier: String,
35 pub expression: Expression,
36}
37
38#[derive(Clone, Debug, PartialEq, Deserialize)]
39#[serde(tag = "type")]
40pub enum Expression {
41 Abs {
42 argument: String,
43 body: Box<Expression>,
44 annotation: Annotation,
45 },
46 Accessor {
47 expression: Box<Expression>,
48 #[serde(rename = "fieldName")]
49 field: String,
50 annotation: Annotation,
51 },
52 App {
53 abstraction: Box<Expression>,
54 argument: Box<Expression>,
55 annotation: Annotation,
56 },
57 Case {
58 #[serde(rename = "caseAlternatives")]
59 alternatives: Vec<Alternative>,
60 #[serde(rename = "caseExpressions")]
61 expressions: Vec<Expression>,
62 annotation: Annotation,
63 },
64 Constructor {
65 #[serde(rename = "constructorName")]
66 name: String,
67 #[serde(rename = "typeName")]
68 type_: String,
69 #[serde(rename = "fieldNames")]
70 fields: Vec<String>,
71 annotation: Annotation,
72 },
73 Let {
74 expression: Box<Expression>,
75 binds: Vec<Decl>,
76 annotation: Annotation,
77 },
78 Literal {
79 value: Literal,
80 annotation: Annotation,
81 },
82 ObjectUpdate {
83 expression: Box<Expression>,
84 updates: Vec<(String, Expression)>,
85 annotation: Annotation,
86 },
87 Var {
88 value: Qualified,
89 annotation: Annotation,
90 },
91}
92
93#[derive(Clone, Debug, PartialEq, Deserialize)]
94#[serde(tag = "literalType")]
95pub enum Literal {
96 #[serde(rename = "ArrayLiteral")]
97 Array { value: Vec<Expression> },
98 #[serde(rename = "BooleanLiteral")]
99 Boolean { value: bool },
100 #[serde(rename = "CharLiteral")]
101 Char { value: char },
102 #[serde(rename = "IntLiteral")]
103 Int { value: i64 },
104 #[serde(rename = "NumberLiteral")]
105 Number { value: f64 },
106 #[serde(rename = "ObjectLiteral")]
107 Object { value: Vec<(String, Expression)> },
108 #[serde(rename = "StringLiteral")]
109 String { value: String },
110}
111
112#[derive(Clone, Debug, PartialEq, Deserialize)]
113pub struct Qualified {
114 #[serde(rename = "moduleName")]
115 pub module: Option<Vec<String>>,
116 pub identifier: String,
117}
118
119#[derive(Clone, Debug, PartialEq, Deserialize)]
120#[serde(untagged)]
121pub enum Alternative {
122 Guarded {
123 binders: Vec<Binder>,
124 expressions: Vec<GuardedExpression>,
125 },
126 Unguarded {
127 binders: Vec<Binder>,
128 expression: Expression,
129 },
130}
131
132#[derive(Clone, Debug, PartialEq, Deserialize)]
133pub struct GuardedExpression {
134 pub guard: Expression,
135 pub expression: Expression,
136}
137
138#[derive(Clone, Debug, PartialEq, Deserialize)]
139#[serde(tag = "binderType")]
140pub enum Binder {
141 #[serde(rename = "ConstructorBinder")]
142 Constructor {
143 #[serde(rename = "constructorName")]
144 constructor: Qualified,
145 #[serde(rename = "typeName")]
146 type_: Qualified,
147 binders: Vec<Binder>,
148 annotation: Annotation,
149 },
150 #[serde(rename = "LiteralBinder")]
151 Literal { literal: LiteralBinder },
152 #[serde(rename = "NamedBinder")]
153 Named {
154 identifier: String,
155 binder: Box<Binder>,
156 },
157 #[serde(rename = "NullBinder")]
158 Null {},
159 #[serde(rename = "VarBinder")]
160 Var { identifier: String },
161}
162
163#[derive(Clone, Debug, PartialEq, Deserialize)]
164#[serde(tag = "literalType")]
165pub enum LiteralBinder {
166 #[serde(rename = "ArrayLiteral")]
167 Array { value: Vec<Binder> },
168 #[serde(rename = "BooleanLiteral")]
169 Boolean { value: bool },
170 #[serde(rename = "CharLiteral")]
171 Char { value: char },
172 #[serde(rename = "IntLiteral")]
173 Int { value: i64 },
174 #[serde(rename = "NumberLiteral")]
175 Number { value: f64 },
176 #[serde(rename = "ObjectLiteral")]
177 Object { value: Vec<(String, Binder)> },
178 #[serde(rename = "StringLiteral")]
179 String { value: String },
180}
181
182#[derive(Clone, Debug, PartialEq, Deserialize)]
183pub struct Annotation {
184 pub meta: Option<Meta>,
185}
186
187#[derive(Clone, Debug, PartialEq, Deserialize)]
188#[serde(tag = "metaType")]
189pub enum Meta {
190 #[serde(rename = "IsConstructor")]
191 Constructor {
192 identifiers: Vec<String>,
193 #[serde(rename = "constructorType")]
194 type_: ConstructorType,
195 },
196 #[serde(rename = "IsForeign")]
197 Foreign,
198 #[serde(rename = "IsNewtype")]
199 Newtype,
200 #[serde(rename = "IsTypeClassConstructor")]
201 TypeClassConstructor,
202 #[serde(rename = "IsWhere")]
203 Where,
204}
205
206#[derive(Clone, Debug, PartialEq, Deserialize)]
207pub enum ConstructorType {
208 #[serde(rename = "ProductType")]
209 Product,
210 #[serde(rename = "SumType")]
211 Sum,
212}
213
214pub fn from_str(str: &str) -> Result<Module, serde_json::Error> {
215 serde_json::from_str(str)
216}