use exc_service::{ExchangeError, Request, SendExcService};
use exc_types::SubscribeTickers;
use futures::{future::MapErr, TryFutureExt};
use std::{
future::Future,
task::{Context, Poll},
};
use tower_make::MakeService;
#[derive(Debug, Clone, Copy, Default)]
pub enum FirstTrade {
#[default]
Wait,
Bid,
Ask,
BidAsk,
}
#[derive(Debug, Default)]
pub struct MakeTickersOptions {
prefer_trade_bid_ask: bool,
first_trade: FirstTrade,
accept_bid_ask_ts: bool,
}
impl MakeTickersOptions {
pub fn prefer_trade_bid_ask(mut self, flag: bool) -> Self {
self.prefer_trade_bid_ask = flag;
self
}
pub fn first_trade(mut self, mode: FirstTrade) -> Self {
self.first_trade = mode;
self
}
pub fn is_prefer_trade_bid_ask(&self) -> bool {
self.prefer_trade_bid_ask
}
pub fn get_first_trade(&self) -> FirstTrade {
self.first_trade
}
pub fn accept_bid_ask_ts(mut self, flag: bool) -> Self {
self.accept_bid_ask_ts = flag;
self
}
pub fn is_accept_bid_ask_ts(&self) -> bool {
self.accept_bid_ask_ts
}
}
pub trait MakeTickers {
type Service: SendExcService<SubscribeTickers>;
type Future: Future<Output = Result<Self::Service, ExchangeError>>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), ExchangeError>>;
fn make_tickers(&mut self, options: MakeTickersOptions) -> Self::Future;
fn as_make_tickers_service(&mut self) -> AsService<'_, Self>
where
Self: Sized,
{
AsService { make: self }
}
}
impl<M> MakeTickers for M
where
M: MakeService<
MakeTickersOptions,
SubscribeTickers,
Response = <SubscribeTickers as Request>::Response,
Error = ExchangeError,
>,
M::Service: SendExcService<SubscribeTickers>,
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_tickers(&mut self, options: MakeTickersOptions) -> Self::Future {
self.make_service(options).map_err(Into::into)
}
}
crate::create_as_service!(
MakeTickers,
MakeTickersOptions,
make_tickers,
"Service returns by [`MakeTickers::as_make_tickers_service`]."
);