Skip to main content

surql_parser/upstream/sql/
closure.rs

1use crate::upstream::fmt::CoverStmts;
2use crate::upstream::sql::{Expr, Kind, Param};
3use surrealdb_types::{SqlFormat, ToSql, write_sql};
4#[derive(Clone, Debug, PartialEq, Eq)]
5pub struct Closure {
6	pub args: Vec<(Param, Kind)>,
7	pub returns: Option<Kind>,
8	pub body: Expr,
9}
10impl ToSql for Closure {
11	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
12		write_sql!(f, fmt, "|");
13		for (i, (name, kind)) in self.args.iter().enumerate() {
14			if i > 0 {
15				write_sql!(f, fmt, ", ");
16			}
17			write_sql!(f, fmt, "{name}: ");
18			match kind {
19				k @ Kind::Either(_) => write_sql!(f, fmt, "<{}>", k),
20				k => write_sql!(f, fmt, "{}", k),
21			}
22		}
23		write_sql!(f, fmt, "|");
24		if let Some(returns) = &self.returns {
25			write_sql!(f, fmt, " -> {returns}");
26		}
27		if self.body.has_left_idiom() {
28			write_sql!(f, fmt, " ({})", &self.body)
29		} else {
30			write_sql!(f, fmt, " {}", CoverStmts(&self.body))
31		}
32	}
33}