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 { 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 { let local_addr = listener.local_addr()?; Ok(format!("listening on http://{local_addr}/")) } async fn hello() -> &'static str { "Hello, world" }