Skip to main content

surrealdb_expr/expr/
output.rs

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