1use core::slice::Iter;
10
11use crate::cmd::strings::Op::{AND, NOT, OR, XOR};
12
13#[derive(Debug)]
14pub struct APPEND<'a> {
15 pub key: &'a [u8],
16 pub value: &'a [u8],
17}
18
19pub(crate) fn parse_append(mut iter: Iter<Vec<u8>>) -> APPEND {
20 let key = iter.next().unwrap();
21 let value = iter.next().unwrap();
22 APPEND { key, value }
23}
24
25#[derive(Debug)]
26pub struct BITFIELD<'a> {
27 pub key: &'a [u8],
28 pub statements: Option<Vec<Operation<'a>>>,
29 pub overflows: Option<Vec<Overflow>>,
30}
31
32#[derive(Debug)]
33pub enum Operation<'a> {
34 GET(Get<'a>),
35 INCRBY(IncrBy<'a>),
36 SET(Set<'a>),
37}
38
39#[derive(Debug)]
40pub struct Get<'a> {
41 pub _type: &'a [u8],
42 pub offset: &'a [u8],
43}
44
45#[derive(Debug)]
46pub struct IncrBy<'a> {
47 pub _type: &'a [u8],
48 pub offset: &'a [u8],
49 pub increment: &'a [u8],
50}
51
52#[derive(Debug)]
53pub struct Set<'a> {
54 pub _type: &'a [u8],
55 pub offset: &'a [u8],
56 pub value: &'a [u8],
57}
58
59#[derive(Debug)]
60pub enum Overflow {
61 WRAP,
62 SAT,
63 FAIL,
64}
65
66pub(crate) fn parse_bitfield(mut iter: Iter<Vec<u8>>) -> BITFIELD {
67 let key = iter.next().unwrap();
68
69 let mut statements = Vec::new();
70 let mut overflows = Vec::new();
71 while let Some(next_arg) = iter.next() {
72 let arg_upper = &String::from_utf8_lossy(next_arg).to_uppercase();
73 if arg_upper == "GET" {
74 let _type = iter.next().expect("bitfield 缺失get type");
75 let offset = iter.next().expect("bitfield 缺失get offset");
76 statements.push(Operation::GET(Get { _type, offset }));
77 } else if arg_upper == "SET" {
78 let _type = iter.next().unwrap();
79 let offset = iter.next().expect("bitfield 缺失SET offset");
80 let value = iter.next().expect("bitfield 缺失SET offset");
81 statements.push(Operation::SET(Set { _type, offset, value }));
82 } else if arg_upper == "INCRBY" {
83 let _type = iter.next().expect("bitfield 缺失INCR type");
84 let offset = iter.next().expect("bitfield 缺失INCR offset");
85 let increment = iter.next().expect("bitfield 缺失INCR offset");
86 statements.push(Operation::INCRBY(IncrBy {
87 _type,
88 offset,
89 increment,
90 }));
91 } else if arg_upper == "OVERFLOW" {
92 let _type = String::from_utf8_lossy(iter.next().expect("bitfield 缺失OVERFLOW type"));
93 let type_upper = &_type.to_uppercase();
94 if type_upper == "FAIL" {
95 overflows.push(Overflow::FAIL);
96 } else if type_upper == "SAT" {
97 overflows.push(Overflow::SAT);
98 } else if type_upper == "WRAP" {
99 overflows.push(Overflow::WRAP);
100 }
101 }
102 }
103
104 let _statements;
105 if statements.is_empty() {
106 _statements = None;
107 } else {
108 _statements = Some(statements);
109 }
110 let _overflows;
111 if overflows.is_empty() {
112 _overflows = None;
113 } else {
114 _overflows = Some(overflows);
115 }
116 BITFIELD {
117 key,
118 statements: _statements,
119 overflows: _overflows,
120 }
121}
122
123#[derive(Debug)]
124pub struct BITOP<'a> {
125 pub operation: Op,
126 pub dest_key: &'a [u8],
127 pub keys: Vec<&'a Vec<u8>>,
128}
129
130#[derive(Debug)]
131pub enum Op {
132 AND,
133 OR,
134 XOR,
135 NOT,
136}
137
138pub(crate) fn parse_bitop(mut iter: Iter<Vec<u8>>) -> BITOP {
139 let operation;
140 let op = String::from_utf8_lossy(iter.next().unwrap()).to_uppercase();
141 if &op == "AND" {
142 operation = AND;
143 } else if &op == "OR" {
144 operation = OR;
145 } else if &op == "XOR" {
146 operation = XOR;
147 } else if &op == "NOT" {
148 operation = NOT;
149 } else {
150 panic!("bitop命令缺失operation")
151 }
152 let dest_key = iter.next().unwrap();
153
154 let mut keys = Vec::new();
155 while let Some(next_arg) = iter.next() {
156 keys.push(next_arg);
157 }
158 if keys.is_empty() {
159 panic!("bitop命令缺失input key")
160 }
161 BITOP {
162 operation,
163 dest_key,
164 keys,
165 }
166}
167
168#[derive(Debug)]
169pub struct SET<'a> {
170 pub key: &'a [u8],
171 pub value: &'a [u8],
172 pub expire: Option<(ExpireType, &'a Vec<u8>)>,
173 pub exist_type: Option<ExistType>,
174 pub keep_ttl: Option<bool>,
175}
176
177#[derive(Debug)]
178pub enum ExpireType {
179 EX,
181 PX,
183}
184
185#[derive(Debug)]
186pub enum ExistType {
187 NX,
189 XX,
191}
192
193pub(crate) fn parse_set(mut iter: Iter<Vec<u8>>) -> SET {
194 let key = iter.next().unwrap();
195
196 let value = iter.next().unwrap();
197
198 let mut expire_time = None;
199 let mut expire_type = None;
200 let mut exist_type = None;
201 let mut expire = None;
202 let mut keep_ttl = None;
203
204 for arg in iter {
205 let arg_string = String::from_utf8_lossy(arg);
206 let p_arg = &arg_string.to_uppercase();
207 if p_arg == "EX" {
208 expire_type = Some(ExpireType::EX);
209 } else if p_arg == "PX" {
210 expire_type = Some(ExpireType::PX);
211 } else if p_arg == "NX" {
212 exist_type = Some(ExistType::NX);
213 } else if p_arg == "XX" {
214 exist_type = Some(ExistType::XX);
215 } else if p_arg == "KEEPTTL" {
216 keep_ttl = Some(true)
217 } else {
218 expire_time = Some(arg);
220 }
221 }
222 if expire_type.is_some() && expire_time.is_some() {
223 expire = Some((expire_type.unwrap(), expire_time.unwrap()));
224 }
225 SET {
226 key,
227 value,
228 exist_type,
229 expire,
230 keep_ttl,
231 }
232}
233
234#[derive(Debug)]
235pub struct SETEX<'a> {
236 pub key: &'a [u8],
237 pub seconds: &'a [u8],
238 pub value: &'a [u8],
239}
240
241pub(crate) fn parse_setex(mut iter: Iter<Vec<u8>>) -> SETEX {
242 let key = iter.next().unwrap();
243 let seconds = iter.next().unwrap();
244 let value = iter.next().unwrap();
245 SETEX { key, seconds, value }
246}
247
248#[derive(Debug)]
249pub struct SETNX<'a> {
250 pub key: &'a [u8],
251 pub value: &'a [u8],
252}
253
254pub(crate) fn parse_setnx(mut iter: Iter<Vec<u8>>) -> SETNX {
255 let key = iter.next().unwrap();
256 let value = iter.next().unwrap();
257 SETNX { key, value }
258}
259
260#[derive(Debug)]
261pub struct PSETEX<'a> {
262 pub key: &'a [u8],
263 pub milliseconds: &'a [u8],
264 pub value: &'a [u8],
265}
266
267pub(crate) fn parse_psetex(mut iter: Iter<Vec<u8>>) -> PSETEX {
268 let key = iter.next().unwrap();
269 let milliseconds = iter.next().unwrap();
270 let value = iter.next().unwrap();
271 PSETEX {
272 key,
273 milliseconds,
274 value,
275 }
276}
277
278#[derive(Debug)]
279pub struct SETRANGE<'a> {
280 pub key: &'a [u8],
281 pub offset: &'a [u8],
282 pub value: &'a [u8],
283}
284
285pub(crate) fn parse_setrange(mut iter: Iter<Vec<u8>>) -> SETRANGE {
286 let key = iter.next().unwrap();
287 let offset = iter.next().unwrap();
288 let value = iter.next().unwrap();
289 SETRANGE { key, offset, value }
290}
291
292#[derive(Debug)]
293pub struct DECR<'a> {
294 pub key: &'a [u8],
295}
296
297pub(crate) fn parse_decr(mut iter: Iter<Vec<u8>>) -> DECR {
298 let key = iter.next().unwrap();
299 DECR { key }
300}
301
302#[derive(Debug)]
303pub struct DECRBY<'a> {
304 pub key: &'a [u8],
305 pub decrement: &'a [u8],
306}
307
308pub(crate) fn parse_decrby(mut iter: Iter<Vec<u8>>) -> DECRBY {
309 let key = iter.next().unwrap();
310 let decrement = iter.next().unwrap();
311 DECRBY { key, decrement }
312}
313
314#[derive(Debug)]
315pub struct INCR<'a> {
316 pub key: &'a [u8],
317}
318
319pub(crate) fn parse_incr(mut iter: Iter<Vec<u8>>) -> INCR {
320 let key = iter.next().unwrap();
321 INCR { key }
322}
323
324#[derive(Debug)]
325pub struct INCRBY<'a> {
326 pub key: &'a [u8],
327 pub increment: &'a [u8],
328}
329
330pub(crate) fn parse_incrby(mut iter: Iter<Vec<u8>>) -> INCRBY {
331 let key = iter.next().unwrap();
332 let increment = iter.next().unwrap();
333 INCRBY { key, increment }
334}
335
336#[derive(Debug)]
337pub struct KeyValue<'a> {
338 pub key: &'a [u8],
339 pub value: &'a [u8],
340}
341
342#[derive(Debug)]
343pub struct MSET<'a> {
344 pub key_values: Vec<KeyValue<'a>>,
345}
346
347pub(crate) fn parse_mset(mut iter: Iter<Vec<u8>>) -> MSET {
348 let mut key_values = Vec::new();
349 while let Some(key) = iter.next() {
350 if let Some(value) = iter.next() {
351 key_values.push(KeyValue { key, value });
352 }
353 }
354 if key_values.is_empty() {
355 panic!("mset命令缺失key value");
356 }
357 MSET { key_values }
358}
359
360#[derive(Debug)]
361pub struct MSETNX<'a> {
362 pub key_values: Vec<KeyValue<'a>>,
363}
364
365pub(crate) fn parse_msetnx(mut iter: Iter<Vec<u8>>) -> MSETNX {
366 let mut key_values = Vec::new();
367 while let Some(key) = iter.next() {
368 if let Some(value) = iter.next() {
369 key_values.push(KeyValue { key, value });
370 }
371 }
372 if key_values.is_empty() {
373 panic!("msetnx命令缺失key value");
374 }
375 MSETNX { key_values }
376}
377
378#[derive(Debug)]
379pub struct SETBIT<'a> {
380 pub key: &'a [u8],
381 pub offset: &'a [u8],
382 pub value: &'a [u8],
383}
384
385pub(crate) fn parse_setbit(mut iter: Iter<Vec<u8>>) -> SETBIT {
386 let key = iter.next().unwrap();
387 let offset = iter.next().unwrap();
388 let value = iter.next().unwrap();
389 SETBIT { key, value, offset }
390}
391
392#[derive(Debug)]
393pub struct GETSET<'a> {
394 pub key: &'a [u8],
395 pub value: &'a [u8],
396}
397
398pub(crate) fn parse_getset(mut iter: Iter<Vec<u8>>) -> GETSET {
399 let key = iter.next().unwrap();
400 let value = iter.next().unwrap();
401 GETSET { key, value }
402}