use poem::{handler, listener::TcpListener, web::Path, Route, Server}; #[derive(clap::Parser)] pub struct Options { #[clap(long, env = "HOST", default_value = "127.0.0.1")] /// Set host host: String, #[clap(short = 'p', long, env = "PORT", default_value = "8080")] /// Set listening port port: String, } impl Options { fn host(&self) -> String { self.host.clone() } fn port(&self) -> String { self.port.clone() } fn hostport(&self) -> String { format!("{}:{}", self.host(), self.port()) } fn url(&self) -> String { format!("http://{}", self.hostport()) } fn addr(&self) -> std::net::SocketAddr { self.hostport().parse().unwrap() } pub async fn run(&mut self) -> Result<(), anyhow::Error> { let app = Route::new() .at("/hello/:id", hello_id) .at("/hello/:first/:second", hello_2); dbg!(self.url()); Ok(Server::new(TcpListener::bind(self.addr())) .name("hello") .run(app) .await?) } } #[handler] pub fn hello_id(Path(name): Path) -> String { format!("hello, {}", name) } #[handler] pub fn hello_2(Path((one, two)): Path<(String, String)>) -> String { format!("hello, {} {}", one, two) }