Skip to main content

surrealdb_sql/statements/alter/
api.rs

1use 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/// A single `FOR` clause within an `ALTER API` statement.
11#[derive(Clone, Debug, Eq, PartialEq)]
12#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
13pub enum AlterApiClause {
14	/// `FOR any [config] [THEN expr | DROP THEN]`
15	ForAny {
16		config: Option<ApiConfig>,
17		fallback: AlterKind<Expr>,
18	},
19	/// `FOR method1, method2 [config] THEN expr`
20	SetAction(ApiAction),
21	/// `FOR method1, method2 DROP THEN`
22	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))]
61/// AST node for `ALTER API`.
62pub 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}