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
use std::{marker::PhantomData, task::Context, task::Poll};
use ntex_service::{fn_factory_with_config, into_service, Service, ServiceFactory};
use ntex_util::future::Ready;
use crate::{Filter, FilterFactory, Io, IoBoxed};
pub fn seal<F, S, C>(
srv: S,
) -> impl ServiceFactory<
Io<F>,
C,
Response = S::Response,
Error = S::Error,
InitError = S::InitError,
>
where
F: Filter,
S: ServiceFactory<IoBoxed, C>,
{
fn_factory_with_config(move |cfg: C| {
let fut = srv.new_service(cfg);
async move {
let srv = fut.await?;
Ok(into_service(move |io: Io<F>| srv.call(IoBoxed::from(io))))
}
})
}
pub fn filter<T, F>(filter: T) -> FilterServiceFactory<T, F>
where
T: FilterFactory<F> + Clone,
F: Filter,
{
FilterServiceFactory {
filter,
_t: PhantomData,
}
}
pub struct FilterServiceFactory<T, F> {
filter: T,
_t: PhantomData<F>,
}
impl<T, F> ServiceFactory<Io<F>, ()> for FilterServiceFactory<T, F>
where
T: FilterFactory<F> + Clone,
F: Filter,
{
type Response = Io<T::Filter>;
type Error = T::Error;
type Service = FilterService<T, F>;
type InitError = ();
type Future = Ready<Self::Service, Self::InitError>;
fn new_service(&self, _: ()) -> Self::Future {
Ready::Ok(FilterService {
filter: self.filter.clone(),
_t: PhantomData,
})
}
}
pub struct FilterService<T, F> {
filter: T,
_t: PhantomData<F>,
}
impl<T, F> Service<Io<F>> for FilterService<T, F>
where
T: FilterFactory<F> + Clone,
F: Filter,
{
type Response = Io<T::Filter>;
type Error = T::Error;
type Future = T::Future;
fn poll_ready(&self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&self, req: Io<F>) -> Self::Future {
req.add_filter(self.filter.clone())
}
}