use crate::AsyncServiceWrapper;
pub trait AsyncServiceExt<Request>: tower_service::Service<Request> {
fn into_async(self) -> AsyncServiceWrapper<Self>
where
Self: Sized,
{
AsyncServiceWrapper::new(self)
}
}
impl<S, Request> AsyncServiceExt<Request> for S where S: tower_service::Service<Request> {}
#[cfg(test)]
mod tests {
use super::*;
use std::{
convert::Infallible,
future::Future,
pin::Pin,
task::{Context, Poll},
time::Duration,
};
use tower::{service_fn, Service};
use tower_async::{
make::Shared, MakeService, Service as AsyncService, ServiceBuilder, ServiceExt,
};
struct EchoService;
impl Service<String> for EchoService {
type Response = String;
type Error = Infallible;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Poll::Ready(Ok(()))
}
fn call(&mut self, req: String) -> Self::Future {
let fut = async { Ok(req) };
Box::pin(fut)
}
}
struct AsyncEchoService;
impl tower_async::Service<String> for AsyncEchoService {
type Response = String;
type Error = Infallible;
async fn call(&self, req: String) -> Result<Self::Response, Self::Error> {
Ok(req)
}
}
#[tokio::test]
async fn test_async_service_ext() {
let service = EchoService;
let service = ServiceBuilder::new()
.timeout(Duration::from_secs(1))
.service(service.into_async()); let response = service.oneshot("hello".to_string()).await.unwrap();
assert_eq!(response, "hello");
}
async fn echo<R>(req: R) -> Result<R, Infallible> {
Ok(req)
}
#[tokio::test]
async fn as_make_service() {
let service = Shared::new(service_fn(echo::<&'static str>).into_async());
let svc = service.make_service(()).await.unwrap();
let res = svc.call("foo").await.unwrap();
assert_eq!(res, "foo");
}
}