Skip to main content

shield_actix/
service.rs

1use std::task::{Context, Poll};
2
3use actix_web::{
4    Error, HttpMessage,
5    dev::{Service, ServiceRequest, ServiceResponse},
6};
7use shield::{Shield, User};
8
9pub struct ShieldService<S, U: User> {
10    inner: S,
11    shield: Shield<U>,
12}
13
14impl<S, U: User> ShieldService<S, U> {
15    pub fn new(inner: S, shield: Shield<U>) -> Self {
16        Self { inner, shield }
17    }
18}
19
20impl<S, U: User + Clone + 'static, ResBody> Service<ServiceRequest> for ShieldService<S, U>
21where
22    S: Service<ServiceRequest, Response = ServiceResponse<ResBody>, Error = Error>,
23{
24    type Response = ServiceResponse<ResBody>;
25    type Error = Error;
26    type Future = S::Future;
27
28    fn poll_ready(&self, ctx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
29        self.inner.poll_ready(ctx)
30    }
31
32    fn call(&self, req: ServiceRequest) -> Self::Future {
33        req.extensions_mut().insert(self.shield.clone());
34        self.inner.call(req)
35    }
36}