surrealdb_sql/statements/define/
function.rs1use 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 pub graphql_alias: Option<String>,
20 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}