diff --git a/Source/Server.rs b/Source/Server.rs index bda4f94..d9c7d83 100644 --- a/Source/Server.rs +++ b/Source/Server.rs @@ -19,15 +19,38 @@ async fn main() { } async fn process(socket: TcpStream) { - // The `Connection` lets us read/write redis **frames** instead of - // byte streams. The `Connection` type is defined by mini-redis. + use mini_redis::Command::{self, Get, Set}; + use std::collections::HashMap; + + // A hashmap is used to store data + let mut db = HashMap::new(); + + // Connection, provided by `mini-redis`, handles parsing frames from + // the socket let mut connection = Connection::new(socket); - if let Some(frame) = connection.read_frame().await.unwrap() { - println!("GOT: {:?}", frame); + // Use `read_frame` to receive a command from the connection. + while let Some(frame) = connection.read_frame().await.unwrap() { + let response = match Command::from_frame(frame).unwrap() { + Set(cmd) => { + // The value is stored as `Vec` + db.insert(cmd.key().to_string(), cmd.value().to_vec()); + Frame::Simple("OK".to_string()) + } + Get(cmd) => { + if let Some(value) = db.get(cmd.key()) { + // `Frame::Bulk` expects data to be of type `Bytes`. This + // type will be covered later in the tutorial. For now, + // `&Vec` is converted to `Bytes` using `into()`. + Frame::Bulk(value.clone().into()) + } else { + Frame::Null + } + } + cmd => panic!("unimplemented {:?}", cmd), + }; - // Respond with an error - let response = Frame::Error("unimplemented".to_string()); + // Write the response to the client connection.write_frame(&response).await.unwrap(); } }