Skip to main content

gradatum_warden/
lib.rs

1//! # gradatum-warden
2//!
3//! Couche réseau L0 pour Gradatum : filtrage IP CIDR + rate limiting per-IP + bypass loopback.
4//!
5//! ## Composants publics
6//!
7//! - [`WardenLayer`] : implémentation tower `Layer` à monter sur un routeur Axum.
8//! - [`WardenConfig`] : configuration complète du warden (sérialisable TOML/JSON).
9//! - [`WardenError`] : erreur de construction (config invalide).
10//! - [`WardenDecision`] : décision interne par requête (observable dans les tests).
11//!
12//! ## Garantie bypass loopback
13//!
14//! Contrairement à `tower_governor` (où `error_handler` terminait la chaîne avec `Body::empty()`),
15//! le warden appelle toujours `inner.call(req)` pour les requêtes bypass/allow.
16//! Le body retourné est celui du handler métier réel — jamais un body vide synthétique.
17//!
18//! ## Exemple
19//!
20//! ```rust,ignore
21//! use gradatum_warden::{WardenConfig, WardenLayer};
22//!
23//! let config = WardenConfig {
24//!     enabled: true,
25//!     rate_limit_per_minute: 60,
26//!     rate_limit_burst: 10,
27//!     bypass_loopback: true,
28//!     ..WardenConfig::default()
29//! };
30//! let warden = WardenLayer::new(config).expect("config warden valide");
31//! // app.layer(warden)
32//! ```
33
34pub mod config;
35pub mod error;
36pub mod ip;
37pub mod layer;
38pub mod rate;
39pub mod service;
40
41pub use config::WardenConfig;
42pub use error::{WardenDecision, WardenError};
43pub use layer::WardenLayer;