use ullun::observability::{AccessLog, Metrics, RequestIdLayer};
use ullun::prelude::*;
#[tokio::main]
async fn main() {
let metrics = Metrics::new();
let port = std::env::var("PORT").unwrap_or_else(|_| "3000".into());
App::new()
.middleware(RequestIdLayer::new())
.middleware(AccessLog::new().json())
.middleware(metrics.clone())
.get("/healthz", |_req: Request| async {
Ok(Response::json(serde_json::json!({ "status": "alive" })))
})
.get("/readyz", |_req: Request| async {
Ok(Response::json(serde_json::json!({ "status": "ready" })))
})
.get("/metrics", metrics.handler())
.get_with_params("/orders/{id}", |params: Params| async move {
let id: u64 = params.parse("id")?;
if id == 0 {
return Err(Error::not_found("order not found"));
}
Ok(Response::json(
serde_json::json!({ "id": id, "status": "shipped" }),
))
})
.run(&format!("0.0.0.0:{port}"))
.await
.unwrap();
}