Skip to main content

shield_actix/
transform.rs

1use actix_utils::future::{Ready, ready};
2use actix_web::{
3    Error,
4    dev::{Service, ServiceRequest, ServiceResponse, Transform},
5};
6use shield::{Shield, User};
7
8use crate::service::ShieldService;
9
10// Actix uses a `Middleware` suffix instead of a `Transform` suffix, despite the trait being called `Transform`.
11// Export both names so users can choose.
12pub type ShieldMiddleware<U> = ShieldTransform<U>;
13
14pub struct ShieldTransform<U: User> {
15    shield: Shield<U>,
16}
17
18impl<U: User> ShieldTransform<U> {
19    pub fn new(shield: Shield<U>) -> Self {
20        Self { shield }
21    }
22}
23
24impl<S, U: User + Clone + 'static, ResBody> Transform<S, ServiceRequest> for ShieldTransform<U>
25where
26    S: Service<ServiceRequest, Response = ServiceResponse<ResBody>, Error = Error>,
27{
28    type Response = ServiceResponse<ResBody>;
29    type Error = Error;
30    type Transform = ShieldService<S, U>;
31    type InitError = ();
32    type Future = Ready<Result<Self::Transform, Self::InitError>>;
33
34    fn new_transform(&self, inner: S) -> Self::Future {
35        ready(Ok(ShieldService::new(inner, self.shield.clone())))
36    }
37}