use std::cell::UnsafeCell; use std::rc::Rc; use actix_service::Service; use futures::Poll; #[doc(hidden)] /// Service that allows to turn non-clone service to a service with `Clone` impl pub(crate) struct CloneableService(Rc>); impl CloneableService { pub(crate) fn new(service: T) -> Self where T: Service, { Self(Rc::new(UnsafeCell::new(service))) } } impl Clone for CloneableService { fn clone(&self) -> Self { Self(self.0.clone()) } } impl Service for CloneableService where T: Service, { type Request = T::Request; type Response = T::Response; type Error = T::Error; type Future = T::Future; fn poll_ready(&mut self) -> Poll<(), Self::Error> { unsafe { &mut *self.0.as_ref().get() }.poll_ready() } fn call(&mut self, req: T::Request) -> Self::Future { unsafe { &mut *self.0.as_ref().get() }.call(req) } }