use rama::{
Layer,
http::{
Request,
layer::trace::TraceLayer,
matcher::{HttpMatcher, PathMatcher},
server::HttpServer,
service::web::match_service,
service::web::response::{Html, Json, Redirect},
},
rt::Executor,
};
use serde_json::json;
use std::time::Duration;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, fmt};
#[tokio::main]
async fn main() {
tracing_subscriber::registry()
.with(fmt::layer())
.with(
EnvFilter::builder()
.with_default_directive(LevelFilter::DEBUG.into())
.from_env_lossy(),
)
.init();
let graceful = rama::graceful::Shutdown::default();
graceful.spawn_task_fn(async |guard| {
let addr = "127.0.0.1:62011";
tracing::info!("running service at: {addr}");
let exec = Executor::graceful(guard);
HttpServer::auto(exec)
.listen(
addr,
TraceLayer::new_for_http()
.into_layer(
match_service!{
HttpMatcher::get("/") => Html(r##"<h1>Home</h1><a href="/echo">Echo Request</a>"##.to_owned()),
PathMatcher::new("/echo") => |req: Request| async move {
Json(json!({
"method": req.method().as_str(),
"path": req.uri().path(),
}))
},
_ => Redirect::temporary("/"),
}
),
)
.await
.unwrap();
});
graceful
.shutdown_with_limit(Duration::from_secs(30))
.await
.expect("graceful shutdown");
}