use exc_service::{ExchangeError, Request, SendExcService};
use exc_types::GetOrder;
use futures::{future::MapErr, TryFutureExt};
use std::{
future::Future,
task::{Context, Poll},
};
use tower_make::MakeService;
#[derive(Debug, Default)]
pub struct MakeCheckOrderOptions {}
pub trait MakeCheckOrder {
type Service: SendExcService<GetOrder>;
type Future: Future<Output = Result<Self::Service, ExchangeError>>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
fn make_check_order(&mut self, options: MakeCheckOrderOptions) -> Self::Future;
fn as_make_check_order_service(&mut self) -> AsService<'_, Self>
where
Self: Sized,
{
AsService { make: self }
}
}
impl<M> MakeCheckOrder for M
where
M: MakeService<
MakeCheckOrderOptions,
GetOrder,
Response = <GetOrder as Request>::Response,
Error = ExchangeError,
>,
M::Service: SendExcService<GetOrder>,
M::MakeError: Into<ExchangeError>,
{
type Service = M::Service;
type Future = MapErr<M::Future, fn(M::MakeError) -> ExchangeError>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>> {
self.poll_ready(cx).map_err(Into::into)
}
fn make_check_order(&mut self, options: MakeCheckOrderOptions) -> Self::Future {
self.make_service(options).map_err(Into::into)
}
}
crate::create_as_service!(
MakeCheckOrder,
MakeCheckOrderOptions,
make_check_order,
"Service returns by [`MakeCheckOrder::as_make_check_order_service`]."
);