prqlc_ast/
stmt.rs

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// The following code is tested by the tests_misc crate to match stmt.rs in prql_compiler.
24
25#[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}