prqlc_parser/parser/pr/
stmt.rs

1use 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}