surql_parser/upstream/sql/
output.rs1use 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}