surrealdb_sql/statements/alter/
api.rs1use common::fmt::{Fmt, QuoteStr};
2use surrealdb_types::{SqlFormat, ToSql, write_sql};
3
4use super::AlterKind;
5use crate::literal::Literal;
6use crate::statements::define::ApiAction;
7use crate::statements::define::config::api::ApiConfig;
8use crate::{ApiMethod, CoverStmts, Expr};
9
10#[derive(Clone, Debug, Eq, PartialEq)]
12#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
13pub enum AlterApiClause {
14 ForAny {
16 config: Option<ApiConfig>,
17 fallback: AlterKind<Expr>,
18 },
19 SetAction(ApiAction),
21 DropAction {
23 #[cfg_attr(feature = "arbitrary", arbitrary(with = crate::arbitrary::atleast_one))]
24 methods: Vec<ApiMethod>,
25 },
26}
27
28impl ToSql for AlterApiClause {
29 fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
30 match self {
31 AlterApiClause::ForAny {
32 config,
33 fallback,
34 } => {
35 f.push_str(" FOR any");
36 if let Some(c) = config {
37 write_sql!(f, fmt, "{}", c);
38 }
39 match fallback {
40 AlterKind::Set(v) => write_sql!(f, fmt, " THEN {}", CoverStmts(v)),
41 AlterKind::Drop => f.push_str(" DROP THEN"),
42 AlterKind::None => {}
43 }
44 }
45 AlterApiClause::SetAction(action) => {
46 write_sql!(f, fmt, " {}", action);
47 }
48 AlterApiClause::DropAction {
49 methods,
50 } => {
51 f.push_str(" FOR ");
52 f.push_str(&Fmt::comma_separated(methods.iter()).to_sql());
53 f.push_str(" DROP THEN");
54 }
55 }
56 }
57}
58
59#[derive(Clone, Debug, Eq, PartialEq)]
60#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
61pub struct AlterApiStatement {
63 pub path: Expr,
64 pub if_exists: bool,
65 pub clauses: Vec<AlterApiClause>,
66 pub comment: AlterKind<String>,
67}
68
69impl Default for AlterApiStatement {
70 fn default() -> Self {
71 Self {
72 path: Expr::Literal(Literal::None),
73 if_exists: false,
74 clauses: Vec::new(),
75 comment: AlterKind::None,
76 }
77 }
78}
79
80impl ToSql for AlterApiStatement {
81 fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
82 write_sql!(f, fmt, "ALTER API");
83 if self.if_exists {
84 write_sql!(f, fmt, " IF EXISTS");
85 }
86 write_sql!(f, fmt, " {}", CoverStmts(&self.path));
87
88 for clause in &self.clauses {
89 clause.fmt_sql(f, fmt);
90 }
91
92 match self.comment {
93 AlterKind::Set(ref v) => write_sql!(f, fmt, " COMMENT {}", QuoteStr(v)),
94 AlterKind::Drop => f.push_str(" DROP COMMENT"),
95 AlterKind::None => {}
96 }
97 }
98}