exc_make/
candles.rs

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/// Options for making a service to fetch candles.
11#[derive(Debug, Default)]
12pub struct MakeFetchCandlesOptions {
13    /// Rate limit.
14    pub rate_limit: Option<(u64, std::time::Duration)>,
15    /// Batch limit.
16    pub batch_limit: Option<usize>,
17}
18
19/// Make a service to subscribe instruments.
20pub trait MakeFetchCandles {
21    /// Service to fetch candles.
22    type Service: SendExcService<QueryCandles>;
23
24    /// The future of the service.
25    type Future: Future<Output = Result<Self::Service, ExchangeError>>;
26
27    /// Returns `Ready` when the factory is able to create more service.
28    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
29
30    /// Create a new service to fetch candles.
31    fn make_fetch_candles(&mut self, options: MakeFetchCandlesOptions) -> Self::Future;
32
33    /// Convert to a [`Service`](tower_service::Service).
34    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);