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}