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
10    use super::*;
11
12use std::error::Error;
13use std::net::TcpStream;
14
15use packetio::{PacketReceiver, PacketSender};
16use rustacean_db_protocol::{Request, Response};
17
18pub mod blocking {
19    use std::sync::Arc;
20    use super::*;
21
22    pub fn get(ip: &str, key: &str) -> Result<Option<Arc<[u8]>>, Box<dyn Error>> {
23        let mut connection = TcpStream::connect(ip)?;
24        connection.send_packet(Request::Get(key.to_string()))?;
25        let resp: Response = connection.recv_packet()?;
26        match resp {
27            Response::Value(v) => Ok(v),
28            _ => Err("Unexpected response".into()),
29        }
30    }
31
32    pub fn post(ip: &str, key: &str, value: Vec<u8>) -> Result<(), Box<dyn Error>> {
33        let mut connection = TcpStream::connect(ip)?;
34
35        // ✅ Zero-copy conversion: Vec<u8> -> Box<[u8]> -> Arc<[u8]>
36        let arc_value: Arc<[u8]> = Arc::from(value.into_boxed_slice());
37
38        connection.send_packet(Request::Post(key.to_string(), arc_value))?;
39        let resp: Response = connection.recv_packet()?;
40        match resp {
41            Response::Ack(true) => Ok(()),
42            _ => Err("Server did not acknowledge".into()),
43        }
44    }
45}
46
47
48    pub fn post(ip: &str, key: &str, value: Vec<u8>) -> Result<(), Box<dyn Error>> {
49        let mut connection = TcpStream::connect(ip)?;
50        connection.send_packet(Request::Post(key.to_string(), Arc::from(value.as_slice())))?;
51        let resp: Response = connection.recv_packet()?;
52        match resp {
53            Response::Ack(true) => Ok(()),
54            _ => Err("Server did not acknowledge".into()),
55        }
56    }
57}