|
@@ -17,15 +17,38 @@ async fn main() {
|
|
}
|
|
}
|
|
|
|
|
|
async fn process(socket: TcpStream) {
|
|
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);
|
|
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<u8>`
|
|
|
|
+ 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<u8>` 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();
|
|
connection.write_frame(&response).await.unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|