Giordani L. Rust Projects. Write A Redis Clone.... • Deluxe

fn read_until_crlf(&self, start: usize) -> Result<(String, usize), String> let mut pos = start; while pos + 1 < self.buffer.len() if self.buffer[pos] == b'\r' && self.buffer[pos + 1] == b'\n' let string = String::from_utf8_lossy(&self.buffer[start..pos]).to_string(); let bytes_read = pos + 2 - start; return Ok((string, bytes_read)); pos += 1; Err("Incomplete frame".to_string())

fn handle_dbsize(store: &Store, _args: &[RespValue]) -> RespValue RespValue::Integer(store.dbsize() as i64) Giordani L. Rust Projects. Write a Redis Clone....

pub async fn run(&self) -> Result<(), Box<dyn std::error::Error>> { loop { let (socket, addr) = self.listener.accept().await?; let store = self.store.clone(); tokio::spawn(async move { if let Err(e) = handle_client(socket, store).await { eprintln!("Error handling client {}: :?", addr, e); } }); } } } start: usize) -&gt

use crate::commands::handle_command; use crate::resp::RespParser, RespValue; use crate::store::Store; use tokio::io::AsyncReadExt, AsyncWriteExt; use tokio::net::TcpListener, TcpStream; use std::sync::Arc; pub struct Server listener: TcpListener, store: Store, let mut pos = start

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

let key = match &args[0] RespValue::BulkString(Some(k)) => String::from_utf8_lossy(k).to_string(), _ => return RespValue::Error("ERR invalid key".to_string()), ;

let mut ttl_ms = None; let mut i = 2; while i < args.len() if let RespValue::BulkString(Some(opt)) = &args[i] let opt_str = String::from_utf8_lossy(opt).to_uppercase(); if opt_str == "EX" && i + 1 < args.len() if let RespValue::BulkString(Some(secs_bytes)) = &args[i + 1] if let Ok(secs) = String::from_utf8_lossy(secs_bytes).parse::<u64>() ttl_ms = Some(secs * 1000); i += 2; continue; else if opt_str == "PX" && i + 1 < args.len() if let RespValue::BulkString(Some(ms_bytes)) = &args[i + 1] if let Ok(ms) = String::from_utf8_lossy(ms_bytes).parse::<u64>() ttl_ms = Some(ms); i += 2; continue; i += 1;