surrealdb_core/syn/parser/stmt/
remove.rs1use 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 _ => unexpected!(self, next, "a remove statement keyword"),
231 };
232 Ok(res)
233 }
234}