use std::rc::Rc; use std::sync::Arc; use futures::IntoFuture; use crate::transform_map_init_err::TransformMapInitErr; use crate::Service; /// `Transform` service factory. /// /// Transform factory creates service that wraps other services. /// `Config` is a service factory configuration type. pub trait Transform { /// Requests handled by the service. type Request; /// Responses given by the service. type Response; /// Errors produced by the service. type Error; /// The `TransformService` value created by this factory type Transform: Service< Request = Self::Request, Response = Self::Response, Error = Self::Error, >; /// Errors produced while building a service. type InitError; /// The future response value. type Future: IntoFuture; /// Create and return a new service value asynchronously. fn new_transform(&self, service: S) -> Self::Future; /// Map this service's factory init error to a different error, /// returning a new transform service factory. fn map_init_err(self, f: F) -> TransformMapInitErr where Self: Sized, F: Fn(Self::InitError) -> E, { TransformMapInitErr::new(self, f) } } impl Transform for Rc where T: Transform, { type Request = T::Request; type Response = T::Response; type Error = T::Error; type InitError = T::InitError; type Transform = T::Transform; type Future = T::Future; fn new_transform(&self, service: S) -> T::Future { self.as_ref().new_transform(service) } } impl Transform for Arc where T: Transform, { type Request = T::Request; type Response = T::Response; type Error = T::Error; type InitError = T::InitError; type Transform = T::Transform; type Future = T::Future; fn new_transform(&self, service: S) -> T::Future { self.as_ref().new_transform(service) } } /// Trait for types that can be converted to a *transform service* pub trait IntoTransform where T: Transform, { /// Convert to a `TransformService` fn into_transform(self) -> T; } impl IntoTransform for T where T: Transform, { fn into_transform(self) -> T { self } }