Skip to main content

solidb_client/protocol/
codec.rs

1use 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}