surql_parser/upstream/sql/statements/define/
function.rs1use 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}