use std::marker::PhantomData; use futures::future::{ok, FutureResult}; use futures::IntoFuture; use crate::apply::Apply; use crate::{IntoTransform, Service, Transform}; /// Use function as transform service pub fn transform_fn( f: F, ) -> impl Transform where S: Service, F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, Out::Error: From, { FnTransform::new(f) } pub struct FnTransform where F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, { f: F, _t: PhantomData<(S, In, Out, Err)>, } impl FnTransform where F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, { pub fn new(f: F) -> Self { FnTransform { f, _t: PhantomData } } } impl Transform for FnTransform where S: Service, F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, Out::Error: From, { type Request = In; type Response = Out::Item; type Error = Out::Error; type Transform = Apply; type InitError = Err; type Future = FutureResult; fn new_transform(&self, service: S) -> Self::Future { ok(Apply::new(service, self.f.clone())) } } impl IntoTransform, S> for F where S: Service, F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, Out::Error: From, { fn into_transform(self) -> FnTransform { FnTransform::new(self) } } impl Clone for FnTransform where F: FnMut(In, &mut S) -> Out + Clone, Out: IntoFuture, { fn clone(&self) -> Self { Self::new(self.f.clone()) } }