From f342f141c4c27b2a0db2872d4725fb94309c3d83 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Fri, 30 Aug 2024 19:24:49 -0400 Subject: Make it an HTTP server --- src/cli.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/cli.rs (limited to 'src/cli.rs') 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 { + 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" +} -- cgit v1.2.3