diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-08-30 19:24:49 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-08-30 19:24:49 -0400 |
| commit | f342f141c4c27b2a0db2872d4725fb94309c3d83 (patch) | |
| tree | 08e23f51134ddbe8fc9738ce0672ae6c9548d6cd /src | |
| parent | 29038461d48484bafaefdf7871ae58fa8335c910 (diff) | |
Make it an HTTP server
Diffstat (limited to 'src')
| -rw-r--r-- | src/cli.rs | 47 | ||||
| -rw-r--r-- | src/lib.rs | 1 | ||||
| -rw-r--r-- | src/main.rs | 12 |
3 files changed, 58 insertions, 2 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" +} 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 } |
