monolake_services/common/
delay.rs1use 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}