static compat middleware future

This commit is contained in:
ibraheemdev 2021-04-22 12:08:21 -04:00
parent 07036b5640
commit 73b89d6f58
1 changed files with 23 additions and 7 deletions

View File

@ -8,7 +8,7 @@ use std::{
use actix_http::body::{Body, MessageBody, ResponseBody}; use actix_http::body::{Body, MessageBody, ResponseBody};
use actix_service::{Service, Transform}; use actix_service::{Service, Transform};
use futures_core::{future::LocalBoxFuture, ready}; use futures_core::ready;
use crate::{error::Error, service::ServiceResponse}; use crate::{error::Error, service::ServiceResponse};
@ -55,14 +55,30 @@ where
type Error = Error; type Error = Error;
type Transform = CompatMiddleware<T::Transform>; type Transform = CompatMiddleware<T::Transform>;
type InitError = T::InitError; type InitError = T::InitError;
type Future = LocalBoxFuture<'static, Result<Self::Transform, Self::InitError>>; type Future = CompatFut<T::Future>;
fn new_transform(&self, service: S) -> Self::Future { fn new_transform(&self, service: S) -> Self::Future {
let fut = self.transform.new_transform(service); CompatFut {
Box::pin(async move { fut: self.transform.new_transform(service),
let service = fut.await?; }
Ok(CompatMiddleware { service }) }
}) }
#[pin_project::pin_project]
pub struct CompatFut<F> {
#[pin]
fut: F,
}
impl<T, TE, F> Future for CompatFut<F>
where
F: Future<Output = Result<T, TE>>,
{
type Output = Result<CompatMiddleware<T>, TE>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let service = ready!(self.project().fut.poll(cx))?;
Poll::Ready(Ok(CompatMiddleware { service }))
} }
} }