surql_parser/upstream/sql/
ast.rs1use crate::upstream::fmt::Fmt;
2use crate::upstream::sql::statements::{
3 AccessStatement, KillStatement, LiveStatement, OptionStatement, ShowStatement, UseStatement,
4};
5use crate::upstream::sql::{Expr, Param};
6use std::fmt::{self};
7use surrealdb_types::{SqlFormat, ToSql, write_sql};
8#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10pub enum ExplainFormat {
11 #[default]
12 Text,
13 Json,
14}
15#[derive(Debug, PartialEq, Clone)]
16pub struct Ast {
17 pub expressions: Vec<TopLevelExpr>,
18}
19impl Ast {
20 pub fn single_expr(expr: Expr) -> Self {
22 Ast {
23 expressions: vec![TopLevelExpr::Expr(expr)],
24 }
25 }
26 pub fn num_statements(&self) -> usize {
27 self.expressions.len()
28 }
29 pub fn get_let_statements(&self) -> Vec<String> {
30 let mut let_var_names = Vec::new();
31 for expr in &self.expressions {
32 if let TopLevelExpr::Expr(Expr::Let(stmt)) = expr {
33 let_var_names.push(stmt.name.clone());
34 }
35 }
36 let_var_names
37 }
38 pub fn add_param(&mut self, name: String) {
39 self.expressions
40 .push(TopLevelExpr::Expr(Expr::Param(Param::new(name))));
41 }
42}
43impl ToSql for Ast {
44 fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
45 write_sql!(
46 f,
47 fmt,
48 "{}",
49 &Fmt::one_line_separated(
50 self.expressions
51 .iter()
52 .map(|v| Fmt::new(v, |v, f, fmt| write_sql!(f, fmt, "{v};"))),
53 ),
54 )
55 }
56}
57#[derive(Clone, Debug, Eq, PartialEq)]
58#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
59pub enum TopLevelExpr {
60 Begin,
61 Cancel,
62 Commit,
63 Access(Box<AccessStatement>),
64 Kill(KillStatement),
65 Live(Box<LiveStatement>),
66 Option(OptionStatement),
67 Use(UseStatement),
68 Show(ShowStatement),
69 Expr(Expr),
70}
71impl fmt::Display for TopLevelExpr {
72 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
73 if f.alternate() {
74 write!(f, "{}", self.to_sql_pretty())
75 } else {
76 write!(f, "{}", self.to_sql())
77 }
78 }
79}
80impl ToSql for TopLevelExpr {
81 fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
82 match self {
83 TopLevelExpr::Begin => f.push_str("BEGIN"),
84 TopLevelExpr::Cancel => f.push_str("CANCEL"),
85 TopLevelExpr::Commit => f.push_str("COMMIT"),
86 TopLevelExpr::Access(s) => s.fmt_sql(f, fmt),
87 TopLevelExpr::Kill(s) => s.fmt_sql(f, fmt),
88 TopLevelExpr::Live(s) => s.fmt_sql(f, fmt),
89 TopLevelExpr::Option(s) => s.fmt_sql(f, fmt),
90 TopLevelExpr::Use(s) => s.fmt_sql(f, fmt),
91 TopLevelExpr::Show(s) => s.fmt_sql(f, fmt),
92 TopLevelExpr::Expr(e) => e.fmt_sql(f, fmt),
93 }
94 }
95}