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#[derive(Debug, Default)]
12pub struct MakeCancelOrderOptions {}
13
14pub trait MakeCancelOrder {
16 type Service: SendExcService<CancelOrder>;
18
19 type Future: Future<Output = Result<Self::Service, ExchangeError>>;
21
22 fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
24
25 fn make_cancel_order(&mut self, options: MakeCancelOrderOptions) -> Self::Future;
27
28 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);