use std::sync::Arc;
use async_lock::Mutex;
#[derive(Debug)]
pub struct AsyncServiceWrapper<S> {
inner: Arc<Mutex<S>>,
}
impl<S> Clone for AsyncServiceWrapper<S>
where
S: Clone,
{
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
}
}
}
impl<S> AsyncServiceWrapper<S> {
pub fn new(inner: S) -> Self {
Self {
inner: Arc::new(Mutex::new(inner)),
}
}
}
impl<S, Request> tower_async_service::Service<Request> for AsyncServiceWrapper<S>
where
S: tower_service::Service<Request>,
{
type Response = S::Response;
type Error = S::Error;
#[inline]
async fn call(&self, request: Request) -> Result<Self::Response, Self::Error> {
use tower::ServiceExt;
self.inner.lock().await.ready().await?.call(request).await
}
}