Giordani L. Rust Projects. Write A Redis Clone.... 🔥 Updated

let value = match &args[1] RespValue::BulkString(Some(v)) => v.clone(), _ => return RespValue::Error("ERR invalid value".to_string()), ;

RespValue::Array(resp_keys)

pub fn get(&self, key: &str) -> Option<Vec<u8>> let mut map = self.inner.lock().unwrap(); if let Some(value) = map.get(key) if let Some(expires_at) = value.expires_at let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; if now >= expires_at map.remove(key); return None; Some(value.data.clone()) else None

let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ; Giordani L. Rust Projects. Write a Redis Clone....

fn handle_flushall(store: &Store, _args: &[RespValue]) -> RespValue store.flushall(); RespValue::SimpleString("OK".to_string())

pub fn ttl(&self, key: &str) -> i64 let map = self.inner.lock().unwrap(); if let Some(value) = map.get(key) if let Some(expires_at) = value.expires_at let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; if now >= expires_at return -2; ((expires_at - now) / 1000) as i64 else -1 else -2

pub fn parse(&mut self, data: &[u8]) -> Result<Option<Vec<RespValue>>, String> self.buffer.extend_from_slice(data); let mut commands = Vec::new(); while let Some(cmd) = self.parse_one()? commands.push(cmd); if commands.is_empty() Ok(None) else Ok(Some(commands)) return RespValue::Error("ERR invalid value".to_string())

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)))

let server = Server::new(listener, store); server.run().await?;

> DEL mykey (integer) 1

impl Store pub fn new() -> Self Self inner: Arc::new(Mutex::new(HashMap::new())),

pub fn del(&self, key: &str) -> bool self.inner.lock().unwrap().remove(key).is_some()

match store.get(&key) Some(value) => RespValue::BulkString(Some(value)), None => RespValue::BulkString(None), RespValue::Array(resp_keys) pub fn get(&self

impl RespParser { pub fn new() -> Self Self buffer: BytesMut::new(),

let original_buffer = self.buffer.clone(); let temp_buffer = &mut self.buffer[offset..].to_vec(); let mut temp_parser = RespParser buffer: BytesMut::from(temp_buffer.as_slice()), ; match temp_parser.parse_one()? Some(value) => let consumed = original_buffer.len() - temp_parser.buffer.len() - offset; Ok(Some((value, consumed))) None => Ok(None),