surrealdb_core/syn/parser/stmt/
remove.rs

1use reblessive::Stk;
2
3use crate::{
4	sql::{
5		statements::{
6			remove::RemoveAnalyzerStatement, RemoveAccessStatement, RemoveDatabaseStatement,
7			RemoveEventStatement, RemoveFieldStatement, RemoveFunctionStatement,
8			RemoveIndexStatement, RemoveNamespaceStatement, RemoveParamStatement, RemoveStatement,
9			RemoveUserStatement,
10		},
11		Param,
12	},
13	syn::{
14		parser::{
15			mac::{expected, unexpected},
16			ParseResult, Parser,
17		},
18		token::t,
19	},
20};
21
22impl Parser<'_> {
23	pub async fn parse_remove_stmt(&mut self, ctx: &mut Stk) -> ParseResult<RemoveStatement> {
24		let next = self.next();
25		let res = match next.kind {
26			t!("NAMESPACE") => {
27				let expunge = if self.eat(t!("AND")) {
28					expected!(self, t!("EXPUNGE"));
29					true
30				} else {
31					false
32				};
33
34				let if_exists = if self.eat(t!("IF")) {
35					expected!(self, t!("EXISTS"));
36					true
37				} else {
38					false
39				};
40
41				let name = self.next_token_value()?;
42
43				RemoveStatement::Namespace(RemoveNamespaceStatement {
44					name,
45					if_exists,
46					expunge,
47				})
48			}
49			t!("DATABASE") => {
50				let expunge = if self.eat(t!("AND")) {
51					expected!(self, t!("EXPUNGE"));
52					true
53				} else {
54					false
55				};
56
57				let if_exists = if self.eat(t!("IF")) {
58					expected!(self, t!("EXISTS"));
59					true
60				} else {
61					false
62				};
63
64				let name = self.next_token_value()?;
65
66				RemoveStatement::Database(RemoveDatabaseStatement {
67					name,
68					if_exists,
69					expunge,
70				})
71			}
72			t!("FUNCTION") => {
73				let if_exists = if self.eat(t!("IF")) {
74					expected!(self, t!("EXISTS"));
75					true
76				} else {
77					false
78				};
79				let name = self.parse_custom_function_name()?;
80				let next = self.peek();
81				if self.eat(t!("(")) {
82					self.expect_closing_delimiter(t!(")"), next.span)?;
83				}
84
85				RemoveStatement::Function(RemoveFunctionStatement {
86					name,
87					if_exists,
88				})
89			}
90			t!("ACCESS") => {
91				let if_exists = if self.eat(t!("IF")) {
92					expected!(self, t!("EXISTS"));
93					true
94				} else {
95					false
96				};
97				let name = self.next_token_value()?;
98				expected!(self, t!("ON"));
99				let base = self.parse_base(false)?;
100
101				RemoveStatement::Access(RemoveAccessStatement {
102					name,
103					base,
104					if_exists,
105				})
106			}
107			t!("PARAM") => {
108				let if_exists = if self.eat(t!("IF")) {
109					expected!(self, t!("EXISTS"));
110					true
111				} else {
112					false
113				};
114				let name = self.next_token_value::<Param>()?;
115
116				RemoveStatement::Param(RemoveParamStatement {
117					name: name.0,
118					if_exists,
119				})
120			}
121			t!("TABLE") => {
122				let expunge = if self.eat(t!("AND")) {
123					expected!(self, t!("EXPUNGE"));
124					true
125				} else {
126					false
127				};
128
129				let if_exists = if self.eat(t!("IF")) {
130					expected!(self, t!("EXISTS"));
131					true
132				} else {
133					false
134				};
135
136				let name = self.next_token_value()?;
137
138				RemoveStatement::Table(crate::sql::statements::RemoveTableStatement {
139					name,
140					if_exists,
141					expunge,
142				})
143			}
144			t!("EVENT") => {
145				let if_exists = if self.eat(t!("IF")) {
146					expected!(self, t!("EXISTS"));
147					true
148				} else {
149					false
150				};
151				let name = self.next_token_value()?;
152				expected!(self, t!("ON"));
153				self.eat(t!("TABLE"));
154				let table = self.next_token_value()?;
155
156				RemoveStatement::Event(RemoveEventStatement {
157					name,
158					what: table,
159					if_exists,
160				})
161			}
162			t!("FIELD") => {
163				let if_exists = if self.eat(t!("IF")) {
164					expected!(self, t!("EXISTS"));
165					true
166				} else {
167					false
168				};
169				let idiom = self.parse_local_idiom(ctx).await?;
170				expected!(self, t!("ON"));
171				self.eat(t!("TABLE"));
172				let table = self.next_token_value()?;
173
174				RemoveStatement::Field(RemoveFieldStatement {
175					name: idiom,
176					what: table,
177					if_exists,
178				})
179			}
180			t!("INDEX") => {
181				let if_exists = if self.eat(t!("IF")) {
182					expected!(self, t!("EXISTS"));
183					true
184				} else {
185					false
186				};
187				let name = self.next_token_value()?;
188				expected!(self, t!("ON"));
189				self.eat(t!("TABLE"));
190				let what = self.next_token_value()?;
191
192				RemoveStatement::Index(RemoveIndexStatement {
193					name,
194					what,
195					if_exists,
196				})
197			}
198			t!("ANALYZER") => {
199				let if_exists = if self.eat(t!("IF")) {
200					expected!(self, t!("EXISTS"));
201					true
202				} else {
203					false
204				};
205				let name = self.next_token_value()?;
206
207				RemoveStatement::Analyzer(RemoveAnalyzerStatement {
208					name,
209					if_exists,
210				})
211			}
212			t!("USER") => {
213				let if_exists = if self.eat(t!("IF")) {
214					expected!(self, t!("EXISTS"));
215					true
216				} else {
217					false
218				};
219				let name = self.next_token_value()?;
220				expected!(self, t!("ON"));
221				let base = self.parse_base(false)?;
222
223				RemoveStatement::User(RemoveUserStatement {
224					name,
225					base,
226					if_exists,
227				})
228			}
229			// TODO(raphaeldarley): add Config here
230			_ => unexpected!(self, next, "a remove statement keyword"),
231		};
232		Ok(res)
233	}
234}