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
use super::Wrapper;
use endpoint::{ApplyContext, ApplyResult, Endpoint};
pub fn before_apply<F>(f: F) -> BeforeApply<F>
where
F: Fn(&mut ApplyContext<'_>) -> ApplyResult<()>,
{
BeforeApply { f }
}
#[allow(missing_docs)]
#[derive(Debug)]
pub struct BeforeApply<F> {
f: F,
}
impl<'a, E, F> Wrapper<'a, E> for BeforeApply<F>
where
E: Endpoint<'a>,
F: Fn(&mut ApplyContext<'_>) -> ApplyResult<()> + 'a,
{
type Output = E::Output;
type Endpoint = BeforeApplyEndpoint<E, F>;
fn wrap(self, endpoint: E) -> Self::Endpoint {
BeforeApplyEndpoint {
endpoint,
f: self.f,
}
}
}
#[allow(missing_docs)]
#[derive(Debug, Copy, Clone)]
pub struct BeforeApplyEndpoint<E, F> {
pub(super) endpoint: E,
pub(super) f: F,
}
impl<'a, E, F> Endpoint<'a> for BeforeApplyEndpoint<E, F>
where
E: Endpoint<'a>,
F: Fn(&mut ApplyContext<'_>) -> ApplyResult<()> + 'a,
{
type Output = E::Output;
type Future = E::Future;
#[inline]
fn apply(&'a self, cx: &mut ApplyContext<'_>) -> ApplyResult<Self::Future> {
(self.f)(cx)?;
self.endpoint.apply(cx)
}
}