Giordani L. Rust Projects. Write A Redis Clone.... Apr 2026
fn handle_keys(store: &Store, args: &[RespValue]) -> RespValue if args.len() != 1 return RespValue::Error("ERR wrong number of arguments for 'keys' command".to_string());
impl Store pub fn new() -> Self Self inner: Arc::new(Mutex::new(HashMap::new())),
impl Server { pub fn new(listener: TcpListener, store: Store) -> Self Self listener, store
RespValue::Integer(count)
fn parse_one_from_offset(&mut self, offset: usize) -> Result<Option<(RespValue, usize)>, String> if offset >= self.buffer.len() return Ok(None);
store.set(key, value, ttl_ms); RespValue::SimpleString("OK".to_string())
let pattern = match &args[0] RespValue::BulkString(Some(p)) => String::from_utf8_lossy(p).to_string(), _ => return RespValue::Error("ERR invalid pattern".to_string()), ; Giordani L. Rust Projects. Write a Redis Clone....
match self.buffer[0] as char { '*' => self.parse_array(), '+' => self.parse_simple_string(), '-' => self.parse_error(), ':' => self.parse_integer(), '$' => self.parse_bulk_string(), _ => Err(format!("Invalid RESP type: {}", self.buffer[0] as char)), } }
pub fn set(&self, key: String, value: Vec<u8>, ttl_ms: Option<u64>) let expires_at = ttl_ms.map(
let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ; fn handle_keys(store: &Store
fn handle_flushall(store: &Store, _args: &[RespValue]) -> RespValue store.flushall(); RespValue::SimpleString("OK".to_string())
Ok(()) } use bytes::Bytes, BytesMut; use std::collections::VecDeque; #[derive(Debug, PartialEq)] pub enum RespValue SimpleString(String), Error(String), Integer(i64), BulkString(Option<Vec<u8>>), Array(Vec<RespValue>),
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let addr = "127.0.0.1:6379"; let listener = TcpListener::bind(addr).await?; let store = Store::new(); args: &[RespValue]) ->
fn parse_error(&mut self) -> Result<Option<RespValue>, String> let (value, bytes_read) = self.read_until_crlf(1)?; self.buffer.advance(bytes_read); Ok(Some(RespValue::Error(value)))