solidb_client/protocol/
codec.rs1use super::command::Command;
2use super::error::DriverError;
3use super::response::Response;
4use serde::{Deserialize, Serialize};
5
6pub const DRIVER_MAGIC: &[u8] = b"solidb-drv-v1\0";
7pub const MAX_MESSAGE_SIZE: usize = 16 * 1024 * 1024;
8
9pub fn encode_command(cmd: &Command) -> Result<Vec<u8>, DriverError> {
10 let payload = rmp_serde::to_vec_named(cmd)
11 .map_err(|e| DriverError::ProtocolError(format!("Serialization failed: {}", e)))?;
12
13 if payload.len() > MAX_MESSAGE_SIZE {
14 return Err(DriverError::MessageTooLarge);
15 }
16
17 let mut buf = Vec::with_capacity(4 + payload.len());
18 buf.extend_from_slice(&(payload.len() as u32).to_be_bytes());
19 buf.extend_from_slice(&payload);
20 Ok(buf)
21}
22
23pub fn encode_response(resp: &Response) -> Result<Vec<u8>, DriverError> {
24 let payload = rmp_serde::to_vec_named(resp)
25 .map_err(|e| DriverError::ProtocolError(format!("Serialization failed: {}", e)))?;
26
27 if payload.len() > MAX_MESSAGE_SIZE {
28 return Err(DriverError::MessageTooLarge);
29 }
30
31 let mut buf = Vec::with_capacity(4 + payload.len());
32 buf.extend_from_slice(&(payload.len() as u32).to_be_bytes());
33 buf.extend_from_slice(&payload);
34 Ok(buf)
35}
36
37pub fn encode_message<T: Serialize>(msg: &T) -> Result<Vec<u8>, DriverError> {
38 let payload = rmp_serde::to_vec_named(msg)
39 .map_err(|e| DriverError::ProtocolError(format!("Serialization failed: {}", e)))?;
40
41 if payload.len() > MAX_MESSAGE_SIZE {
42 return Err(DriverError::MessageTooLarge);
43 }
44
45 let mut buf = Vec::with_capacity(4 + payload.len());
46 buf.extend_from_slice(&(payload.len() as u32).to_be_bytes());
47 buf.extend_from_slice(&payload);
48 Ok(buf)
49}
50
51pub fn decode_message<T: for<'de> Deserialize<'de>>(data: &[u8]) -> Result<T, DriverError> {
52 rmp_serde::from_slice(data)
53 .map_err(|e| DriverError::ProtocolError(format!("Deserialization failed: {}", e)))
54}