Skip to main content

surrealdb_sql/statements/define/
function.rs

1use common::fmt::EscapeKwFreeIdent;
2use surrealdb_strand::Strand;
3use surrealdb_types::{SqlFormat, ToSql, write_sql};
4
5use super::DefineKind;
6use crate::{Block, CoverStmts, Expr, Kind, Literal, Permission};
7
8#[derive(Clone, Debug, PartialEq, Eq)]
9#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
10pub struct DefineFunctionStatement {
11	pub kind: DefineKind,
12	pub name: Strand,
13	pub args: Vec<(String, Kind)>,
14	pub block: Block,
15	pub comment: Expr,
16	pub permissions: Permission,
17	pub returns: Option<Kind>,
18	/// Optional GraphQL alias declared via `GRAPHQL_ALIAS "..."`.
19	pub graphql_alias: Option<String>,
20	/// Optional GraphQL deprecation reason declared via
21	/// `GRAPHQL_DEPRECATED "..."`.
22	pub graphql_deprecated: Option<String>,
23}
24
25impl ToSql for DefineFunctionStatement {
26	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
27		write_sql!(f, fmt, "DEFINE FUNCTION");
28		match self.kind {
29			DefineKind::Default => {}
30			DefineKind::Overwrite => write_sql!(f, fmt, " OVERWRITE"),
31			DefineKind::IfNotExists => write_sql!(f, fmt, " IF NOT EXISTS"),
32		}
33		write_sql!(f, fmt, " fn");
34		for s in self.name.as_str().split("::") {
35			write_sql!(f, fmt, "::");
36			EscapeKwFreeIdent(s).fmt_sql(f, fmt);
37		}
38		write_sql!(f, fmt, "(");
39		for (i, (name, kind)) in self.args.iter().enumerate() {
40			if i > 0 {
41				f.push_str(", ");
42			}
43			write_sql!(f, fmt, "${}: {kind}", EscapeKwFreeIdent(name));
44		}
45		f.push_str(") ");
46		if let Some(ref v) = self.returns {
47			write_sql!(f, fmt, "-> {v} ");
48		}
49		self.block.fmt_sql(f, fmt);
50		if !matches!(self.comment, Expr::Literal(Literal::None)) {
51			write_sql!(f, fmt, " COMMENT {}", CoverStmts(&self.comment));
52		}
53		if let Some(ref alias) = self.graphql_alias {
54			write_sql!(f, fmt, " GRAPHQL_ALIAS {}", common::fmt::QuoteStr(alias));
55		}
56		if let Some(ref reason) = self.graphql_deprecated {
57			write_sql!(f, fmt, " GRAPHQL_DEPRECATED {}", common::fmt::QuoteStr(reason));
58		}
59		let fmt = fmt.increment();
60		write_sql!(f, fmt, " PERMISSIONS {}", self.permissions);
61	}
62}