exc_make/
cancel.rs

1use exc_service::{ExchangeError, Request, SendExcService};
2use exc_types::CancelOrder;
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 Cancel orders.
11#[derive(Debug, Default)]
12pub struct MakeCancelOrderOptions {}
13
14/// Make a service to cancel orders.
15pub trait MakeCancelOrder {
16    /// Service to cancel orders.
17    type Service: SendExcService<CancelOrder>;
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 cancel orders.
26    fn make_cancel_order(&mut self, options: MakeCancelOrderOptions) -> Self::Future;
27
28    /// Convert to a [`Service`](tower_service::Service).
29    fn as_make_cancel_order_service(&mut self) -> AsService<'_, Self>
30    where
31        Self: Sized,
32    {
33        AsService { make: self }
34    }
35}
36
37impl<M> MakeCancelOrder for M
38where
39    M: MakeService<
40        MakeCancelOrderOptions,
41        CancelOrder,
42        Response = <CancelOrder as Request>::Response,
43        Error = ExchangeError,
44    >,
45    M::Service: SendExcService<CancelOrder>,
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_cancel_order(&mut self, options: MakeCancelOrderOptions) -> Self::Future {
57        self.make_service(options).map_err(Into::into)
58    }
59}
60
61crate::create_as_service!(
62    MakeCancelOrder,
63    MakeCancelOrderOptions,
64    make_cancel_order,
65    "Service returns by [`MakeCancelOrder::as_make_cancel_order_service`]."
66);