Finalize tokio-service APIs for 0.1
A bit of tidying up ahead of the 0.1 release: - Drop `poll_ready` for now, given that we're uncertain about the overall backpressure story, and it can be added easily as a defaulted method later on. Backpressure should be a major goal in an upcoming release. - Rename `SimpleService` to `FnService`, matching the `Fn*` traits. - Rename `NewService::Item` to `NewService::Instance`, for greater clarity about their relationship.
This commit is contained in:
parent
92eccdc149
commit
5b63058129
46
src/lib.rs
46
src/lib.rs
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
extern crate futures;
|
extern crate futures;
|
||||||
|
|
||||||
use futures::{Async, Future, IntoFuture};
|
use futures::{Future, IntoFuture};
|
||||||
|
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
@ -153,14 +153,10 @@ pub trait Service {
|
||||||
|
|
||||||
/// Process the request and return the response asynchronously.
|
/// Process the request and return the response asynchronously.
|
||||||
fn call(&self, req: Self::Request) -> Self::Future;
|
fn call(&self, req: Self::Request) -> Self::Future;
|
||||||
|
|
||||||
/// Returns `Async::Ready` when the service is ready to accept a request.
|
|
||||||
fn poll_ready(&self) -> Async<()>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates new `Service` values.
|
/// Creates new `Service` values.
|
||||||
pub trait NewService {
|
pub trait NewService {
|
||||||
|
|
||||||
/// Requests handled by the service
|
/// Requests handled by the service
|
||||||
type Request;
|
type Request;
|
||||||
|
|
||||||
|
@ -171,27 +167,27 @@ pub trait NewService {
|
||||||
type Error;
|
type Error;
|
||||||
|
|
||||||
/// The `Service` value created by this factory
|
/// The `Service` value created by this factory
|
||||||
type Item: Service<Request = Self::Request, Response = Self::Response, Error = Self::Error>;
|
type Instance: Service<Request = Self::Request, Response = Self::Response, Error = Self::Error>;
|
||||||
|
|
||||||
/// Create and return a new service value.
|
/// Create and return a new service value.
|
||||||
fn new_service(&self) -> io::Result<Self::Item>;
|
fn new_service(&self) -> io::Result<Self::Instance>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A service implemented by a closure.
|
/// A service implemented by a closure.
|
||||||
pub struct SimpleService<F, R> {
|
pub struct FnService<F, R> {
|
||||||
f: Arc<F>,
|
f: Arc<F>,
|
||||||
_ty: PhantomData<fn() -> R>, // don't impose Sync on R
|
_ty: PhantomData<fn() -> R>, // don't impose Sync on R
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a `Service` backed by the given closure.
|
/// Returns a `Service` backed by the given closure.
|
||||||
pub fn simple_service<F, R>(f: F) -> SimpleService<F, R> {
|
pub fn fn_service<F, R>(f: F) -> FnService<F, R> {
|
||||||
SimpleService::new(f)
|
FnService::new(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, R> SimpleService<F, R> {
|
impl<F, R> FnService<F, R> {
|
||||||
/// Create and return a new `SimpleService` backed by the given function.
|
/// Create and return a new `FnService` backed by the given function.
|
||||||
pub fn new(f: F) -> SimpleService<F, R> {
|
pub fn new(f: F) -> FnService<F, R> {
|
||||||
SimpleService {
|
FnService {
|
||||||
f: Arc::new(f),
|
f: Arc::new(f),
|
||||||
_ty: PhantomData,
|
_ty: PhantomData,
|
||||||
}
|
}
|
||||||
|
@ -201,7 +197,7 @@ impl<F, R> SimpleService<F, R> {
|
||||||
impl<T> NewService for T
|
impl<T> NewService for T
|
||||||
where T: Service + Clone,
|
where T: Service + Clone,
|
||||||
{
|
{
|
||||||
type Item = T;
|
type Instance = T;
|
||||||
type Request = T::Request;
|
type Request = T::Request;
|
||||||
type Response = T::Response;
|
type Response = T::Response;
|
||||||
type Error = T::Error;
|
type Error = T::Error;
|
||||||
|
@ -211,7 +207,7 @@ impl<T> NewService for T
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, R, S> Service for SimpleService<F, R>
|
impl<F, R, S> Service for FnService<F, R>
|
||||||
where F: Fn(R) -> S + Sync + Send + 'static,
|
where F: Fn(R) -> S + Sync + Send + 'static,
|
||||||
R: Send + 'static,
|
R: Send + 'static,
|
||||||
S: IntoFuture + Send + 'static,
|
S: IntoFuture + Send + 'static,
|
||||||
|
@ -227,15 +223,11 @@ impl<F, R, S> Service for SimpleService<F, R>
|
||||||
fn call(&self, req: R) -> Self::Future {
|
fn call(&self, req: R) -> Self::Future {
|
||||||
(self.f)(req).into_future()
|
(self.f)(req).into_future()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_ready(&self) -> Async<()> {
|
|
||||||
Async::Ready(())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, R> Clone for SimpleService<F, R> {
|
impl<F, R> Clone for FnService<F, R> {
|
||||||
fn clone(&self) -> SimpleService<F, R> {
|
fn clone(&self) -> FnService<F, R> {
|
||||||
SimpleService {
|
FnService {
|
||||||
f: self.f.clone(),
|
f: self.f.clone(),
|
||||||
_ty: PhantomData,
|
_ty: PhantomData,
|
||||||
}
|
}
|
||||||
|
@ -253,10 +245,6 @@ impl<T, U, E, F> Service for Box<Service<Request = T, Response = U, Error = E, F
|
||||||
fn call(&self, request: T) -> F {
|
fn call(&self, request: T) -> F {
|
||||||
(**self).call(request)
|
(**self).call(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_ready(&self) -> Async<()> {
|
|
||||||
(**self).poll_ready()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, U, E, F> Service for Box<Service<Request = T, Response = U, Error = E, Future = F> + Send + 'static>
|
impl<T, U, E, F> Service for Box<Service<Request = T, Response = U, Error = E, Future = F> + Send + 'static>
|
||||||
|
@ -270,8 +258,4 @@ impl<T, U, E, F> Service for Box<Service<Request = T, Response = U, Error = E, F
|
||||||
fn call(&self, request: T) -> F {
|
fn call(&self, request: T) -> F {
|
||||||
(**self).call(request)
|
(**self).call(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll_ready(&self) -> Async<()> {
|
|
||||||
(**self).poll_ready()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue