rustacean_db/
lib.rs

1use std::error::Error;
2use std::net::TcpStream;
3
4use packetio::{PacketReceiver, PacketSender};
5use rustacean_db_protocol::{Request, Response};
6
7pub mod blocking {
8    use std::sync::Arc;
9    use super::*;
10
11    pub fn get(ip: &str, key: &str) -> Result<Option<Arc<[u8]>>, Box<dyn Error>> {
12        let mut connection = TcpStream::connect(ip)?;
13        connection.send_packet(Request::Get(key.to_string()))?;
14        let resp: Response = connection.recv_packet()?;
15        match resp {
16            Response::Value(v) => Ok(v),
17            _ => Err("Unexpected response".into()),
18        }
19    }
20
21    pub fn post(ip: &str, key: &str, value: Vec<u8>) -> Result<(), Box<dyn Error>> {
22        let mut connection = TcpStream::connect(ip)?;
23
24        // ✅ Zero-copy conversion: Vec<u8> -> Box<[u8]> -> Arc<[u8]>
25        let arc_value: Arc<[u8]> = Arc::from(value.into_boxed_slice());
26
27        connection.send_packet(Request::Post(key.to_string(), arc_value))?;
28        let resp: Response = connection.recv_packet()?;
29        match resp {
30            Response::Ack(true) => Ok(()),
31            _ => Err("Server did not acknowledge".into()),
32        }
33    }
34}