1use std::collections::HashMap;
2
3use enum_as_inner::EnumAsInner;
4use semver::VersionReq;
5use serde::{Deserialize, Serialize};
6
7use crate::{expr::Expr, Ident, Span, Ty};
8
9#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, Default)]
10pub struct QueryDef {
11 pub version: Option<VersionReq>,
12 #[serde(default)]
13 pub other: HashMap<String, String>,
14}
15
16#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
17pub enum VarDefKind {
18 Let,
19 Into,
20 Main,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct Stmt {
27 #[serde(flatten)]
28 pub kind: StmtKind,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub span: Option<Span>,
31
32 #[serde(skip_serializing_if = "Vec::is_empty", default)]
33 pub annotations: Vec<Annotation>,
34}
35
36#[derive(Debug, EnumAsInner, PartialEq, Clone, Serialize, Deserialize)]
37pub enum StmtKind {
38 QueryDef(Box<QueryDef>),
39 VarDef(VarDef),
40 TypeDef(TypeDef),
41 ModuleDef(ModuleDef),
42 ImportDef(ImportDef),
43}
44
45#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
46pub struct VarDef {
47 pub kind: VarDefKind,
48 pub name: String,
49 pub value: Option<Box<Expr>>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub ty: Option<Ty>,
53}
54
55#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
56pub struct TypeDef {
57 pub name: String,
58 pub value: Option<Ty>,
59}
60
61#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
62pub struct ModuleDef {
63 pub name: String,
64 pub stmts: Vec<Stmt>,
65}
66
67#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
68pub struct ImportDef {
69 pub alias: Option<String>,
70 pub name: Ident,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74pub struct Annotation {
75 pub expr: Box<Expr>,
76}
77
78impl Stmt {
79 pub fn new(kind: StmtKind) -> Stmt {
80 Stmt {
81 kind,
82 span: None,
83 annotations: Vec::new(),
84 }
85 }
86}