1use std::future::{Ready, ready};
2use std::rc::Rc;
3
4use actix_web::{
5 Error,
6 body::BoxBody,
7 dev::{Service, ServiceRequest, ServiceResponse, Transform},
8};
9
10use crate::rewrite::Engine;
11use crate::service::{RewriteInner, RewriteService};
12
13pub struct Middleware(Rc<Engine>);
33
34impl Middleware {
35 #[inline]
37 pub fn new(engine: Engine) -> Self {
38 Self(Rc::new(engine))
39 }
40}
41
42impl From<Engine> for Middleware {
43 #[inline]
44 fn from(value: Engine) -> Self {
45 Self::new(value)
46 }
47}
48
49impl<S> Transform<S, ServiceRequest> for Middleware
50where
51 S: Service<ServiceRequest, Response = ServiceResponse<BoxBody>, Error = Error> + 'static,
52 S::Future: 'static,
53{
54 type Response = ServiceResponse<BoxBody>;
55 type Error = Error;
56 type InitError = ();
57 type Transform = RewriteService<S>;
58 type Future = Ready<Result<Self::Transform, Self::InitError>>;
59
60 fn new_transform(&self, service: S) -> Self::Future {
61 ready(Ok(RewriteService(Rc::new(RewriteInner {
62 service: Rc::new(service),
63 engine: self.0.clone(),
64 }))))
65 }
66}