surql_parser/upstream/syn/parser/stmt/
remove.rs1use crate::upstream::sql::statements::remove::{
2 RemoveAnalyzerStatement, RemoveApiStatement, RemoveBucketStatement, RemoveModuleStatement,
3 RemoveSequenceStatement,
4};
5use crate::upstream::sql::statements::{
6 RemoveAccessStatement, RemoveDatabaseStatement, RemoveEventStatement, RemoveFieldStatement,
7 RemoveFunctionStatement, RemoveIndexStatement, RemoveNamespaceStatement, RemoveParamStatement,
8 RemoveStatement, RemoveUserStatement,
9};
10use crate::upstream::sql::{ModuleName, Param};
11use crate::upstream::syn::error::bail;
12use crate::upstream::syn::parser::mac::{expected, expected_whitespace, unexpected};
13use crate::upstream::syn::parser::{ParseResult, Parser};
14use crate::upstream::syn::token::t;
15use reblessive::Stk;
16impl Parser<'_> {
17 pub async fn parse_remove_stmt(&mut self, stk: &mut Stk) -> ParseResult<RemoveStatement> {
18 let next = self.next();
19 let res = match next.kind {
20 t!("NAMESPACE") => {
21 let expunge = if self.eat(t!("AND")) {
22 expected!(self, t!("EXPUNGE"));
23 true
24 } else {
25 false
26 };
27 let if_exists = if self.eat(t!("IF")) {
28 expected!(self, t!("EXISTS"));
29 true
30 } else {
31 false
32 };
33 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
34 RemoveStatement::Namespace(RemoveNamespaceStatement {
35 name,
36 if_exists,
37 expunge,
38 })
39 }
40 t!("DATABASE") => {
41 let expunge = if self.eat(t!("AND")) {
42 expected!(self, t!("EXPUNGE"));
43 true
44 } else {
45 false
46 };
47 let if_exists = if self.eat(t!("IF")) {
48 expected!(self, t!("EXISTS"));
49 true
50 } else {
51 false
52 };
53 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
54 RemoveStatement::Database(RemoveDatabaseStatement {
55 name,
56 if_exists,
57 expunge,
58 })
59 }
60 t!("FUNCTION") => {
61 let if_exists = if self.eat(t!("IF")) {
62 expected!(self, t!("EXISTS"));
63 true
64 } else {
65 false
66 };
67 let name = self.parse_custom_function_name()?;
68 let next = self.peek();
69 if self.eat(t!("(")) {
70 self.expect_closing_delimiter(t!(")"), next.span)?;
71 }
72 RemoveStatement::Function(RemoveFunctionStatement { name, if_exists })
73 }
74 t!("MODULE") => {
75 if !self.settings.surrealism_enabled {
76 bail!(
77 "Experimental capability `surrealism` is not enabled", @ self
78 .last_span() => "Use of `REMOVE MODULE` is still experimental"
79 )
80 }
81 let if_exists = if self.eat(t!("IF")) {
82 expected!(self, t!("EXISTS"));
83 true
84 } else {
85 false
86 };
87 let peek = self.peek();
88 let name = match peek.kind {
89 t!("mod") => {
90 self.pop_peek();
91 expected_whitespace!(self, t!("::"));
92 let name = self.parse_ident()?;
93 ModuleName::Module(name)
94 }
95 t!("silo") => {
96 self.pop_peek();
97 expected_whitespace!(self, t!("::"));
98 let organisation = self.parse_ident()?;
99 expected_whitespace!(self, t!("::"));
100 let package = self.parse_ident()?;
101 expected_whitespace!(self, t!("<"));
102 let major = self.parse_version_digits()?;
103 expected_whitespace!(self, t!("."));
104 let minor = self.parse_version_digits()?;
105 expected_whitespace!(self, t!("."));
106 let patch = self.parse_version_digits()?;
107 expected_whitespace!(self, t!(">"));
108 ModuleName::Silo(organisation, package, major, minor, patch)
109 }
110 _ => unexpected!(self, peek, "a module name"),
111 };
112 let next = self.peek();
113 if self.eat(t!("(")) {
114 self.expect_closing_delimiter(t!(")"), next.span)?;
115 }
116 RemoveStatement::Module(RemoveModuleStatement { name, if_exists })
117 }
118 t!("ACCESS") => {
119 let if_exists = if self.eat(t!("IF")) {
120 expected!(self, t!("EXISTS"));
121 true
122 } else {
123 false
124 };
125 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
126 expected!(self, t!("ON"));
127 let base = self.parse_base()?;
128 RemoveStatement::Access(RemoveAccessStatement {
129 name,
130 base,
131 if_exists,
132 })
133 }
134 t!("PARAM") => {
135 let if_exists = if self.eat(t!("IF")) {
136 expected!(self, t!("EXISTS"));
137 true
138 } else {
139 false
140 };
141 let name = self.next_token_value::<Param>()?;
142 RemoveStatement::Param(RemoveParamStatement {
143 name: name.to_string(),
144 if_exists,
145 })
146 }
147 t!("TABLE") => {
148 let expunge = if self.eat(t!("AND")) {
149 expected!(self, t!("EXPUNGE"));
150 true
151 } else {
152 false
153 };
154 let if_exists = if self.eat(t!("IF")) {
155 expected!(self, t!("EXISTS"));
156 true
157 } else {
158 false
159 };
160 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
161 RemoveStatement::Table(crate::upstream::sql::statements::RemoveTableStatement {
162 name,
163 if_exists,
164 expunge,
165 })
166 }
167 t!("EVENT") => {
168 let if_exists = if self.eat(t!("IF")) {
169 expected!(self, t!("EXISTS"));
170 true
171 } else {
172 false
173 };
174 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
175 expected!(self, t!("ON"));
176 self.eat(t!("TABLE"));
177 let table = stk.run(|stk| self.parse_expr_field(stk)).await?;
178 RemoveStatement::Event(RemoveEventStatement {
179 name,
180 what: table,
181 if_exists,
182 })
183 }
184 t!("FIELD") => {
185 let if_exists = if self.eat(t!("IF")) {
186 expected!(self, t!("EXISTS"));
187 true
188 } else {
189 false
190 };
191 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
192 expected!(self, t!("ON"));
193 self.eat(t!("TABLE"));
194 let what = stk.run(|stk| self.parse_expr_field(stk)).await?;
195 RemoveStatement::Field(RemoveFieldStatement {
196 name,
197 what,
198 if_exists,
199 })
200 }
201 t!("INDEX") => {
202 let if_exists = if self.eat(t!("IF")) {
203 expected!(self, t!("EXISTS"));
204 true
205 } else {
206 false
207 };
208 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
209 expected!(self, t!("ON"));
210 self.eat(t!("TABLE"));
211 let what = stk.run(|stk| self.parse_expr_field(stk)).await?;
212 RemoveStatement::Index(RemoveIndexStatement {
213 name,
214 what,
215 if_exists,
216 })
217 }
218 t!("ANALYZER") => {
219 let if_exists = if self.eat(t!("IF")) {
220 expected!(self, t!("EXISTS"));
221 true
222 } else {
223 false
224 };
225 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
226 RemoveStatement::Analyzer(RemoveAnalyzerStatement { name, if_exists })
227 }
228 t!("SEQUENCE") => {
229 let if_exists = if self.eat(t!("IF")) {
230 expected!(self, t!("EXISTS"));
231 true
232 } else {
233 false
234 };
235 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
236 RemoveStatement::Sequence(RemoveSequenceStatement { name, if_exists })
237 }
238 t!("USER") => {
239 let if_exists = if self.eat(t!("IF")) {
240 expected!(self, t!("EXISTS"));
241 true
242 } else {
243 false
244 };
245 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
246 expected!(self, t!("ON"));
247 let base = self.parse_base()?;
248 RemoveStatement::User(RemoveUserStatement {
249 name,
250 base,
251 if_exists,
252 })
253 }
254 t!("API") => {
255 let if_exists = if self.eat(t!("IF")) {
256 expected!(self, t!("EXISTS"));
257 true
258 } else {
259 false
260 };
261 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
262 RemoveStatement::Api(RemoveApiStatement { name, if_exists })
263 }
264 t!("BUCKET") => {
265 let if_exists = if self.eat(t!("IF")) {
266 expected!(self, t!("EXISTS"));
267 true
268 } else {
269 false
270 };
271 let name = stk.run(|stk| self.parse_expr_field(stk)).await?;
272 RemoveStatement::Bucket(RemoveBucketStatement { name, if_exists })
273 }
274 _ => unexpected!(self, next, "a remove statement keyword"),
275 };
276 Ok(res)
277 }
278}