use maxt::{
AccountStream, Balance, BoxFuture, Candle, CandleRequest, FundingPayment, FundingRate,
HistoryRequest, MarginRequest, MarginSummary, Market, MarketInfo, MarketKind, MarketStream,
Order, OrderBook, OrderRequest, Page, Position, Result, StreamConfig, Subscription, Ticker,
Trade,
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum AdapterCall {
Markets {
kind: MarketKind,
},
Trades {
market: Market,
limit: Option<u32>,
},
OrderBook {
market: Market,
depth: Option<u32>,
},
Ticker {
market: Market,
},
Candles {
request: CandleRequest,
},
Subscribe {
subscription: Subscription,
config: StreamConfig,
},
Balances,
OpenOrders {
market: Option<Market>,
},
SubscribeAccount {
config: StreamConfig,
},
PlaceOrder {
request: OrderRequest,
},
CancelOrder {
market: Market,
order_id: String,
},
Positions {
market: Option<Market>,
},
MarginSummary,
FundingRates {
request: HistoryRequest,
},
FundingPayments {
request: HistoryRequest,
},
SetMargin {
request: MarginRequest,
},
}
#[derive(Debug)]
#[non_exhaustive]
pub enum AdapterReply {
Markets(Vec<MarketInfo>),
Trades(Vec<Trade>),
OrderBook(OrderBook),
Ticker(Ticker),
Candles(Vec<Candle>),
MarketStream(MarketStream),
Balances(Vec<Balance>),
OpenOrders(Vec<Order>),
AccountStream(AccountStream),
PlaceOrder(Order),
CancelOrder(Order),
Positions(Vec<Position>),
MarginSummary(MarginSummary),
FundingRates(Page<FundingRate>),
FundingPayments(Page<FundingPayment>),
Unit,
}
pub trait ForeignDispatcher: Send + Sync + 'static {
fn dispatch(&self, call: AdapterCall) -> BoxFuture<'_, Result<AdapterReply>>;
}
impl AdapterReply {
pub(crate) const fn kind(&self) -> &'static str {
match self {
Self::Markets(_) => "Markets",
Self::Trades(_) => "Trades",
Self::OrderBook(_) => "OrderBook",
Self::Ticker(_) => "Ticker",
Self::Candles(_) => "Candles",
Self::MarketStream(_) => "MarketStream",
Self::Balances(_) => "Balances",
Self::OpenOrders(_) => "OpenOrders",
Self::AccountStream(_) => "AccountStream",
Self::PlaceOrder(_) => "PlaceOrder",
Self::CancelOrder(_) => "CancelOrder",
Self::Positions(_) => "Positions",
Self::MarginSummary(_) => "MarginSummary",
Self::FundingRates(_) => "FundingRates",
Self::FundingPayments(_) => "FundingPayments",
Self::Unit => "Unit",
}
}
}