warp/filters/
ext.rs

1//! Request Extensions
2
3use std::convert::Infallible;
4
5use futures_util::future;
6
7use crate::filter::{filter_fn_one, Filter};
8use crate::reject::{self, Rejection};
9
10/// Get a previously set extension of the current route.
11///
12/// If the extension doesn't exist, this rejects with a `MissingExtension`.
13pub fn get<T: Clone + Send + Sync + 'static>(
14) -> impl Filter<Extract = (T,), Error = Rejection> + Copy {
15    filter_fn_one(|route| {
16        let route = route
17            .extensions()
18            .get::<T>()
19            .cloned()
20            .ok_or_else(|| reject::known(MissingExtension { _p: () }));
21        future::ready(route)
22    })
23}
24
25/// Get a previously set extension of the current route.
26///
27/// If the extension doesn't exist, it yields `None`.
28pub fn optional<T: Clone + Send + Sync + 'static>(
29) -> impl Filter<Extract = (Option<T>,), Error = Infallible> + Copy {
30    filter_fn_one(|route| future::ok(route.extensions().get::<T>().cloned()))
31}
32
33unit_error! {
34    /// An error used to reject if `get` cannot find the extension.
35    pub MissingExtension: "Missing request extension"
36}