Skip to main content

surql_parser/upstream/sql/
output.rs

1use crate::upstream::fmt::CoverStmts;
2use crate::upstream::sql::Field;
3use crate::upstream::sql::field::{Fields, Selector};
4use surrealdb_types::{SqlFormat, ToSql, write_sql};
5#[derive(Clone, Debug, Default, PartialEq, Eq)]
6#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
7pub enum Output {
8	#[default]
9	None,
10	Null,
11	Diff,
12	After,
13	Before,
14	Fields(Fields),
15}
16impl ToSql for Output {
17	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
18		f.push_str("RETURN ");
19		match self {
20			Self::None => f.push_str("NONE"),
21			Self::Null => f.push_str("NULL"),
22			Self::Diff => f.push_str("DIFF"),
23			Self::After => f.push_str("AFTER"),
24			Self::Before => f.push_str("BEFORE"),
25			Self::Fields(v) => match v {
26				Fields::Select(fields) => {
27					let mut iter = fields.iter();
28					match iter.next() {
29						Some(Field::Single(Selector { expr, alias })) => {
30							let has_left_none = expr.has_left_none_null();
31							if has_left_none {
32								f.push('(');
33								expr.fmt_sql(f, fmt);
34								f.push(')');
35							} else {
36								CoverStmts(expr).fmt_sql(f, fmt);
37							}
38							if let Some(alias) = alias {
39								write_sql!(f, fmt, " AS {alias}");
40							}
41						}
42						Some(x) => {
43							x.fmt_sql(f, fmt);
44						}
45						None => {}
46					}
47					for x in iter {
48						write_sql!(f, fmt, ", {x}")
49					}
50				}
51				x => x.fmt_sql(f, fmt),
52			},
53		}
54	}
55}