rnx 0.7.0

The Rust web development scaffold, support salvo and axum
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)
}