1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use core::pin::Pin;
use crate::oneshot::OneshotRequest;
use crate::request::{BaseRequest, Request};
#[derive(Clone)]
pub struct Repeat<R> {
inner: R,
}
impl<R> From<R> for Repeat<R>
where
R: Clone,
{
fn from(req: R) -> Self {
Repeat { inner: req }
}
}
impl<R> BaseRequest for Repeat<R>
where
R: BaseRequest,
{
type Ok = R::Ok;
type Error = R::Error;
}
impl<R, C> OneshotRequest<C> for Repeat<R>
where
R: OneshotRequest<C> + Clone,
{
type Response = R::Response;
fn send_once(self, client: C) -> Self::Response {
self.inner.send_once(client)
}
}
impl<R, C> Request<C> for Repeat<R>
where
R: OneshotRequest<C> + Clone,
{
type Response = R::Response;
fn send(self: Pin<&mut Self>, client: C) -> Self::Response {
self.inner.clone().send_once(client)
}
}
#[cfg(feature = "backoff")]
mod impl_retry {
use core::time::Duration;
use super::Repeat;
use crate::retry::RetriableRequest;
impl<R> RetriableRequest for Repeat<R>
where
R: RetriableRequest,
{
fn should_retry(&self, error: &Self::Error, next_interval: Duration) -> bool {
self.inner.should_retry(error, next_interval)
}
}
}
mod impl_paginator {
use super::Repeat;
use crate::paginator::PagedRequest;
impl<R> PagedRequest for Repeat<R>
where
R: PagedRequest,
{
fn advance(&mut self, response: &Self::Ok) -> bool {
self.inner.advance(response)
}
}
}