pub mod error;
mod layer;
pub use self::layer::TimeoutLayer;
use error::Elapsed;
use std::time::Duration;
use tower_async_service::Service;
#[derive(Debug, Clone)]
pub struct Timeout<T> {
inner: T,
timeout: Duration,
}
impl<T> Timeout<T> {
pub fn new(inner: T, timeout: Duration) -> Self {
Timeout { inner, timeout }
}
pub fn get_ref(&self) -> &T {
&self.inner
}
pub fn into_inner(self) -> T {
self.inner
}
}
impl<S, Request> Service<Request> for Timeout<S>
where
S: Service<Request>,
S::Error: Into<crate::BoxError>,
{
type Response = S::Response;
type Error = crate::BoxError;
async fn call(&self, request: Request) -> Result<Self::Response, Self::Error> {
tokio::select! {
res = self.inner.call(request) => res.map_err(Into::into),
_ = tokio::time::sleep(self.timeout) => Err(Elapsed(()).into()),
}
}
}