1use exc_service::{ExchangeError, Request, SendExcService};
2use exc_types::QueryCandles;
3use futures::{future::MapErr, TryFutureExt};
4use std::{
5 future::Future,
6 task::{Context, Poll},
7};
8use tower_make::MakeService;
9
10#[derive(Debug, Default)]
12pub struct MakeFetchCandlesOptions {
13 pub rate_limit: Option<(u64, std::time::Duration)>,
15 pub batch_limit: Option<usize>,
17}
18
19pub trait MakeFetchCandles {
21 type Service: SendExcService<QueryCandles>;
23
24 type Future: Future<Output = Result<Self::Service, ExchangeError>>;
26
27 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
29
30 fn make_fetch_candles(&mut self, options: MakeFetchCandlesOptions) -> Self::Future;
32
33 fn as_make_fetch_candles_service(&mut self) -> AsService<'_, Self>
35 where
36 Self: Sized,
37 {
38 AsService { make: self }
39 }
40}
41
42impl<M> MakeFetchCandles for M
43where
44 M: MakeService<
45 MakeFetchCandlesOptions,
46 QueryCandles,
47 Response = <QueryCandles as Request>::Response,
48 Error = ExchangeError,
49 >,
50 M::Service: SendExcService<QueryCandles>,
51 M::MakeError: Into<ExchangeError>,
52{
53 type Service = M::Service;
54
55 type Future = MapErr<M::Future, fn(M::MakeError) -> ExchangeError>;
56
57 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>> {
58 self.poll_ready(cx).map_err(Into::into)
59 }
60
61 fn make_fetch_candles(&mut self, options: MakeFetchCandlesOptions) -> Self::Future {
62 self.make_service(options).map_err(Into::into)
63 }
64}
65
66crate::create_as_service!(
67 MakeFetchCandles,
68 MakeFetchCandlesOptions,
69 make_fetch_candles,
70 "Service returns by [`MakeFetchCandles::as_make_fetch_candles_service`]."
71);