|
@@ -1,17 +1,32 @@
|
|
|
-use mini_redis::{client, Result};
|
|
|
+use tokio::net::{TcpListener, TcpStream};
|
|
|
+use mini_redis::{Connection, Frame};
|
|
|
|
|
|
#[tokio::main]
|
|
|
-async fn main() -> Result<()> {
|
|
|
- // Open a connection to the mini-redis address.
|
|
|
- let mut client = client::connect("127.0.0.1:6379").await?;
|
|
|
+async fn main() {
|
|
|
+ // Bind the listener to the address
|
|
|
+ let listener = TcpListener::bind("127.0.0.1:6379").await.unwrap();
|
|
|
|
|
|
- // Set the key "hello" with value "world"
|
|
|
- client.set("hello", "world".into()).await?;
|
|
|
+ loop {
|
|
|
+ let (socket, _) = listener.accept().await.unwrap();
|
|
|
+ // A new task is spawned for each inbound socket. The socket is
|
|
|
+ // moved to the new task and processed there.
|
|
|
+ tokio::spawn(async move {
|
|
|
+ process(socket).await;
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- // Get key "hello"
|
|
|
- let result = client.get("hello").await?;
|
|
|
+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.
|
|
|
+ let mut connection = Connection::new(socket);
|
|
|
|
|
|
- println!("got value from the server; result={:?}", result);
|
|
|
+ if let Some(frame) = connection.read_frame().await.unwrap() {
|
|
|
+ println!("GOT: {:?}", frame);
|
|
|
|
|
|
- Ok(())
|
|
|
+ // Respond with an error
|
|
|
+ let response = Frame::Error("unimplemented".to_string());
|
|
|
+ connection.write_frame(&response).await.unwrap();
|
|
|
+ }
|
|
|
}
|
|
|
+
|