mirror of
https://github.com/fafhrd91/actix-net
synced 2024-11-27 23:42:56 +01:00
better ergonomics for .apply combinator
This commit is contained in:
parent
88548199d7
commit
0340d82314
@ -6,7 +6,14 @@ use super::{IntoNewService, IntoService, NewService, Service};
|
|||||||
use crate::cell::Cell;
|
use crate::cell::Cell;
|
||||||
|
|
||||||
/// `Apply` service combinator
|
/// `Apply` service combinator
|
||||||
pub struct AndThenApply<A, B, F, Out, Req1, Req2> {
|
pub struct AndThenApply<A, B, F, Out, Req1, Req2>
|
||||||
|
where
|
||||||
|
A: Service<Req1>,
|
||||||
|
B: Service<Req2, Error = A::Error>,
|
||||||
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
|
Out: IntoFuture,
|
||||||
|
Out::Error: Into<A::Error>,
|
||||||
|
{
|
||||||
a: A,
|
a: A,
|
||||||
b: Cell<B>,
|
b: Cell<B>,
|
||||||
f: Cell<F>,
|
f: Cell<F>,
|
||||||
@ -19,7 +26,7 @@ where
|
|||||||
B: Service<Req2, Error = A::Error>,
|
B: Service<Req2, Error = A::Error>,
|
||||||
F: FnMut(A::Response, &mut B) -> Out,
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
/// Create new `Apply` combinator
|
/// Create new `Apply` combinator
|
||||||
pub fn new<A1: IntoService<A, Req1>, B1: IntoService<B, Req2>>(a: A1, b: B1, f: F) -> Self {
|
pub fn new<A1: IntoService<A, Req1>, B1: IntoService<B, Req2>>(a: A1, b: B1, f: F) -> Self {
|
||||||
@ -34,7 +41,11 @@ where
|
|||||||
|
|
||||||
impl<A, B, F, Out, Req1, Req2> Clone for AndThenApply<A, B, F, Out, Req1, Req2>
|
impl<A, B, F, Out, Req1, Req2> Clone for AndThenApply<A, B, F, Out, Req1, Req2>
|
||||||
where
|
where
|
||||||
A: Clone,
|
A: Service<Req1> + Clone,
|
||||||
|
B: Service<Req2, Error = A::Error>,
|
||||||
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
|
Out: IntoFuture,
|
||||||
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
AndThenApply {
|
AndThenApply {
|
||||||
@ -52,14 +63,14 @@ where
|
|||||||
B: Service<Req2, Error = A::Error>,
|
B: Service<Req2, Error = A::Error>,
|
||||||
F: FnMut(A::Response, &mut B) -> Out,
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
type Response = Out::Item;
|
type Response = Out::Item;
|
||||||
type Error = Out::Error;
|
type Error = A::Error;
|
||||||
type Future = AndThenApplyFuture<A, B, F, Out, Req1, Req2>;
|
type Future = AndThenApplyFuture<A, B, F, Out, Req1, Req2>;
|
||||||
|
|
||||||
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
|
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
|
||||||
try_ready!(self.a.poll_ready().map_err(|e| e.into()));
|
try_ready!(self.a.poll_ready());
|
||||||
self.b.get_mut().poll_ready().map_err(|e| e.into())
|
self.b.get_mut().poll_ready().map_err(|e| e.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +91,7 @@ where
|
|||||||
B: Service<Req2, Error = A::Error>,
|
B: Service<Req2, Error = A::Error>,
|
||||||
F: FnMut(A::Response, &mut B) -> Out,
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
b: Cell<B>,
|
b: Cell<B>,
|
||||||
f: Cell<F>,
|
f: Cell<F>,
|
||||||
@ -95,14 +106,14 @@ where
|
|||||||
B: Service<Req2, Error = A::Error>,
|
B: Service<Req2, Error = A::Error>,
|
||||||
F: FnMut(A::Response, &mut B) -> Out,
|
F: FnMut(A::Response, &mut B) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
type Item = Out::Item;
|
type Item = Out::Item;
|
||||||
type Error = Out::Error;
|
type Error = A::Error;
|
||||||
|
|
||||||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
|
||||||
if let Some(ref mut fut) = self.fut_b {
|
if let Some(ref mut fut) = self.fut_b {
|
||||||
return fut.poll();
|
return fut.poll().map_err(|e| e.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.fut_a.as_mut().expect("Bug in actix-service").poll() {
|
match self.fut_a.as_mut().expect("Bug in actix-service").poll() {
|
||||||
@ -132,7 +143,7 @@ where
|
|||||||
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
||||||
F: FnMut(A::Response, &mut B::Service) -> Out,
|
F: FnMut(A::Response, &mut B::Service) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
/// Create new `ApplyNewService` new service instance
|
/// Create new `ApplyNewService` new service instance
|
||||||
pub fn new<A1: IntoNewService<A, Req1>, B1: IntoNewService<B, Req2>>(
|
pub fn new<A1: IntoNewService<A, Req1>, B1: IntoNewService<B, Req2>>(
|
||||||
@ -171,10 +182,10 @@ where
|
|||||||
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
||||||
F: FnMut(A::Response, &mut B::Service) -> Out,
|
F: FnMut(A::Response, &mut B::Service) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
type Response = Out::Item;
|
type Response = Out::Item;
|
||||||
type Error = Out::Error;
|
type Error = A::Error;
|
||||||
|
|
||||||
type InitError = A::InitError;
|
type InitError = A::InitError;
|
||||||
type Service = AndThenApply<A::Service, B::Service, F, Out, Req1, Req2>;
|
type Service = AndThenApply<A::Service, B::Service, F, Out, Req1, Req2>;
|
||||||
@ -197,7 +208,7 @@ where
|
|||||||
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
||||||
F: FnMut(A::Response, &mut B::Service) -> Out,
|
F: FnMut(A::Response, &mut B::Service) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
fut_b: B::Future,
|
fut_b: B::Future,
|
||||||
fut_a: A::Future,
|
fut_a: A::Future,
|
||||||
@ -212,7 +223,7 @@ where
|
|||||||
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
B: NewService<Req2, Error = A::Error, InitError = A::InitError>,
|
||||||
F: FnMut(A::Response, &mut B::Service) -> Out,
|
F: FnMut(A::Response, &mut B::Service) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<A::Error>,
|
Out::Error: Into<A::Error>,
|
||||||
{
|
{
|
||||||
type Item = AndThenApply<A::Service, B::Service, F, Out, Req1, Req2>;
|
type Item = AndThenApply<A::Service, B::Service, F, Out, Req1, Req2>;
|
||||||
type Error = A::InitError;
|
type Error = A::InitError;
|
||||||
|
@ -71,7 +71,7 @@ pub trait ServiceExt<Request>: Service<Request> {
|
|||||||
I: IntoService<B, Req>,
|
I: IntoService<B, Req>,
|
||||||
F: FnMut(Self::Response, &mut B) -> Out,
|
F: FnMut(Self::Response, &mut B) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<Self::Error>,
|
Out::Error: Into<Self::Error>,
|
||||||
{
|
{
|
||||||
AndThenApply::new(self, service, f)
|
AndThenApply::new(self, service, f)
|
||||||
}
|
}
|
||||||
@ -197,7 +197,7 @@ pub trait NewService<Request> {
|
|||||||
I: IntoNewService<B, Req>,
|
I: IntoNewService<B, Req>,
|
||||||
F: FnMut(Self::Response, &mut B::Service) -> Out,
|
F: FnMut(Self::Response, &mut B::Service) -> Out,
|
||||||
Out: IntoFuture,
|
Out: IntoFuture,
|
||||||
Out::Error: From<Self::Error>,
|
Out::Error: Into<Self::Error>,
|
||||||
{
|
{
|
||||||
AndThenApplyNewService::new(self, service, f)
|
AndThenApplyNewService::new(self, service, f)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user