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 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 12 ++++++++++-- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/cli.rs create mode 100644 src/lib.rs (limited to 'src') 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" +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..4f77372 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod cli; diff --git a/src/main.rs b/src/main.rs index e7a11a9..43c4e48 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,11 @@ -fn main() { - println!("Hello, world!"); +use std::io; + +use clap::Parser; + +use hi::cli::Args; + +#[tokio::main] +async fn main() -> io::Result<()> { + let args = Args::parse(); + args.run().await } -- cgit v1.2.3