1use std::slice::Iter;
10
11use crate::cmd::keys::ORDER::{ASC, DESC};
12
13#[derive(Debug)]
14pub struct DEL<'a> {
15 pub keys: Vec<&'a Vec<u8>>,
16}
17
18pub(crate) fn parse_del(iter: Iter<Vec<u8>>) -> DEL {
19 let mut keys = Vec::new();
20 for next_key in iter {
21 keys.push(next_key);
22 }
23 DEL { keys }
24}
25
26#[derive(Debug)]
27pub struct PERSIST<'a> {
28 pub key: &'a [u8],
29}
30
31pub(crate) fn parse_persist(mut iter: Iter<Vec<u8>>) -> PERSIST {
32 let key = iter.next().unwrap();
33 PERSIST { key }
34}
35
36#[derive(Debug)]
37pub struct EXPIRE<'a> {
38 pub key: &'a [u8],
39 pub seconds: &'a [u8],
40}
41
42pub(crate) fn parse_expire(mut iter: Iter<Vec<u8>>) -> EXPIRE {
43 let key = iter.next().unwrap();
44 let seconds = iter.next().unwrap();
45 EXPIRE { key, seconds }
46}
47
48#[derive(Debug)]
49pub struct PEXPIRE<'a> {
50 pub key: &'a [u8],
51 pub milliseconds: &'a [u8],
52}
53
54pub(crate) fn parse_pexpire(mut iter: Iter<Vec<u8>>) -> PEXPIRE {
55 let key = iter.next().unwrap();
56 let milliseconds = iter.next().unwrap();
57 PEXPIRE { key, milliseconds }
58}
59
60#[derive(Debug)]
61pub struct EXPIREAT<'a> {
62 pub key: &'a [u8],
63 pub timestamp: &'a [u8],
64}
65
66pub(crate) fn parse_expireat(mut iter: Iter<Vec<u8>>) -> EXPIREAT {
67 let key = iter.next().unwrap();
68 let timestamp = iter.next().unwrap();
69 EXPIREAT { key, timestamp }
70}
71
72#[derive(Debug)]
73pub struct PEXPIREAT<'a> {
74 pub key: &'a [u8],
75 pub mill_timestamp: &'a [u8],
76}
77
78pub(crate) fn parse_pexpireat(mut iter: Iter<Vec<u8>>) -> PEXPIREAT {
79 let key = iter.next().unwrap();
80 let mill_timestamp = iter.next().unwrap();
81 PEXPIREAT { key, mill_timestamp }
82}
83
84#[derive(Debug)]
85pub struct MOVE<'a> {
86 pub key: &'a [u8],
87 pub db: &'a [u8],
88}
89
90pub(crate) fn parse_move(mut iter: Iter<Vec<u8>>) -> MOVE {
91 let key = iter.next().unwrap();
92 let db = iter.next().unwrap();
93 MOVE { key, db }
94}
95
96#[derive(Debug)]
97pub struct RENAME<'a> {
98 pub key: &'a [u8],
99 pub new_key: &'a [u8],
100}
101
102pub(crate) fn parse_rename(mut iter: Iter<Vec<u8>>) -> RENAME {
103 let key = iter.next().unwrap();
104 let new_key = iter.next().unwrap();
105 RENAME { key, new_key }
106}
107
108#[derive(Debug)]
109pub struct RENAMENX<'a> {
110 pub key: &'a [u8],
111 pub new_key: &'a [u8],
112}
113
114pub(crate) fn parse_renamenx(mut iter: Iter<Vec<u8>>) -> RENAMENX {
115 let key = iter.next().unwrap();
116 let new_key = iter.next().unwrap();
117 RENAMENX { key, new_key }
118}
119
120#[derive(Debug)]
121pub struct RESTORE<'a> {
122 pub key: &'a [u8],
123 pub ttl: &'a [u8],
124 pub value: &'a [u8],
125 pub replace: Option<bool>,
126 pub abs_ttl: Option<bool>,
127 pub idle_time: Option<&'a [u8]>,
128 pub freq: Option<&'a [u8]>,
129}
130
131pub(crate) fn parse_restore(mut iter: Iter<Vec<u8>>) -> RESTORE {
132 let key = iter.next().unwrap();
133 let ttl = iter.next().unwrap();
134 let value = iter.next().unwrap();
135 let mut replace = None;
136 let mut abs_ttl = None;
137 let mut idle_time = None;
138 let mut freq = None;
139 while let Some(next_arg) = iter.next() {
140 let arg = String::from_utf8_lossy(next_arg).to_uppercase();
141 if &arg == "REPLACE" {
142 replace = Some(true);
143 } else if &arg == "ABSTTL" {
144 abs_ttl = Some(true);
145 } else if &arg == "IDLETIME" {
146 idle_time = Some(iter.next().unwrap().as_slice());
147 } else if &arg == "FREQ" {
148 freq = Some(iter.next().unwrap().as_slice());
149 }
150 }
151 RESTORE {
152 key,
153 ttl,
154 value,
155 replace,
156 abs_ttl,
157 idle_time,
158 freq,
159 }
160}
161
162#[derive(Debug)]
163pub struct SORT<'a> {
164 pub key: &'a [u8],
165 pub by_pattern: Option<&'a [u8]>,
166 pub limit: Option<LIMIT<'a>>,
167 pub get_patterns: Option<Vec<&'a [u8]>>,
168 pub order: Option<ORDER>,
169 pub alpha: Option<bool>,
170 pub destination: Option<&'a [u8]>,
171}
172
173#[derive(Debug)]
174pub struct LIMIT<'a> {
175 pub offset: &'a [u8],
176 pub count: &'a [u8],
177}
178
179#[derive(Debug)]
180pub enum ORDER {
181 ASC,
182 DESC,
183}
184
185pub(crate) fn parse_sort(mut iter: Iter<Vec<u8>>) -> SORT {
186 let key = iter.next().unwrap();
187 let mut order = None;
188 let mut alpha = None;
189 let mut limit = None;
190 let mut destination = None;
191 let mut by_pattern = None;
192 let mut patterns = Vec::new();
193 let mut get_patterns = None;
194
195 while let Some(next_arg) = iter.next() {
196 let arg_upper = String::from_utf8_lossy(next_arg).to_uppercase();
197 if &arg_upper == "ASC" {
198 order = Some(ASC);
199 } else if &arg_upper == "DESC" {
200 order = Some(DESC);
201 } else if &arg_upper == "ALPHA" {
202 alpha = Some(true);
203 } else if &arg_upper == "LIMIT" {
204 let offset = iter.next().unwrap();
205 let count = iter.next().unwrap();
206 limit = Some(LIMIT { offset, count });
207 } else if &arg_upper == "STORE" {
208 let store = iter.next().unwrap();
209 destination = Some(store.as_slice());
210 } else if &arg_upper == "BY" {
211 let pattern = iter.next().unwrap();
212 by_pattern = Some(pattern.as_slice());
213 } else if &arg_upper == "GET" {
214 let next_pattern = iter.next().unwrap();
215 patterns.push(next_pattern.as_slice());
216 }
217 }
218 if !patterns.is_empty() {
219 get_patterns = Some(patterns);
220 }
221 SORT {
222 key,
223 by_pattern,
224 limit,
225 get_patterns,
226 order,
227 alpha,
228 destination,
229 }
230}
231
232#[derive(Debug)]
233pub struct UNLINK<'a> {
234 pub keys: Vec<&'a [u8]>,
235}
236
237pub(crate) fn parse_unlink(mut iter: Iter<Vec<u8>>) -> UNLINK {
238 let mut keys = Vec::new();
239 while let Some(next_key) = iter.next() {
240 keys.push(next_key.as_slice());
241 }
242 UNLINK { keys }
243}