diff options
Diffstat (limited to 'src/cli.rs')
| -rw-r--r-- | src/cli.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..b165677 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,47 @@ +use std::io; + +use axum::{routing::get, Router}; +use clap::Parser; + +#[derive(Parser)] +pub struct Args { + #[arg(short, long, env, default_value = "localhost")] + address: String, + + #[arg(short, long, env, default_value_t = 64209)] + port: u16, +} + +impl Args { + pub async fn run(self) -> io::Result<()> { + let app = Router::new().route("/", get(hello)); + + let listener = self.listener().await?; + let started_msg = started_msg(&listener)?; + + let serve = axum::serve(listener, app); + println!("{started_msg}"); + serve.await?; + + Ok(()) + } + + async fn listener(&self) -> io::Result<tokio::net::TcpListener> { + let listen_addr = self.listen_addr(); + let listener = tokio::net::TcpListener::bind(listen_addr).await?; + Ok(listener) + } + + fn listen_addr(&self) -> impl tokio::net::ToSocketAddrs + '_ { + (self.address.as_str(), self.port) + } +} + +fn started_msg(listener: &tokio::net::TcpListener) -> io::Result<String> { + let local_addr = listener.local_addr()?; + Ok(format!("listening on http://{local_addr}/")) +} + +async fn hello() -> &'static str { + "Hello, world" +} |
