|
@@ -1,16 +1,35 @@
|
|
|
-use crate::error::Error;
|
|
|
-use crate::payload::Payload;
|
|
|
-use crate::request::FlowyRequest;
|
|
|
-use crate::response::{FlowyResponse, Responder};
|
|
|
-use crate::service::{Service, ServiceFactory, ServiceRequest, ServiceResponse};
|
|
|
-use crate::util::ready::*;
|
|
|
+use crate::{
|
|
|
+ error::Error,
|
|
|
+ payload::Payload,
|
|
|
+ request::FlowyRequest,
|
|
|
+ response::{FlowyResponse, Responder},
|
|
|
+ service::{Service, ServiceFactory, ServiceRequest, ServiceResponse},
|
|
|
+ util::ready::*,
|
|
|
+};
|
|
|
use futures_core::ready;
|
|
|
use paste::paste;
|
|
|
use pin_project::pin_project;
|
|
|
-use std::future::Future;
|
|
|
-use std::marker::PhantomData;
|
|
|
-use std::pin::Pin;
|
|
|
-use std::task::{Context, Poll};
|
|
|
+use std::{
|
|
|
+ future::Future,
|
|
|
+ marker::PhantomData,
|
|
|
+ pin::Pin,
|
|
|
+ task::{Context, Poll},
|
|
|
+};
|
|
|
+
|
|
|
+use futures_core::future::LocalBoxFuture;
|
|
|
+
|
|
|
+pub fn factory<SF, Req>(factory: SF) -> BoxServiceFactory<SF::Config, Req, SF::Response, SF::Error, SF::InitError>
|
|
|
+where
|
|
|
+ SF: ServiceFactory<Req> + 'static,
|
|
|
+ Req: 'static,
|
|
|
+ SF::Response: 'static,
|
|
|
+ SF::Service: 'static,
|
|
|
+ SF::Future: 'static,
|
|
|
+ SF::Error: 'static,
|
|
|
+ SF::InitError: 'static,
|
|
|
+{
|
|
|
+ BoxServiceFactory(Box::new(FactoryWrapper(factory)))
|
|
|
+}
|
|
|
|
|
|
pub struct BoxServiceFactory<Cfg, Req, Res, Err, InitErr>(Inner<Cfg, Req, Res, Err, InitErr>);
|
|
|
impl<C, Req, Res, Err, InitErr> ServiceFactory<Req> for BoxServiceFactory<C, Req, Res, Err, InitErr>
|
|
@@ -25,17 +44,25 @@ where
|
|
|
type Service = BoxService<Req, Res, Err>;
|
|
|
type InitError = InitErr;
|
|
|
type Config = C;
|
|
|
+ type Future = LocalBoxFuture<'static, Result<Self::Service, InitErr>>;
|
|
|
|
|
|
- type Future = BoxFuture<Result<Self::Service, InitErr>>;
|
|
|
-
|
|
|
- fn new_service(&self, cfg: C) -> Self::Future {
|
|
|
- self.0.new_service(cfg)
|
|
|
- }
|
|
|
+ fn new_service(&self, cfg: C) -> Self::Future { self.0.new_service(cfg) }
|
|
|
}
|
|
|
|
|
|
-pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
|
|
|
+type Inner<C, Req, Res, Err, InitErr> = Box<
|
|
|
+ dyn ServiceFactory<
|
|
|
+ Req,
|
|
|
+ Config = C,
|
|
|
+ Response = Res,
|
|
|
+ Error = Err,
|
|
|
+ InitError = InitErr,
|
|
|
+ Service = BoxService<Req, Res, Err>,
|
|
|
+ Future = LocalBoxFuture<'static, Result<BoxService<Req, Res, Err>, InitErr>>,
|
|
|
+ >,
|
|
|
+>;
|
|
|
+
|
|
|
pub type BoxService<Req, Res, Err> =
|
|
|
- Box<dyn Service<Req, Response = Res, Error = Err, Future = BoxFuture<Result<Res, Err>>>>;
|
|
|
+ Box<dyn Service<Req, Response = Res, Error = Err, Future = LocalBoxFuture<'static, Result<Res, Err>>>>;
|
|
|
|
|
|
pub fn service<S, Req>(service: S) -> BoxService<Req, S::Response, S::Error>
|
|
|
where
|
|
@@ -54,9 +81,7 @@ where
|
|
|
type Error = S::Error;
|
|
|
type Future = S::Future;
|
|
|
|
|
|
- fn call(&self, request: Req) -> S::Future {
|
|
|
- (**self).call(request)
|
|
|
- }
|
|
|
+ fn call(&self, request: Req) -> S::Future { (**self).call(request) }
|
|
|
}
|
|
|
|
|
|
struct ServiceWrapper<S> {
|
|
@@ -64,9 +89,7 @@ struct ServiceWrapper<S> {
|
|
|
}
|
|
|
|
|
|
impl<S> ServiceWrapper<S> {
|
|
|
- fn new(inner: S) -> Self {
|
|
|
- Self { inner }
|
|
|
- }
|
|
|
+ fn new(inner: S) -> Self { Self { inner } }
|
|
|
}
|
|
|
|
|
|
impl<S, Req, Res, Err> Service<Req> for ServiceWrapper<S>
|
|
@@ -76,11 +99,9 @@ where
|
|
|
{
|
|
|
type Response = Res;
|
|
|
type Error = Err;
|
|
|
- type Future = BoxFuture<Result<Res, Err>>;
|
|
|
+ type Future = LocalBoxFuture<'static, Result<Res, Err>>;
|
|
|
|
|
|
- fn call(&self, req: Req) -> Self::Future {
|
|
|
- Box::pin(self.inner.call(req))
|
|
|
- }
|
|
|
+ fn call(&self, req: Req) -> Self::Future { Box::pin(self.inner.call(req)) }
|
|
|
}
|
|
|
|
|
|
struct FactoryWrapper<SF>(SF);
|
|
@@ -98,41 +119,13 @@ where
|
|
|
{
|
|
|
type Response = Res;
|
|
|
type Error = Err;
|
|
|
- // type Service: Service<Req, Response = Self::Response, Error = Self::Error>;
|
|
|
type Service = BoxService<Req, Res, Err>;
|
|
|
type InitError = InitErr;
|
|
|
type Config = Cfg;
|
|
|
- type Future = BoxFuture<Result<Self::Service, Self::InitError>>;
|
|
|
+ type Future = LocalBoxFuture<'static, Result<Self::Service, Self::InitError>>;
|
|
|
|
|
|
fn new_service(&self, cfg: Cfg) -> Self::Future {
|
|
|
let f = self.0.new_service(cfg);
|
|
|
Box::pin(async { f.await.map(|s| Box::new(ServiceWrapper::new(s)) as _) })
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-pub fn factory<SF, Req>(
|
|
|
- factory: SF,
|
|
|
-) -> BoxServiceFactory<SF::Config, Req, SF::Response, SF::Error, SF::InitError>
|
|
|
-where
|
|
|
- SF: ServiceFactory<Req> + 'static,
|
|
|
- Req: 'static,
|
|
|
- SF::Response: 'static,
|
|
|
- SF::Service: 'static,
|
|
|
- SF::Future: 'static,
|
|
|
- SF::Error: 'static,
|
|
|
- SF::InitError: 'static,
|
|
|
-{
|
|
|
- BoxServiceFactory(Box::new(FactoryWrapper(factory)))
|
|
|
-}
|
|
|
-
|
|
|
-type Inner<C, Req, Res, Err, InitErr> = Box<
|
|
|
- dyn ServiceFactory<
|
|
|
- Req,
|
|
|
- Config = C,
|
|
|
- Response = Res,
|
|
|
- Error = Err,
|
|
|
- InitError = InitErr,
|
|
|
- Service = BoxService<Req, Res, Err>,
|
|
|
- Future = BoxFuture<Result<BoxService<Req, Res, Err>, InitErr>>,
|
|
|
- >,
|
|
|
->;
|