summaryrefslogtreecommitdiff
path: root/src/cli.rs
blob: b165677480d12f9e02b4758a00ab79c3a884a349 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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"
}