Skip to main content

surql_parser/upstream/sql/
ast.rs

1use 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	/// Creates an ast with a signle expression
21	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}