purescript_corefn/
lib.rs

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}