warp/filter/
wrap.rs

1use super::Filter;
2
3pub trait WrapSealed<F: Filter> {
4    type Wrapped: Filter;
5
6    fn wrap(&self, filter: F) -> Self::Wrapped;
7}
8
9impl<'a, T, F> WrapSealed<F> for &'a T
10where
11    T: WrapSealed<F>,
12    F: Filter,
13{
14    type Wrapped = T::Wrapped;
15    fn wrap(&self, filter: F) -> Self::Wrapped {
16        (*self).wrap(filter)
17    }
18}
19
20pub trait Wrap<F: Filter>: WrapSealed<F> {}
21
22impl<T, F> Wrap<F> for T
23where
24    T: WrapSealed<F>,
25    F: Filter,
26{
27}
28
29/// Combines received filter with pre and after filters
30///
31/// # Example
32///
33/// ```
34/// use crate::warp::Filter;
35///
36/// let route = warp::any()
37///     .map(|| "hello world")
38///     .with(warp::wrap_fn(|filter| filter));
39/// ```
40///
41/// You can find the full example in the [usage example](https://github.com/seanmonstar/warp/blob/master/examples/wrapping.rs).
42pub fn wrap_fn<F, T, U>(func: F) -> WrapFn<F>
43where
44    F: Fn(T) -> U,
45    T: Filter,
46    U: Filter,
47{
48    WrapFn { func }
49}
50
51#[derive(Debug)]
52pub struct WrapFn<F> {
53    func: F,
54}
55
56impl<F, T, U> WrapSealed<T> for WrapFn<F>
57where
58    F: Fn(T) -> U,
59    T: Filter,
60    U: Filter,
61{
62    type Wrapped = U;
63
64    fn wrap(&self, filter: T) -> Self::Wrapped {
65        (self.func)(filter)
66    }
67}