use crate::config::{Data, FederationConfig, FederationMiddleware}; use actix_web::{ dev::{forward_ready, Payload, Service, ServiceRequest, ServiceResponse, Transform}, Error, FromRequest, HttpMessage, HttpRequest, }; use std::future::{ready, Ready}; impl Transform for FederationMiddleware where S: Service, Error = Error>, S::Future: 'static, B: 'static, T: Clone + Sync + 'static, { type Response = ServiceResponse; type Error = Error; type Transform = FederationService; type InitError = (); type Future = Ready>; fn new_transform(&self, service: S) -> Self::Future { ready(Ok(FederationService { service, config: self.0.clone(), })) } } /// Passes [FederationConfig] to HTTP handlers, converting it to [Data] in the process #[doc(hidden)] pub struct FederationService where S: Service, S::Future: 'static, T: Sync, { service: S, config: FederationConfig, } impl Service for FederationService where S: Service, Error = Error>, S::Future: 'static, B: 'static, T: Clone + Sync + 'static, { type Response = ServiceResponse; type Error = Error; type Future = S::Future; forward_ready!(service); fn call(&self, req: ServiceRequest) -> Self::Future { req.extensions_mut().insert(self.config.clone()); self.service.call(req) } } impl FromRequest for Data { type Error = Error; type Future = Ready>; fn from_request(req: &HttpRequest, _payload: &mut Payload) -> Self::Future { ready(match req.extensions().get::>() { Some(c) => Ok(c.to_request_data()), None => Err(actix_web::error::ErrorBadRequest( "Missing extension, did you register FederationMiddleware?", )), }) } }