monolake_services/common/
delay.rs

1use std::time::Duration;
2
3use service_async::{
4    layer::{layer_fn, FactoryLayer},
5    AsyncMakeService, MakeService, Param, Service,
6};
7
8#[derive(Clone)]
9pub struct DelayService<T> {
10    pub delay: Duration,
11    pub inner: T,
12}
13
14impl<R, T> Service<R> for DelayService<T>
15where
16    T: Service<R>,
17{
18    type Response = T::Response;
19    type Error = T::Error;
20
21    async fn call(&self, req: R) -> Result<Self::Response, Self::Error> {
22        monoio::time::sleep(self.delay).await;
23        self.inner.call(req).await
24    }
25}
26
27#[derive(Debug, Clone, Copy)]
28pub struct Delay(pub Duration);
29
30impl<F> DelayService<F> {
31    pub fn layer<C>() -> impl FactoryLayer<C, F, Factory = Self>
32    where
33        C: Param<Delay>,
34    {
35        layer_fn(|c: &C, inner| DelayService {
36            delay: c.param().0,
37            inner,
38        })
39    }
40}
41
42impl<F: MakeService> MakeService for DelayService<F> {
43    type Service = DelayService<F::Service>;
44    type Error = F::Error;
45
46    fn make_via_ref(&self, old: Option<&Self::Service>) -> Result<Self::Service, Self::Error> {
47        Ok(DelayService {
48            delay: self.delay,
49            inner: self
50                .inner
51                .make_via_ref(old.map(|o| &o.inner))
52                .map_err(Into::into)?,
53        })
54    }
55}
56
57impl<F: AsyncMakeService> AsyncMakeService for DelayService<F> {
58    type Service = DelayService<F::Service>;
59    type Error = F::Error;
60
61    async fn make_via_ref(
62        &self,
63        old: Option<&Self::Service>,
64    ) -> Result<Self::Service, Self::Error> {
65        Ok(DelayService {
66            delay: self.delay,
67            inner: self
68                .inner
69                .make_via_ref(old.map(|o| &o.inner))
70                .await
71                .map_err(Into::into)?,
72        })
73    }
74}