surql_parser/upstream/sql/statements/define/
api.rs1use super::DefineKind;
2use super::config::api::ApiConfig;
3use crate::compat::catalog::ApiMethod;
4use crate::upstream::fmt::{CoverStmts, Fmt};
5use crate::upstream::sql::{Expr, Literal};
6use surrealdb_types::{SqlFormat, ToSql, write_sql};
7#[derive(Clone, Debug, Eq, PartialEq)]
8#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
9pub struct DefineApiStatement {
10 pub kind: DefineKind,
11 pub path: Expr,
12 pub actions: Vec<ApiAction>,
13 pub fallback: Option<Expr>,
14 pub config: ApiConfig,
15 pub comment: Expr,
16}
17impl Default for DefineApiStatement {
18 fn default() -> Self {
19 Self {
20 kind: DefineKind::Default,
21 path: Expr::Literal(Literal::None),
22 actions: Vec::new(),
23 fallback: None,
24 config: ApiConfig::default(),
25 comment: Expr::Literal(Literal::None),
26 }
27 }
28}
29impl ToSql for DefineApiStatement {
30 fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
31 write_sql!(f, sql_fmt, "DEFINE API");
32 match self.kind {
33 DefineKind::Default => {}
34 DefineKind::Overwrite => write_sql!(f, sql_fmt, " OVERWRITE"),
35 DefineKind::IfNotExists => write_sql!(f, sql_fmt, " IF NOT EXISTS"),
36 }
37 write_sql!(f, sql_fmt, " {}", CoverStmts(&self.path));
38 let sql_fmt = sql_fmt.increment();
39 write_sql!(f, sql_fmt, " FOR any");
40 {
41 let sql_fmt = sql_fmt.increment();
42 write_sql!(f, sql_fmt, "{}", self.config);
43 if let Some(fallback) = &self.fallback {
44 write_sql!(f, sql_fmt, " THEN {}", CoverStmts(fallback));
45 }
46 }
47 for action in &self.actions {
48 write_sql!(f, sql_fmt, " {}", action);
49 }
50 if !matches!(self.comment, Expr::Literal(Literal::None)) {
51 write_sql!(f, sql_fmt, " COMMENT {}", CoverStmts(&self.comment));
52 }
53 }
54}
55#[derive(Clone, Debug, Eq, PartialEq)]
56#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
57pub struct ApiAction {
58 #[cfg_attr(
59 feature = "arbitrary",
60 arbitrary(with = crate::upstream::sql::arbitrary::atleast_one)
61 )]
62 pub methods: Vec<ApiMethod>,
63 pub action: Expr,
64 pub config: ApiConfig,
65}
66impl ToSql for ApiAction {
67 fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
68 f.push_str("FOR ");
69 f.push_str(&Fmt::comma_separated(self.methods.iter()).to_sql());
70 if sql_fmt.is_pretty() {
71 f.push('\n');
72 let inner_fmt = sql_fmt.increment();
73 inner_fmt.write_indent(f);
74 }
75 write_sql!(f, sql_fmt, "{} THEN {}", self.config, self.action);
76 }
77}