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