1use crate::cmd::connection::{SELECT, SWAPDB};
16use crate::cmd::hashes::*;
17use crate::cmd::hyperloglog::{PFADD, PFCOUNT, PFMERGE};
18use crate::cmd::keys::*;
19use crate::cmd::lists::*;
20use crate::cmd::pub_sub::PUBLISH;
21use crate::cmd::scripting::{EVAL, EVALSHA, SCRIPTLOAD};
22use crate::cmd::server::{FLUSHALL, FLUSHDB};
23use crate::cmd::sets::*;
24use crate::cmd::sorted_sets::*;
25use crate::cmd::streams::{XACK, XADD, XCLAIM, XDEL, XGROUP, XTRIM};
26use crate::cmd::strings::*;
27use crate::{Event, EventHandler};
28
29pub mod connection;
30pub mod hashes;
31pub mod hyperloglog;
32pub mod keys;
33pub mod lists;
34pub mod pub_sub;
35pub mod scripting;
36pub mod server;
37pub mod sets;
38pub mod sorted_sets;
39pub mod streams;
40pub mod strings;
41
42#[derive(Debug)]
46pub enum Command<'a> {
47 APPEND(&'a APPEND<'a>),
48 BITFIELD(&'a BITFIELD<'a>),
49 BITOP(&'a BITOP<'a>),
50 BRPOPLPUSH(&'a BRPOPLPUSH<'a>),
51 DECR(&'a DECR<'a>),
52 DECRBY(&'a DECRBY<'a>),
53 DEL(&'a DEL<'a>),
54 EVAL(&'a EVAL<'a>),
55 EVALSHA(&'a EVALSHA<'a>),
56 EXPIRE(&'a EXPIRE<'a>),
57 EXPIREAT(&'a EXPIREAT<'a>),
58 EXEC,
59 FLUSHALL(&'a FLUSHALL),
60 FLUSHDB(&'a FLUSHDB),
61 GETSET(&'a GETSET<'a>),
62 HDEL(&'a HDEL<'a>),
63 HINCRBY(&'a HINCRBY<'a>),
64 HMSET(&'a HMSET<'a>),
65 HSET(&'a HSET<'a>),
66 HSETNX(&'a HSETNX<'a>),
67 INCR(&'a INCR<'a>),
68 INCRBY(&'a INCRBY<'a>),
69 LINSERT(&'a LINSERT<'a>),
70 LPOP(&'a LPOP<'a>),
71 LPUSH(&'a LPUSH<'a>),
72 LPUSHX(&'a LPUSHX<'a>),
73 LREM(&'a LREM<'a>),
74 LSET(&'a LSET<'a>),
75 LTRIM(&'a LTRIM<'a>),
76 MOVE(&'a MOVE<'a>),
77 MSET(&'a MSET<'a>),
78 MSETNX(&'a MSETNX<'a>),
79 MULTI,
80 PERSIST(&'a PERSIST<'a>),
81 PEXPIRE(&'a PEXPIRE<'a>),
82 PEXPIREAT(&'a PEXPIREAT<'a>),
83 PFADD(&'a PFADD<'a>),
84 PFCOUNT(&'a PFCOUNT<'a>),
85 PFMERGE(&'a PFMERGE<'a>),
86 PSETEX(&'a PSETEX<'a>),
87 PUBLISH(&'a PUBLISH<'a>),
88 RENAME(&'a RENAME<'a>),
89 RENAMENX(&'a RENAMENX<'a>),
90 RESTORE(&'a RESTORE<'a>),
91 RPOP(&'a RPOP<'a>),
92 RPOPLPUSH(&'a RPOPLPUSH<'a>),
93 RPUSH(&'a RPUSH<'a>),
94 RPUSHX(&'a RPUSHX<'a>),
95 SADD(&'a SADD<'a>),
96 SCRIPTFLUSH,
97 SCRIPTLOAD(&'a SCRIPTLOAD<'a>),
98 SDIFFSTORE(&'a SDIFFSTORE<'a>),
99 SET(&'a SET<'a>),
100 SETBIT(&'a SETBIT<'a>),
101 SETEX(&'a SETEX<'a>),
102 SETNX(&'a SETNX<'a>),
103 SELECT(&'a SELECT),
104 SETRANGE(&'a SETRANGE<'a>),
105 SINTERSTORE(&'a SINTERSTORE<'a>),
106 SMOVE(&'a SMOVE<'a>),
107 SORT(&'a SORT<'a>),
108 SREM(&'a SREM<'a>),
109 SUNIONSTORE(&'a SUNIONSTORE<'a>),
110 SWAPDB(&'a SWAPDB<'a>),
111 UNLINK(&'a UNLINK<'a>),
112 ZADD(&'a ZADD<'a>),
113 ZINCRBY(&'a ZINCRBY<'a>),
114 ZINTERSTORE(&'a ZINTERSTORE<'a>),
115 ZPOPMAX(&'a ZPOPMAX<'a>),
116 ZPOPMIN(&'a ZPOPMIN<'a>),
117 ZREM(&'a ZREM<'a>),
118 ZREMRANGEBYLEX(&'a ZREMRANGEBYLEX<'a>),
119 ZREMRANGEBYRANK(&'a ZREMRANGEBYRANK<'a>),
120 ZREMRANGEBYSCORE(&'a ZREMRANGEBYSCORE<'a>),
121 ZUNIONSTORE(&'a ZUNIONSTORE<'a>),
122 XACK(&'a XACK<'a>),
123 XADD(&'a XADD<'a>),
124 XCLAIM(&'a XCLAIM<'a>),
125 XDEL(&'a XDEL<'a>),
126 XGROUP(&'a XGROUP<'a>),
127 XTRIM(&'a XTRIM<'a>),
128 Other(RawCommand),
129}
130
131#[derive(Debug)]
132pub struct RawCommand {
133 pub name: String,
134 pub args: Vec<Vec<u8>>,
135}
136
137pub(crate) fn parse(data: Vec<Vec<u8>>, cmd_handler: &mut dyn EventHandler) {
138 let mut iter = data.iter();
139 if let Some(cmd_name) = iter.next() {
140 let cmd_name = String::from_utf8_lossy(cmd_name).to_uppercase();
141 match cmd_name.as_str() {
142 "APPEND" => {
143 let cmd = strings::parse_append(iter);
144 cmd_handler.handle(Event::AOF(Command::APPEND(&cmd)));
145 }
146 "BITFIELD" => {
147 let cmd = strings::parse_bitfield(iter);
148 cmd_handler.handle(Event::AOF(Command::BITFIELD(&cmd)));
149 }
150 "BITOP" => {
151 let cmd = strings::parse_bitop(iter);
152 cmd_handler.handle(Event::AOF(Command::BITOP(&cmd)));
153 }
154 "BRPOPLPUSH" => {
155 let cmd = lists::parse_brpoplpush(iter);
156 cmd_handler.handle(Event::AOF(Command::BRPOPLPUSH(&cmd)));
157 }
158 "DEL" => {
159 let cmd = keys::parse_del(iter);
160 cmd_handler.handle(Event::AOF(Command::DEL(&cmd)));
161 }
162 "DECR" => {
163 let cmd = strings::parse_decr(iter);
164 cmd_handler.handle(Event::AOF(Command::DECR(&cmd)));
165 }
166 "DECRBY" => {
167 let cmd = strings::parse_decrby(iter);
168 cmd_handler.handle(Event::AOF(Command::DECRBY(&cmd)));
169 }
170 "EVAL" => {
171 let cmd = scripting::parse_eval(iter);
172 cmd_handler.handle(Event::AOF(Command::EVAL(&cmd)));
173 }
174 "EVALSHA" => {
175 let cmd = scripting::parse_evalsha(iter);
176 cmd_handler.handle(Event::AOF(Command::EVALSHA(&cmd)));
177 }
178 "EXPIRE" => {
179 let cmd = keys::parse_expire(iter);
180 cmd_handler.handle(Event::AOF(Command::EXPIRE(&cmd)));
181 }
182 "EXPIREAT" => {
183 let cmd = keys::parse_expireat(iter);
184 cmd_handler.handle(Event::AOF(Command::EXPIREAT(&cmd)));
185 }
186 "EXEC" => {
187 cmd_handler.handle(Event::AOF(Command::EXEC));
188 }
189 "FLUSHALL" => {
190 let cmd = server::parse_flushall(iter);
191 cmd_handler.handle(Event::AOF(Command::FLUSHALL(&cmd)));
192 }
193 "FLUSHDB" => {
194 let cmd = server::parse_flushdb(iter);
195 cmd_handler.handle(Event::AOF(Command::FLUSHDB(&cmd)));
196 }
197 "GETSET" => {
198 let cmd = strings::parse_getset(iter);
199 cmd_handler.handle(Event::AOF(Command::GETSET(&cmd)));
200 }
201 "HDEL" => {
202 let cmd = hashes::parse_hdel(iter);
203 cmd_handler.handle(Event::AOF(Command::HDEL(&cmd)));
204 }
205 "HINCRBY" => {
206 let cmd = hashes::parse_hincrby(iter);
207 cmd_handler.handle(Event::AOF(Command::HINCRBY(&cmd)));
208 }
209 "HMSET" => {
210 let cmd = hashes::parse_hmset(iter);
211 cmd_handler.handle(Event::AOF(Command::HMSET(&cmd)));
212 }
213 "HSET" => {
214 let cmd = hashes::parse_hset(iter);
215 cmd_handler.handle(Event::AOF(Command::HSET(&cmd)));
216 }
217 "HSETNX" => {
218 let cmd = hashes::parse_hsetnx(iter);
219 cmd_handler.handle(Event::AOF(Command::HSETNX(&cmd)));
220 }
221 "INCR" => {
222 let cmd = strings::parse_incr(iter);
223 cmd_handler.handle(Event::AOF(Command::INCR(&cmd)));
224 }
225 "INCRBY" => {
226 let cmd = strings::parse_incrby(iter);
227 cmd_handler.handle(Event::AOF(Command::INCRBY(&cmd)));
228 }
229 "LINSERT" => {
230 let cmd = lists::parse_linsert(iter);
231 cmd_handler.handle(Event::AOF(Command::LINSERT(&cmd)));
232 }
233 "LPOP" => {
234 let cmd = lists::parse_lpop(iter);
235 cmd_handler.handle(Event::AOF(Command::LPOP(&cmd)));
236 }
237 "LPUSH" => {
238 let cmd = lists::parse_lpush(iter);
239 cmd_handler.handle(Event::AOF(Command::LPUSH(&cmd)));
240 }
241 "LPUSHX" => {
242 let cmd = lists::parse_lpushx(iter);
243 cmd_handler.handle(Event::AOF(Command::LPUSHX(&cmd)));
244 }
245 "LREM" => {
246 let cmd = lists::parse_lrem(iter);
247 cmd_handler.handle(Event::AOF(Command::LREM(&cmd)));
248 }
249 "LSET" => {
250 let cmd = lists::parse_lset(iter);
251 cmd_handler.handle(Event::AOF(Command::LSET(&cmd)));
252 }
253 "LTRIM" => {
254 let cmd = lists::parse_ltrim(iter);
255 cmd_handler.handle(Event::AOF(Command::LTRIM(&cmd)));
256 }
257 "RENAME" => {
258 let cmd = keys::parse_rename(iter);
259 cmd_handler.handle(Event::AOF(Command::RENAME(&cmd)));
260 }
261 "RENAMENX" => {
262 let cmd = keys::parse_renamenx(iter);
263 cmd_handler.handle(Event::AOF(Command::RENAMENX(&cmd)));
264 }
265 "RESTORE" => {
266 let cmd = keys::parse_restore(iter);
267 cmd_handler.handle(Event::AOF(Command::RESTORE(&cmd)));
268 }
269 "RPOP" => {
270 let cmd = lists::parse_rpop(iter);
271 cmd_handler.handle(Event::AOF(Command::RPOP(&cmd)));
272 }
273 "RPOPLPUSH" => {
274 let cmd = lists::parse_rpoplpush(iter);
275 cmd_handler.handle(Event::AOF(Command::RPOPLPUSH(&cmd)));
276 }
277 "RPUSH" => {
278 let cmd = lists::parse_rpush(iter);
279 cmd_handler.handle(Event::AOF(Command::RPUSH(&cmd)));
280 }
281 "RPUSHX" => {
282 let cmd = lists::parse_rpushx(iter);
283 cmd_handler.handle(Event::AOF(Command::RPUSHX(&cmd)));
284 }
285 "SADD" => {
286 let cmd = sets::parse_sadd(iter);
287 cmd_handler.handle(Event::AOF(Command::SADD(&cmd)));
288 }
289 "SCRIPT" => {
290 let cmd = iter.next().unwrap();
291 let cmd = String::from_utf8_lossy(cmd).to_uppercase();
292 if &cmd == "LOAD" {
293 let cmd = scripting::parse_script_load(iter);
294 cmd_handler.handle(Event::AOF(Command::SCRIPTLOAD(&cmd)));
295 } else if &cmd == "FLUSH" {
296 cmd_handler.handle(Event::AOF(Command::SCRIPTFLUSH));
297 }
298 }
299 "SDIFFSTORE" => {
300 let cmd = sets::parse_sdiffstore(iter);
301 cmd_handler.handle(Event::AOF(Command::SDIFFSTORE(&cmd)));
302 }
303 "SMOVE" => {
304 let cmd = sets::parse_smove(iter);
305 cmd_handler.handle(Event::AOF(Command::SMOVE(&cmd)));
306 }
307 "SET" => {
308 let cmd = strings::parse_set(iter);
309 cmd_handler.handle(Event::AOF(Command::SET(&cmd)));
310 }
311 "SELECT" => {
312 let cmd = connection::parse_select(iter);
313 cmd_handler.handle(Event::AOF(Command::SELECT(&cmd)));
314 }
315 "SORT" => {
316 let cmd = keys::parse_sort(iter);
317 cmd_handler.handle(Event::AOF(Command::SORT(&cmd)));
318 }
319 "SREM" => {
320 let cmd = sets::parse_srem(iter);
321 cmd_handler.handle(Event::AOF(Command::SREM(&cmd)));
322 }
323 "SUNIONSTORE" => {
324 let cmd = sets::parse_sunionstore(iter);
325 cmd_handler.handle(Event::AOF(Command::SUNIONSTORE(&cmd)));
326 }
327 "SWAPDB" => {
328 let cmd = connection::parse_swapdb(iter);
329 cmd_handler.handle(Event::AOF(Command::SWAPDB(&cmd)));
330 }
331 "UNLINK" => {
332 let cmd = keys::parse_unlink(iter);
333 cmd_handler.handle(Event::AOF(Command::UNLINK(&cmd)));
334 }
335 "MOVE" => {
336 let cmd = keys::parse_move(iter);
337 cmd_handler.handle(Event::AOF(Command::MOVE(&cmd)));
338 }
339 "MSET" => {
340 let cmd = strings::parse_mset(iter);
341 cmd_handler.handle(Event::AOF(Command::MSET(&cmd)));
342 }
343 "MSETNX" => {
344 let cmd = strings::parse_msetnx(iter);
345 cmd_handler.handle(Event::AOF(Command::MSETNX(&cmd)));
346 }
347 "MULTI" => {
348 cmd_handler.handle(Event::AOF(Command::MULTI));
349 }
350 "PFADD" => {
351 let cmd = hyperloglog::parse_pfadd(iter);
352 cmd_handler.handle(Event::AOF(Command::PFADD(&cmd)));
353 }
354 "PFCOUNT" => {
355 let cmd = hyperloglog::parse_pfcount(iter);
356 cmd_handler.handle(Event::AOF(Command::PFCOUNT(&cmd)));
357 }
358 "PFMERGE" => {
359 let cmd = hyperloglog::parse_pfmerge(iter);
360 cmd_handler.handle(Event::AOF(Command::PFMERGE(&cmd)));
361 }
362 "SETEX" => {
363 let cmd = strings::parse_setex(iter);
364 cmd_handler.handle(Event::AOF(Command::SETEX(&cmd)));
365 }
366 "SETNX" => {
367 let cmd = strings::parse_setnx(iter);
368 cmd_handler.handle(Event::AOF(Command::SETNX(&cmd)));
369 }
370 "PSETEX" => {
371 let cmd = strings::parse_psetex(iter);
372 cmd_handler.handle(Event::AOF(Command::PSETEX(&cmd)));
373 }
374 "PUBLISH" => {
375 let cmd = pub_sub::parse_publish(iter);
376 cmd_handler.handle(Event::AOF(Command::PUBLISH(&cmd)));
377 }
378 "PEXPIRE" => {
379 let cmd = keys::parse_pexpire(iter);
380 cmd_handler.handle(Event::AOF(Command::PEXPIRE(&cmd)));
381 }
382 "PEXPIREAT" => {
383 let cmd = keys::parse_pexpireat(iter);
384 cmd_handler.handle(Event::AOF(Command::PEXPIREAT(&cmd)));
385 }
386 "PERSIST" => {
387 let cmd = keys::parse_persist(iter);
388 cmd_handler.handle(Event::AOF(Command::PERSIST(&cmd)));
389 }
390 "SETRANGE" => {
391 let cmd = strings::parse_setrange(iter);
392 cmd_handler.handle(Event::AOF(Command::SETRANGE(&cmd)));
393 }
394 "SETBIT" => {
395 let cmd = strings::parse_setbit(iter);
396 cmd_handler.handle(Event::AOF(Command::SETBIT(&cmd)));
397 }
398 "SINTERSTORE" => {
399 let cmd = sets::parse_sinterstore(iter);
400 cmd_handler.handle(Event::AOF(Command::SINTERSTORE(&cmd)));
401 }
402 "ZADD" => {
403 let cmd = sorted_sets::parse_zadd(iter);
404 cmd_handler.handle(Event::AOF(Command::ZADD(&cmd)));
405 }
406 "ZINCRBY" => {
407 let cmd = sorted_sets::parse_zincrby(iter);
408 cmd_handler.handle(Event::AOF(Command::ZINCRBY(&cmd)));
409 }
410 "ZINTERSTORE" => {
411 let cmd = sorted_sets::parse_zinterstore(iter);
412 cmd_handler.handle(Event::AOF(Command::ZINTERSTORE(&cmd)));
413 }
414 "ZPOPMAX" => {
415 let cmd = sorted_sets::parse_zpopmax(iter);
416 cmd_handler.handle(Event::AOF(Command::ZPOPMAX(&cmd)));
417 }
418 "ZPOPMIN" => {
419 let cmd = sorted_sets::parse_zpopmin(iter);
420 cmd_handler.handle(Event::AOF(Command::ZPOPMIN(&cmd)));
421 }
422 "ZREM" => {
423 let cmd = sorted_sets::parse_zrem(iter);
424 cmd_handler.handle(Event::AOF(Command::ZREM(&cmd)));
425 }
426 "ZREMRANGEBYLEX" => {
427 let cmd = sorted_sets::parse_zremrangebylex(iter);
428 cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYLEX(&cmd)));
429 }
430 "ZREMRANGEBYRANK" => {
431 let cmd = sorted_sets::parse_zremrangebyrank(iter);
432 cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYRANK(&cmd)));
433 }
434 "ZREMRANGEBYSCORE" => {
435 let cmd = sorted_sets::parse_zremrangebyscore(iter);
436 cmd_handler.handle(Event::AOF(Command::ZREMRANGEBYSCORE(&cmd)));
437 }
438 "ZUNIONSTORE" => {
439 let cmd = sorted_sets::parse_zunionstore(iter);
440 cmd_handler.handle(Event::AOF(Command::ZUNIONSTORE(&cmd)));
441 }
442 "XACK" => {
443 let cmd = streams::parse_xack(iter);
444 cmd_handler.handle(Event::AOF(Command::XACK(&cmd)));
445 }
446 "XADD" => {
447 let cmd = streams::parse_xadd(iter);
448 cmd_handler.handle(Event::AOF(Command::XADD(&cmd)));
449 }
450 "XCLAIM" => {
451 let cmd = streams::parse_xclaim(iter);
452 cmd_handler.handle(Event::AOF(Command::XCLAIM(&cmd)));
453 }
454 "XDEL" => {
455 let cmd = streams::parse_xdel(iter);
456 cmd_handler.handle(Event::AOF(Command::XDEL(&cmd)));
457 }
458 "XGROUP" => {
459 let cmd = streams::parse_xgroup(iter);
460 cmd_handler.handle(Event::AOF(Command::XGROUP(&cmd)));
461 }
462 "XTRIM" => {
463 let cmd = streams::parse_xtrim(iter);
464 cmd_handler.handle(Event::AOF(Command::XTRIM(&cmd)));
465 }
466 "PING" => {
467 }
469 _ => {
470 let mut args = Vec::new();
471 while let Some(arg) = iter.next() {
472 args.push(arg.clone());
473 }
474 let cmd = RawCommand { name: cmd_name, args };
475 cmd_handler.handle(Event::AOF(Command::Other(cmd)))
476 }
477 };
478 }
479}