1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! # modo::ip
//!
//! Client IP extraction with trusted proxy support.
//!
//! Provides:
//! - [`ClientIp`] — axum extractor wrapping `std::net::IpAddr`
//! - [`ClientInfo`] — structured client metadata (IP, user-agent, etc.) inserted
//! into request extensions by [`ClientIpLayer`]
//! - [`ClientIpLayer`] — Tower layer that resolves the client IP and inserts
//! [`ClientIp`] / [`ClientInfo`] into request extensions
//! - [`extract_client_ip`] — low-level resolution function (headers + trusted
//! proxies + fallback)
//!
//! ## Quick start
//!
//! ```rust,no_run
//! use axum::{Router, routing::get};
//! use modo::ip::{ClientIp, ClientIpLayer};
//!
//! let app: Router = Router::new()
//! .route("/", get(handler))
//! .layer(ClientIpLayer::new());
//!
//! async fn handler(ClientIp(ip): ClientIp) -> String {
//! ip.to_string()
//! }
//! ```
pub use ClientInfo;
pub use ClientIp;
pub use extract_client_ip;
pub use ClientIpLayer;