akv/command/
mod.rs

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    SetString = 0x11,
17    GetString = 0x12,
18    DelString = 0x13,
19    HashSet = 0x21,
20    HashGet = 0x22,
21    HashDel = 0x23,
22    HashExists = 0x24,
23    HashLen = 0x25,
24    HashFields = 0x26,
25    Error = 0xff,
26}
27
28#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
29pub struct Ping {
30    pub timestamp: u64,
31}
32
33#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
34pub struct Pong {
35    pub timestamp: u64,
36}
37
38impl Pong {
39    pub fn new(timestamp: u64) -> Self {
40        Self { timestamp }
41    }
42
43    pub fn default() -> Self {
44        Self { timestamp: 0 }
45    }
46
47    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
48        let data = serde_json::to_vec(self)?;
49        let data_length = data.len() as u32;
50
51        let mut result = vec![];
52        result.extend(&MAGIC_NUMBER); // 魔数
53        result.push(VERSION); // 版本
54        result.push(CmdType::Ping as u8); // Ping 命令结果
55        result.extend(&seq.to_be_bytes()); // 序列号
56        result.extend(&data_length.to_be_bytes()); // 长度
57        result.extend(data); // Pong 数据
58        Ok(result)
59    }
60}
61
62#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
63pub struct ResultError {
64    pub cmd: u8,
65    pub msg: String,
66}
67
68impl ResultError {
69    pub fn new(cmd: u8, msg: String) -> Self {
70        Self { cmd, msg }
71    }
72
73    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
74        let data = serde_json::to_vec(self)?;
75        let data_length = data.len() as u32;
76
77        let mut result = vec![];
78        result.extend(&MAGIC_NUMBER); // 魔数
79        result.extend(&VERSION.to_be_bytes()); // 版本
80        result.push(CmdType::Error as u8); // 错误
81        result.extend(&seq.to_be_bytes()); // 序列号
82        result.extend(&data_length.to_be_bytes()); // 长度
83        result.extend(data); // 错误数据
84        Ok(result)
85    }
86}
87
88#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
89pub struct Authenticate {
90    pub secret: String,
91}
92
93#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
94pub struct ResultAuthenticate {
95    pub ok: bool,
96    pub msg: String,
97}
98
99impl ResultAuthenticate {
100    pub fn new(ok: bool, msg: String) -> Self {
101        Self { ok, msg }
102    }
103
104    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
105        let data = serde_json::to_vec(self)?;
106        let data_length = data.len() as u32;
107
108        let mut result = vec![];
109        result.extend(&MAGIC_NUMBER); // 魔数
110        result.push(VERSION); // 版本
111        result.push(CmdType::Authenticate as u8); // Authenticate 命令结果
112        result.extend(&seq.to_be_bytes()); // 序列号
113        result.extend(&data_length.to_be_bytes()); // 长度
114        result.extend(data); // Authenticate 数据
115        Ok(result)
116    }
117}
118
119#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
120pub struct Keys {
121    pub db: String,
122    pub page: usize,
123    pub size: usize,
124}
125
126#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
127pub struct ResultKeys {
128    pub keys: Vec<String>,
129    pub total: u32,
130}
131
132impl ResultKeys {
133    pub fn new(keys: Vec<String>, total: u32) -> Self {
134        Self { keys, total }
135    }
136
137    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
138        let data = serde_json::to_vec(self)?;
139        let data_length = data.len() as u32;
140
141        let mut result = vec![];
142        result.extend(&MAGIC_NUMBER); // 魔数
143        result.push(VERSION); // 版本
144        result.push(CmdType::Keys as u8); // Keys 命令结果
145        result.extend(&seq.to_be_bytes()); // 序列号
146        result.extend(&data_length.to_be_bytes()); // 长度
147        result.extend(data); // Keys 数据
148        Ok(result)
149    }
150}
151
152#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
153pub struct Exists {
154    pub db: String,
155    pub key: String,
156}
157
158#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
159pub struct ResultExists {
160    pub exists: bool,
161}
162
163impl ResultExists {
164    pub fn new(exists: bool) -> Self {
165        Self { exists }
166    }
167
168    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
169        let data = serde_json::to_vec(self)?;
170        let data_length = data.len() as u32;
171
172        let mut result = vec![];
173        result.extend(&MAGIC_NUMBER); // 魔数
174        result.extend(&VERSION.to_be_bytes()); // 版本
175        result.push(CmdType::Exists as u8);
176        result.extend(&seq.to_be_bytes()); // 序列号
177        result.extend(&data_length.to_be_bytes()); // 数据长度
178        result.extend(data); // 数据
179
180        Ok(result)
181    }
182}
183
184#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
185pub struct Expire {
186    pub db: String,
187    pub key: String,
188    pub expire: u64,
189}
190
191#[derive(Debug, Clone, Deserialize, Serialize, Encode, Decode)]
192pub struct ResultExpire {
193    pub ok: bool,
194}
195
196impl ResultExpire {
197    pub fn new(ok: bool) -> Self {
198        Self { ok }
199    }
200
201    pub fn to_result(&self, seq: u32) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
202        let data = serde_json::to_vec(self)?;
203        let data_length = data.len() as u32;
204
205        let mut result = vec![];
206        result.extend(&MAGIC_NUMBER); // 魔数
207        result.extend(&VERSION.to_be_bytes()); // 版本
208        result.push(CmdType::Expire as u8);
209        result.extend(&seq.to_be_bytes()); // 序列号
210        result.extend(&data_length.to_be_bytes()); // 数据长度
211        result.extend(data); // 数据
212
213        Ok(result)
214    }
215}