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
use futures::{Future, Poll}; use ::{Filter, Request}; use ::reject::Reject; use ::reply::{Reply}; use ::route::{self, Route}; use ::server::{IntoWarpService, WarpService}; #[derive(Copy, Clone, Debug)] pub struct FilteredService<F> { filter: F, } impl<F> WarpService for FilteredService<F> where F: Filter, <F::Future as Future>::Item: Reply, <F::Future as Future>::Error: Reject, { type Reply = FilteredFuture<F::Future>; #[inline] fn call(&self, req: Request) -> Self::Reply { debug_assert!(!route::is_set(), "nested route::set calls"); let route = Route::new(req); let fut = route::set(&route, || self.filter.filter()); FilteredFuture { future: fut, route: route, } } } #[derive(Debug)] pub struct FilteredFuture<F> { future: F, route: ::std::cell::RefCell<Route>, } impl<F> Future for FilteredFuture<F> where F: Future, { type Item = F::Item; type Error = F::Error; #[inline] fn poll(&mut self) -> Poll<Self::Item, Self::Error> { debug_assert!(!route::is_set(), "nested route::set calls"); let fut = &mut self.future; route::set(&self.route, || fut.poll()) } } impl<F> IntoWarpService for FilteredService<F> where F: Filter + Send + Sync + 'static, <F::Future as Future>::Item: Reply, <F::Future as Future>::Error: Reject, { type Service = FilteredService<F>; #[inline] fn into_warp_service(self) -> Self::Service { self } } impl<F> IntoWarpService for F where F: Filter + Send + Sync + 'static, <F::Future as Future>::Item: Reply, <F::Future as Future>::Error: Reject, { type Service = FilteredService<F>; #[inline] fn into_warp_service(self) -> Self::Service { FilteredService { filter: self, } } }