Skip to main content

surrealdb_sql/
closure.rs

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