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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
//! Extract data from the URL of incoming requests.
//!
//! # Overview
//!
//! When it comes to route information, there are two important extractors to be aware of:
//!
//! - [`PathParams`]: extract path parameters from the URL of incoming requests
//! - [`MatchedPathPattern`]: extract the route template that matched for the incoming request
//!
//! Check out their documentation for more details.
//!
//! # Example: path parameters
//!
//! ```rust
//! use pavex::f;
//! use pavex::blueprint::{router::GET, Blueprint, constructor::Lifecycle};
//! use pavex::request::path::PathParams;
//!
//! fn blueprint() -> Blueprint{
//! let mut bp = Blueprint::new();
//! // [...]
//! // Register a route with a path parameter, `:home_id`.
//! bp.route(GET, "/home/:home_id", f!(crate::get_home));
//! bp
//! }
//!
//! // The PathParams attribute macro derives the necessary (de)serialization traits.
//! #[PathParams]
//! struct Home {
//! // The name of the field must match the name of the path parameter
//! // used in `bp.route`.
//! home_id: u32
//! }
//!
//! // The `PathParams` extractor deserializes the extracted path parameters into
//! // the type you specified—`Home` in this case.
//! fn get_home(params: &PathParams<Home>) -> String {
//! format!("The identifier for this home is: {}", params.0.home_id)
//! }
//! ```
//!
//! Check out [`PathParams`]' documentation for more details.
//!
//! [`PathParams`]: struct@PathParams
pub use matched_path::MatchedPathPattern;
pub use path_params::PathParams;
/// Derive (de)serialization logic for a type that is going to be used to extract path parameters.
///
/// This macro derives [`StructuralDeserialize`], [`serde::Serialize`] and [`serde::Deserialize`]
/// for the type that it is applied to.
///
/// Check out [`PathParams`](struct@PathParams) for more details on how to work with
/// path parameters in Pavex.
/// Check out [`StructuralDeserialize`] if you are curious about the rationale behind this
/// macro.
///
/// # Example
///
/// ```rust
/// use pavex::f;
/// use pavex::blueprint::{router::GET, Blueprint, constructor::Lifecycle};
/// use pavex::request::path::PathParams;
///
/// fn blueprint() -> Blueprint { ///
/// let mut bp = Blueprint::new();
/// // [...]
/// // Register a route with a path parameter, `:home_id`.
/// bp.route(GET, "/home/:home_id", f!(crate::get_home));
/// # bp
/// }
///
/// #[PathParams]
/// struct Home {
/// home_id: u32
/// }
///
/// fn get_home(params: &PathParams<Home>) -> String {
/// format!("The identifier for this home is: {}", params.0.home_id)
/// }
/// ```
///
/// [`StructuralDeserialize`]: crate::serialization::StructuralDeserialize
pub use pavex_macros::PathParams;
pub use raw_path_params::{EncodedParamValue, RawPathParams, RawPathParamsIter};
mod deserializer;
pub mod errors;
mod matched_path;
mod path_params;
mod raw_path_params;