mod redirect; use std::marker::PhantomData; use actix_service::Service; pub use self::redirect::Redirect; /// Trait for transform a type to another one. /// Both the input and output type should impl [actix_service::Service] trait. pub trait Transform { type Transform: Service; /// Creates and returns a new Transform component. fn new_transform(self, service: S) -> Self::Transform; } #[doc(hidden)] /// Helper struct for constructing Nested types that would call `Transform::new_transform` /// in a chain. /// /// The child field would be called first and the output `Service` type is /// passed to parent as input type. pub struct NestTransform where T1: Transform, T2: Transform, { child: T1, parent: T2, _service: PhantomData<(S, Req)>, } impl NestTransform where T1: Transform, T2: Transform, { pub(crate) fn new(child: T1, parent: T2) -> Self { NestTransform { child, parent, _service: PhantomData, } } } impl Transform for NestTransform where T1: Transform, T2: Transform, { type Transform = T2::Transform; fn new_transform(self, service: S) -> Self::Transform { let service = self.child.new_transform(service); self.parent.new_transform(service) } } /// Dummy impl for kick start `NestTransform` type in `ClientBuilder` type impl Transform for () where S: Service, { type Transform = S; fn new_transform(self, service: S) -> Self::Transform { service } }