pub mod route;
use std::sync::Arc;
use axum::{routing::get, Router};
use infra::core::AppState;
use prometheus::{Encoder, TextEncoder};
use tower_http::cors::CorsLayer;
pub fn init() -> Router<Arc<AppState>> {
// 路由组册
Router::new()
.route("/", get(|| async { "☺ welcome to Rust app" }))
.route("/health", get(health))
.route("/metrics", get(metrics))
.merge(router())
}
async fn health() -> &'static str {
"ok"
}
async fn metrics() -> String {
let encoder = TextEncoder::new();
let metric_families = prometheus::gather();
let mut buffer = Vec::new();
encoder.encode(&metric_families, &mut buffer).unwrap();
String::from_utf8(buffer).unwrap()
}
fn router() -> Router<Arc<AppState>> {
let cors = CorsLayer::permissive().expose_headers(vec![infra::middleware::trace::TRACE_ID]);
Router::new()
.nest("/v1", route::v1())
.layer(axum::middleware::from_fn(infra::middleware::panic::handle))
.layer(axum::middleware::from_fn(infra::middleware::log::handle))
.layer(axum::middleware::from_fn(infra::middleware::trace::handle))
.layer(axum::middleware::from_fn(
infra::middleware::metrics::handle,
))
.layer(cors)
}