1pub mod hash;
2pub mod string;
3
4use bincode::{Decode, Encode};
5use serde::{Deserialize, Serialize};
6
7use crate::{MAGIC_NUMBER, VERSION};
8
9#[derive(Debug, Clone, PartialEq)]
10pub enum CmdType {
11 Ping = 0x01,
12 Authenticate = 0x02,
13 Keys = 0x03,
14 Exists = 0x04,
15 Expire = 0x05,
16 Dbs = 0x06,
17 SetString = 0x11,
18 GetString = 0x12,
19 DelString = 0x13,
20 HashSet = 0x21,
21 HashGet = 0x22,
22 HashDel = 0x23,
23 HashExists = 0x24,
24 HashLen = 0x25,
25 HashFields = 0x26,
26 Error = 0xff,
27}
28
29#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
30pub struct Ping {
31 pub timestamp: u64,
32}
33
34#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
35pub struct Pong {
36 pub timestamp: u64,
37}
38
39impl Pong {
40 pub fn new(timestamp: u64) -> Self {
41 Self { timestamp }
42 }
43
44 pub fn default() -> Self {
45 Self { timestamp: 0 }
46 }
47
48 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
49 let data = serde_json::to_vec(self)?;
50 let data_length = data.len() as u32;
51
52 let mut result = vec![];
53 result.extend(&MAGIC_NUMBER); result.push(VERSION); result.push(CmdType::Ping as u8); result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
60 }
61}
62
63#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
64pub struct ResultError {
65 pub cmd: u8,
66 pub msg: String,
67}
68
69impl ResultError {
70 pub fn new(cmd: u8, msg: String) -> Self {
71 Self { cmd, msg }
72 }
73
74 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
75 let data = serde_json::to_vec(self)?;
76 let data_length = data.len() as u32;
77
78 let mut result = vec![];
79 result.extend(&MAGIC_NUMBER); result.extend(&VERSION.to_be_bytes()); result.push(CmdType::Error as u8); result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
86 }
87}
88
89#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
90pub struct Authenticate {
91 pub secret: String,
92}
93
94#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
95pub struct ResultAuthenticate {
96 pub ok: bool,
97 pub msg: String,
98}
99
100impl ResultAuthenticate {
101 pub fn new(ok: bool, msg: String) -> Self {
102 Self { ok, msg }
103 }
104
105 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
106 let data = serde_json::to_vec(self)?;
107 let data_length = data.len() as u32;
108
109 let mut result = vec![];
110 result.extend(&MAGIC_NUMBER); result.push(VERSION); result.push(CmdType::Authenticate as u8); result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
117 }
118}
119
120#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
121pub struct Keys {
122 pub db: String,
123 pub page: usize,
124 pub size: usize,
125}
126
127#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
128pub struct KeyInfo {
129 pub key: String,
130 pub typ: u8,
131}
132
133#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
134pub struct ResultKeys {
135 pub keys: Vec<KeyInfo>,
136 pub total: u32,
137}
138
139impl ResultKeys {
140 pub fn new(keys: Vec<KeyInfo>, total: u32) -> Self {
141 Self { keys, total }
142 }
143
144 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
145 let data = serde_json::to_vec(self)?;
146 let data_length = data.len() as u32;
147
148 let mut result = vec![];
149 result.extend(&MAGIC_NUMBER); result.push(VERSION); result.push(CmdType::Keys as u8); result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
156 }
157}
158
159#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
160pub struct Exists {
161 pub db: String,
162 pub key: String,
163}
164
165#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
166pub struct ResultExists {
167 pub exists: bool,
168}
169
170impl ResultExists {
171 pub fn new(exists: bool) -> Self {
172 Self { exists }
173 }
174
175 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
176 let data = serde_json::to_vec(self)?;
177 let data_length = data.len() as u32;
178
179 let mut result = vec![];
180 result.extend(&MAGIC_NUMBER); result.extend(&VERSION.to_be_bytes()); result.push(CmdType::Exists as u8);
183 result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
188 }
189}
190
191#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
192pub struct Expire {
193 pub db: String,
194 pub key: String,
195 pub expire: u64,
196}
197
198#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
199pub struct ResultExpire {
200 pub ok: bool,
201}
202
203impl ResultExpire {
204 pub fn new(ok: bool) -> Self {
205 Self { ok }
206 }
207
208 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
209 let data = serde_json::to_vec(self)?;
210 let data_length = data.len() as u32;
211
212 let mut result = vec![];
213 result.extend(&MAGIC_NUMBER); result.extend(&VERSION.to_be_bytes()); result.push(CmdType::Expire as u8);
216 result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
221 }
222}
223
224#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
225pub struct Dbs {
226 }
228
229#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
230pub struct DbInfo {
231 pub name: String,
232 pub count: u32,
233}
234
235#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
236pub struct ResultDbs {
237 pub dbs: Vec<DbInfo>,
238}
239
240impl ResultDbs {
241 pub fn new(dbs: Vec<DbInfo>) -> Self {
242 Self { dbs }
243 }
244
245 pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
246 let data = serde_json::to_vec(self)?;
247 let data_length = data.len() as u32;
248
249 let mut result = vec![];
250 result.extend(&MAGIC_NUMBER); result.push(VERSION); result.push(CmdType::Dbs as u8); result.extend(&seq.to_be_bytes()); result.extend(&data_length.to_be_bytes()); result.extend(data); Ok(result)
257 }
258}