exc_make/
check.rs

1use exc_service::{ExchangeError, Request, SendExcService};
2use exc_types::GetOrder;
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 check orders.
11#[derive(Debug, Default)]
12pub struct MakeCheckOrderOptions {}
13
14/// Make a service to check orders.
15pub trait MakeCheckOrder {
16    /// Service to check orders.
17    type Service: SendExcService<GetOrder>;
18
19    /// The future of the service.
20    type Future: Future<Output = Result<Self::Service, ExchangeError>>;
21
22    /// Returns `Ready` when the factory is able to create more service.
23    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
24
25    /// Create a new service to check orders.
26    fn make_check_order(&mut self, options: MakeCheckOrderOptions) -> Self::Future;
27
28    /// Convert to a [`Service`](tower_service::Service).
29    fn as_make_check_order_service(&mut self) -> AsService<'_, Self>
30    where
31        Self: Sized,
32    {
33        AsService { make: self }
34    }
35}
36
37impl<M> MakeCheckOrder for M
38where
39    M: MakeService<
40        MakeCheckOrderOptions,
41        GetOrder,
42        Response = <GetOrder as Request>::Response,
43        Error = ExchangeError,
44    >,
45    M::Service: SendExcService<GetOrder>,
46    M::MakeError: Into<ExchangeError>,
47{
48    type Service = M::Service;
49
50    type Future = MapErr<M::Future, fn(M::MakeError) -> ExchangeError>;
51
52    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>> {
53        self.poll_ready(cx).map_err(Into::into)
54    }
55
56    fn make_check_order(&mut self, options: MakeCheckOrderOptions) -> Self::Future {
57        self.make_service(options).map_err(Into::into)
58    }
59}
60
61crate::create_as_service!(
62    MakeCheckOrder,
63    MakeCheckOrderOptions,
64    make_check_order,
65    "Service returns by [`MakeCheckOrder::as_make_check_order_service`]."
66);