Documentation
use poem::{
    handler,
    http::uri::Uri,
    listener::{Listener, TcpListener, UnixListener},
    Route, Server,
};

#[derive(clap::Parser)]
pub struct Options {
    #[clap(long, env = "UDS", default_value = "/tmp/hello_unix.sock")]
    /// Set uds path
    uds: String,
    #[clap(long, env = "PORT", default_value = "3000")]
    /// Set tcp port
    port: String,
}

impl Options {
    fn port(&self) -> String {
        self.port.clone()
    }
    fn uds(&self) -> String {
        self.uds.clone()
    }
    fn addr(&self) -> String {
        format!("0.0.0.0:{}", self.port()).to_string()
    }
    pub async fn run(&mut self) -> Result<(), anyhow::Error> {
        let app = Route::new().at("*", hello);
        // remove old socket
        std::fs::remove_file(self.uds())?;
        dbg!(self.uds());
        eprintln!("curl --unix-socket {} http://localhost/path", self.uds());
        dbg!(self.addr());

        let ln = {
            let ln_uds = UnixListener::bind(self.uds());
            let ln_tcp = TcpListener::bind(self.addr());
            ln_uds.combine(ln_tcp)
        };

        Ok(Server::new(ln).name("hello").run(app).await?)
    }
}

#[handler]
fn hello(uri: &Uri) -> String {
    let rpath = uri.path();
    format!("hello, {}", rpath)
}