mirror of
https://github.com/fafhrd91/actix-net
synced 2025-09-02 00:31:55 +02:00
add Config argument to NewService
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use futures::{try_ready, Async, Future, Poll};
|
||||
|
||||
use super::{IntoNewService, NewService, Service};
|
||||
@@ -109,34 +111,38 @@ where
|
||||
}
|
||||
|
||||
/// `ThenNewService` new service combinator
|
||||
pub struct ThenNewService<A, B> {
|
||||
pub struct ThenNewService<A, B, C> {
|
||||
a: A,
|
||||
b: B,
|
||||
_t: PhantomData<C>,
|
||||
}
|
||||
|
||||
impl<A, B> ThenNewService<A, B> {
|
||||
impl<A, B, C> ThenNewService<A, B, C> {
|
||||
/// Create new `AndThen` combinator
|
||||
pub fn new<F>(a: A, f: F) -> Self
|
||||
where
|
||||
A: NewService,
|
||||
A: NewService<C>,
|
||||
B: NewService<
|
||||
C,
|
||||
Request = Result<A::Response, A::Error>,
|
||||
Error = A::Error,
|
||||
InitError = A::InitError,
|
||||
>,
|
||||
F: IntoNewService<B>,
|
||||
F: IntoNewService<B, C>,
|
||||
{
|
||||
Self {
|
||||
a,
|
||||
b: f.into_new_service(),
|
||||
_t: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<A, B> NewService for ThenNewService<A, B>
|
||||
impl<A, B, C> NewService<C> for ThenNewService<A, B, C>
|
||||
where
|
||||
A: NewService,
|
||||
A: NewService<C>,
|
||||
B: NewService<
|
||||
C,
|
||||
Request = Result<A::Response, A::Error>,
|
||||
Error = A::Error,
|
||||
InitError = A::InitError,
|
||||
@@ -148,14 +154,14 @@ where
|
||||
type Service = Then<A::Service, B::Service>;
|
||||
|
||||
type InitError = A::InitError;
|
||||
type Future = ThenNewServiceFuture<A, B>;
|
||||
type Future = ThenNewServiceFuture<A, B, C>;
|
||||
|
||||
fn new_service(&self) -> Self::Future {
|
||||
ThenNewServiceFuture::new(self.a.new_service(), self.b.new_service())
|
||||
fn new_service(&self, cfg: &C) -> Self::Future {
|
||||
ThenNewServiceFuture::new(self.a.new_service(cfg), self.b.new_service(cfg))
|
||||
}
|
||||
}
|
||||
|
||||
impl<A, B> Clone for ThenNewService<A, B>
|
||||
impl<A, B, C> Clone for ThenNewService<A, B, C>
|
||||
where
|
||||
A: Clone,
|
||||
B: Clone,
|
||||
@@ -164,14 +170,16 @@ where
|
||||
Self {
|
||||
a: self.a.clone(),
|
||||
b: self.b.clone(),
|
||||
_t: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ThenNewServiceFuture<A, B>
|
||||
pub struct ThenNewServiceFuture<A, B, C>
|
||||
where
|
||||
A: NewService,
|
||||
A: NewService<C>,
|
||||
B: NewService<
|
||||
C,
|
||||
Request = Result<A::Response, A::Error>,
|
||||
Error = A::Error,
|
||||
InitError = A::InitError,
|
||||
@@ -183,10 +191,11 @@ where
|
||||
b: Option<B::Service>,
|
||||
}
|
||||
|
||||
impl<A, B> ThenNewServiceFuture<A, B>
|
||||
impl<A, B, C> ThenNewServiceFuture<A, B, C>
|
||||
where
|
||||
A: NewService,
|
||||
A: NewService<C>,
|
||||
B: NewService<
|
||||
C,
|
||||
Request = Result<A::Response, A::Error>,
|
||||
Error = A::Error,
|
||||
InitError = A::InitError,
|
||||
@@ -202,10 +211,11 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<A, B> Future for ThenNewServiceFuture<A, B>
|
||||
impl<A, B, C> Future for ThenNewServiceFuture<A, B, C>
|
||||
where
|
||||
A: NewService,
|
||||
A: NewService<C>,
|
||||
B: NewService<
|
||||
C,
|
||||
Request = Result<A::Response, A::Error>,
|
||||
Error = A::Error,
|
||||
InitError = A::InitError,
|
||||
@@ -319,7 +329,7 @@ mod tests {
|
||||
let cnt2 = cnt.clone();
|
||||
let blank = move || Ok::<_, ()>(Srv1(cnt2.clone()));
|
||||
let new_srv = blank.into_new_service().then(move || Ok(Srv2(cnt.clone())));
|
||||
if let Async::Ready(mut srv) = new_srv.clone().new_service().poll().unwrap() {
|
||||
if let Async::Ready(mut srv) = new_srv.clone().new_service(&()).poll().unwrap() {
|
||||
let res = srv.call(Ok("srv1")).poll();
|
||||
assert!(res.is_ok());
|
||||
assert_eq!(res.unwrap(), Async::Ready(("srv1", "ok")));
|
||||
|
Reference in New Issue
Block a user