From 80511f2cb5ef510333c92ddb157d3bb5f68bc389 Mon Sep 17 00:00:00 2001 From: Avery Harnish Date: Tue, 3 Mar 2020 11:15:20 -0600 Subject: [PATCH] add cli for server/client (#4) This PR adds a CLI to main.rs that allows you to run the redis server and eventually the redis client. --- Cargo.lock | 151 ++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 12 ++-- examples/hello_world.rs | 5 +- examples/pub.rs | 5 +- src/bin/client.rs | 40 +++++++++++ src/bin/server.rs | 17 +++++ src/client.rs | 1 - src/cmd/get.rs | 2 +- src/cmd/mod.rs | 12 ++-- src/lib.rs | 2 + src/main.rs | 6 -- src/server.rs | 5 +- 12 files changed, 233 insertions(+), 25 deletions(-) create mode 100644 src/bin/client.rs create mode 100644 src/bin/server.rs delete mode 100644 src/main.rs diff --git a/Cargo.lock b/Cargo.lock index fcaae9c..36cee8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,13 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "arc-swap" version = "0.4.4" @@ -13,6 +21,16 @@ dependencies = [ "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "autocfg" version = "1.0.0" @@ -33,6 +51,35 @@ name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "clap" +version = "3.0.0-beta.1" +source = "git+https://github.com/clap-rs/clap/#20cdc8384f9830bbca7bfcbf4cd2ffdfc96e4eca" +dependencies = [ + "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap_derive 3.0.0-beta.1 (git+https://github.com/clap-rs/clap/)", + "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "clap_derive" +version = "3.0.0-beta.1" +source = "git+https://github.com/clap-rs/clap/#20cdc8384f9830bbca7bfcbf4cd2ffdfc96e4eca" +dependencies = [ + "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -57,6 +104,14 @@ name = "futures-core" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "heck" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hermit-abi" version = "0.1.6" @@ -65,6 +120,14 @@ dependencies = [ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "indexmap" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "iovec" version = "0.1.4" @@ -111,6 +174,7 @@ version = "0.1.0" dependencies = [ "atoi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 3.0.0-beta.1 (git+https://github.com/clap-rs/clap/)", "tokio 0.2.11 (git+https://github.com/tokio-rs/tokio)", ] @@ -205,6 +269,30 @@ name = "pin-project-lite" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro-error" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "proc-macro-error-attr" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "proc-macro2" version = "1.0.8" @@ -226,6 +314,16 @@ name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rustversion" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "signal-hook-registry" version = "1.2.0" @@ -251,6 +349,11 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "strsim" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "syn" version = "1.0.14" @@ -261,6 +364,24 @@ dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "syn-mid" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio" version = "0.2.11" @@ -294,11 +415,26 @@ dependencies = [ "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-segmentation" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "vec_map" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.2.8" @@ -338,17 +474,23 @@ dependencies = [ ] [metadata] +"checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" "checksum atoi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e0afb7287b68575f5ca0e5c7e40191cbd4be59d325781f46faa603e176eaef47" +"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum clap 3.0.0-beta.1 (git+https://github.com/clap-rs/clap/)" = "" +"checksum clap_derive 3.0.0-beta.1 (git+https://github.com/clap-rs/clap/)" = "" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures-core 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b597b16aa1a19ce2dfde5128a7c656d75346b35601a640be2d9efd4e9c83609d" +"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" +"checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" @@ -364,16 +506,25 @@ dependencies = [ "checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" "checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" "checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" +"checksum proc-macro-error 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "875077759af22fa20b610ad4471d8155b321c89c3f2785526c9839b099be4e0a" +"checksum proc-macro-error-attr 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c5717d9fa2664351a01ed73ba5ef6df09c01a521cb42cb65a061432a826f3c7a" "checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" +"checksum rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" +"checksum strsim 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" "checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" +"checksum syn-mid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" +"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" "checksum tokio 0.2.11 (git+https://github.com/tokio-rs/tokio)" = "" "checksum tokio-macros 0.2.4 (git+https://github.com/tokio-rs/tokio)" = "" +"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/Cargo.toml b/Cargo.toml index e652c2f..2f1d122 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,11 @@ [package] -name = "mini-redis" -version = "0.1.0" authors = ["Carl Lerche "] edition = "2018" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +name = "mini-redis" +version = "0.1.0" [dependencies] -bytes = "0.5" -tokio = { git = "https://github.com/tokio-rs/tokio", features = ["full"] } - atoi = "0.3.2" +bytes = "0.5" +clap = { git = "https://github.com/clap-rs/clap/" } +tokio = { git = "https://github.com/tokio-rs/tokio", features = ["full"] } diff --git a/examples/hello_world.rs b/examples/hello_world.rs index 8b13789..607aa27 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -1 +1,4 @@ - +#[tokio::main] +async fn main() { + unimplemented!(); +} diff --git a/examples/pub.rs b/examples/pub.rs index 8b13789..607aa27 100644 --- a/examples/pub.rs +++ b/examples/pub.rs @@ -1 +1,4 @@ - +#[tokio::main] +async fn main() { + unimplemented!(); +} diff --git a/src/bin/client.rs b/src/bin/client.rs new file mode 100644 index 0000000..855b4d0 --- /dev/null +++ b/src/bin/client.rs @@ -0,0 +1,40 @@ +use bytes::Bytes; +use clap::Clap; +use mini_redis::{client, DEFAULT_PORT}; +use std::{io, str}; + +#[tokio::main] +async fn main() -> io::Result<()> { + let cli = Cli::parse(); + let port = cli.port.unwrap_or(DEFAULT_PORT.to_string()); + let mut client = client::connect(&format!("127.0.0.1:{}", port)).await?; + match cli.command { + Client::Get { key } => { + let result = client.get(&key).await?; + if let Some(result) = result { + println!("\"{}\"", str::from_utf8(&result).unwrap()); + } else { + println!("(nil)"); + } + Ok(()) + } + Client::Set { key, value } => client.set(&key, Bytes::from(value)).await, + } +} + +#[derive(Clap, Debug)] +#[clap(name = "mini-redis-client", version = env!("CARGO_PKG_VERSION"), author = env!("CARGO_PKG_AUTHORS"), about = "Opens a connection to a Redis server")] +struct Cli { + #[clap(subcommand)] + command: Client, + #[clap(name = "port", long = "--port")] + port: Option, +} + +#[derive(Clap, Debug)] +enum Client { + #[clap(about = "Gets a value associated with a key")] + Get { key: String }, + #[clap(about = "Associates a value with a key")] + Set { key: String, value: String }, +} diff --git a/src/bin/server.rs b/src/bin/server.rs new file mode 100644 index 0000000..194b5a3 --- /dev/null +++ b/src/bin/server.rs @@ -0,0 +1,17 @@ +use clap::Clap; +use mini_redis::{server, DEFAULT_PORT}; +use std::io; + +#[tokio::main] +pub async fn main() -> io::Result<()> { + let cli = Cli::parse(); + let port = cli.port.unwrap_or(DEFAULT_PORT.to_string()); + server::run(&port).await +} + +#[derive(Clap, Debug)] +#[clap(name = "mini-redis-server", version = env!("CARGO_PKG_VERSION"), author = env!("CARGO_PKG_AUTHORS"), about = "A Redis server")] +struct Cli { + #[clap(name = "port", long = "--port")] + port: Option, +} diff --git a/src/client.rs b/src/client.rs index fd130d3..57860ea 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,4 +1,3 @@ -#![cfg(nope)] use crate::Connection; use bytes::Bytes; diff --git a/src/cmd/get.rs b/src/cmd/get.rs index 20fc85b..69c2396 100644 --- a/src/cmd/get.rs +++ b/src/cmd/get.rs @@ -14,7 +14,7 @@ impl Get { } pub(crate) async fn apply(self, kv: &Kv, dst: &mut Connection) -> io::Result<()> { - let response = if let Some(value) = kv.get(&self.key[..]) { + let response = if let Some(value) = kv.get(&self.key) { Frame::Bulk(value) } else { Frame::Null diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 3e7a7b1..7e5cd97 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -27,14 +27,14 @@ impl Command { pub(crate) fn from_frame(frame: Frame) -> Result { let mut parse = Parse::new(frame)?; - let command_name = parse.next_string()?; + let command_name = parse.next_string()?.to_lowercase(); let command = match &command_name[..] { - "GET" => Command::Get(Get::parse(&mut parse)?), - "PUBLISH" => Command::Publish(Publish::parse(&mut parse)?), - "SET" => Command::Set(Set::parse(&mut parse)?), - "SUBSCRIBE" => Command::Subscribe(Subscribe::parse(&mut parse)?), - "UNSUBSCRIBE" => Command::Unsubscribe(Unsubscribe::parse(&mut parse)?), + "get" => Command::Get(Get::parse(&mut parse)?), + "publish" => Command::Publish(Publish::parse(&mut parse)?), + "set" => Command::Set(Set::parse(&mut parse)?), + "subscribe" => Command::Subscribe(Subscribe::parse(&mut parse)?), + "unsubscribe" => Command::Unsubscribe(Unsubscribe::parse(&mut parse)?), _ => return Err(ParseError::UnknownCommand(command_name)), }; diff --git a/src/lib.rs b/src/lib.rs index 3842edc..8d79814 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +pub const DEFAULT_PORT: &str = "6379"; + pub mod client; mod cmd; diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index a4ab200..0000000 --- a/src/main.rs +++ /dev/null @@ -1,6 +0,0 @@ -use std::io; - -#[tokio::main] -async fn main() -> io::Result<()> { - mini_redis::server::run().await -} diff --git a/src/server.rs b/src/server.rs index dfe4f39..b8b6181 100644 --- a/src/server.rs +++ b/src/server.rs @@ -29,11 +29,11 @@ struct Handler { } /// Run the mini-redis server. -pub async fn run() -> io::Result<()> { +pub async fn run(port: &str) -> io::Result<()> { let (notify_shutdown, _) = broadcast::channel(1); let mut server = Server { - listener: TcpListener::bind("127.0.0.1:6379").await?, + listener: TcpListener::bind(&format!("127.0.0.1:{}", port)).await?, kv: Kv::new(), notify_shutdown, }; @@ -41,6 +41,7 @@ pub async fn run() -> io::Result<()> { tokio::select! { res = server.run() => { if let Err(err) = res { + // TODO: gracefully handle this error eprintln!("failed to accept; err = {}", err); } }