2019-02-03 10:42:27 -08:00
|
|
|
use std::marker::PhantomData;
|
|
|
|
|
|
|
|
use futures::future::{ok, FutureResult};
|
2019-03-04 19:38:11 -08:00
|
|
|
use futures::IntoFuture;
|
2019-02-03 10:42:27 -08:00
|
|
|
|
2019-03-04 19:38:11 -08:00
|
|
|
use crate::{Apply, IntoTransform, Service, Transform};
|
2019-02-03 10:42:27 -08:00
|
|
|
|
2019-03-05 07:35:26 -08:00
|
|
|
pub struct FnTransform<F, S, R, In, Out, Err>
|
2019-02-03 10:42:27 -08:00
|
|
|
where
|
2019-03-04 19:38:11 -08:00
|
|
|
F: FnMut(In, &mut S) -> Out + Clone,
|
|
|
|
Out: IntoFuture,
|
2019-02-03 10:42:27 -08:00
|
|
|
{
|
|
|
|
f: F,
|
2019-03-05 07:35:26 -08:00
|
|
|
_t: PhantomData<(S, R, In, Out, Err)>,
|
2019-02-03 10:42:27 -08:00
|
|
|
}
|
|
|
|
|
2019-03-05 07:35:26 -08:00
|
|
|
impl<F, S, R, In, Out, Err> FnTransform<F, S, R, In, Out, Err>
|
2019-02-03 10:42:27 -08:00
|
|
|
where
|
2019-03-04 19:38:11 -08:00
|
|
|
F: FnMut(In, &mut S) -> Out + Clone,
|
|
|
|
Out: IntoFuture,
|
2019-02-03 10:42:27 -08:00
|
|
|
{
|
|
|
|
pub fn new(f: F) -> Self {
|
|
|
|
FnTransform { f, _t: PhantomData }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-05 09:49:08 -08:00
|
|
|
impl<F, S, R, In, Out, Err> Transform<S, In> for FnTransform<F, S, R, In, Out, Err>
|
2019-02-03 10:42:27 -08:00
|
|
|
where
|
2019-03-05 07:35:26 -08:00
|
|
|
S: Service<R>,
|
2019-03-04 19:38:11 -08:00
|
|
|
F: FnMut(In, &mut S) -> Out + Clone,
|
2019-02-03 10:42:27 -08:00
|
|
|
Out: IntoFuture,
|
2019-03-04 19:38:11 -08:00
|
|
|
Out::Error: From<S::Error>,
|
2019-02-03 10:42:27 -08:00
|
|
|
{
|
2019-03-04 19:38:11 -08:00
|
|
|
type Response = Out::Item;
|
|
|
|
type Error = Out::Error;
|
2019-03-05 07:35:26 -08:00
|
|
|
type Transform = Apply<S, R, F, In, Out>;
|
2019-02-03 10:42:27 -08:00
|
|
|
type InitError = Err;
|
|
|
|
type Future = FutureResult<Self::Transform, Self::InitError>;
|
|
|
|
|
2019-03-04 19:38:11 -08:00
|
|
|
fn new_transform(&self, service: S) -> Self::Future {
|
|
|
|
ok(Apply::new(service, self.f.clone()))
|
2019-02-03 10:42:27 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-05 09:49:08 -08:00
|
|
|
impl<F, S, R, In, Out, Err> IntoTransform<FnTransform<F, S, R, In, Out, Err>, S, In> for F
|
2019-02-03 10:42:27 -08:00
|
|
|
where
|
2019-03-05 07:35:26 -08:00
|
|
|
S: Service<R>,
|
2019-03-04 19:38:11 -08:00
|
|
|
F: FnMut(In, &mut S) -> Out + Clone,
|
|
|
|
Out: IntoFuture,
|
|
|
|
Out::Error: From<S::Error>,
|
2019-02-03 10:42:27 -08:00
|
|
|
{
|
2019-03-05 07:35:26 -08:00
|
|
|
fn into_transform(self) -> FnTransform<F, S, R, In, Out, Err> {
|
2019-03-04 19:38:11 -08:00
|
|
|
FnTransform::new(self)
|
2019-02-03 10:42:27 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-05 07:35:26 -08:00
|
|
|
impl<F, S, R, In, Out, Err> Clone for FnTransform<F, S, R, In, Out, Err>
|
2019-02-03 10:42:27 -08:00
|
|
|
where
|
2019-03-04 19:38:11 -08:00
|
|
|
F: FnMut(In, &mut S) -> Out + Clone,
|
|
|
|
Out: IntoFuture,
|
2019-02-03 10:42:27 -08:00
|
|
|
{
|
|
|
|
fn clone(&self) -> Self {
|
|
|
|
Self::new(self.f.clone())
|
|
|
|
}
|
|
|
|
}
|