Skip to main content

surql_parser/upstream/sql/statements/define/
function.rs

1use super::DefineKind;
2use crate::upstream::fmt::{CoverStmts, EscapeKwFreeIdent};
3use crate::upstream::sql::{Block, Expr, Kind, Literal, Permission};
4use surrealdb_types::{SqlFormat, ToSql, write_sql};
5#[derive(Clone, Debug, PartialEq, Eq)]
6#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
7pub struct DefineFunctionStatement {
8	pub kind: DefineKind,
9	pub name: String,
10	pub args: Vec<(String, Kind)>,
11	pub block: Block,
12	pub comment: Expr,
13	pub permissions: Permission,
14	pub returns: Option<Kind>,
15}
16impl ToSql for DefineFunctionStatement {
17	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
18		write_sql!(f, fmt, "DEFINE FUNCTION");
19		match self.kind {
20			DefineKind::Default => {}
21			DefineKind::Overwrite => write_sql!(f, fmt, " OVERWRITE"),
22			DefineKind::IfNotExists => write_sql!(f, fmt, " IF NOT EXISTS"),
23		}
24		write_sql!(f, fmt, " fn");
25		for s in self.name.split("::") {
26			write_sql!(f, fmt, "::");
27			EscapeKwFreeIdent(s).fmt_sql(f, fmt);
28		}
29		write_sql!(f, fmt, "(");
30		for (i, (name, kind)) in self.args.iter().enumerate() {
31			if i > 0 {
32				f.push_str(", ");
33			}
34			write_sql!(f, fmt, "${}: {kind}", EscapeKwFreeIdent(name));
35		}
36		f.push_str(") ");
37		if let Some(ref v) = self.returns {
38			write_sql!(f, fmt, "-> {v} ");
39		}
40		self.block.fmt_sql(f, fmt);
41		if !matches!(self.comment, Expr::Literal(Literal::None)) {
42			write_sql!(f, fmt, " COMMENT {}", CoverStmts(&self.comment));
43		}
44		let fmt = fmt.increment();
45		write_sql!(f, fmt, " PERMISSIONS {}", self.permissions);
46	}
47}