rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
//! REST middleware used by the default runtime stack.

pub mod auth;
pub mod request_id;
pub mod timeout;
pub mod uniform;

use axum::Router;
use tower_http::{
    limit::RequestBodyLimitLayer, sensitive_headers::SetSensitiveRequestHeadersLayer,
    trace::TraceLayer,
};

use crate::rest::RestConfig;

/// Applies the default rs-zero REST middleware stack.
pub fn apply_default_layers(router: Router, config: RestConfig) -> Router {
    let router = router.layer(RequestBodyLimitLayer::new(config.max_body_bytes));
    let router = timeout::apply_timeout(router, config.timeout);
    let router = router.layer(axum::middleware::from_fn(uniform::uniform_error_middleware));

    let router = if let Some(auth) = config.auth {
        router.layer(axum::middleware::from_fn(move |request, next| {
            auth::auth_middleware(auth.clone(), request, next)
        }))
    } else {
        router
    };

    router
        .layer(request_id::propagate_request_id_layer())
        .layer(request_id::set_request_id_layer())
        .layer(TraceLayer::new_for_http())
        .layer(SetSensitiveRequestHeadersLayer::new(std::iter::once(
            axum::http::header::AUTHORIZATION,
        )))
}