1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use async_trait::async_trait; use crate::exchange_info::ExchangeInfoRetrieval; use crate::{ model::{ Balance, CancelAllOrdersRequest, CancelOrderRequest, Candle, GetHistoricRatesRequest, GetHistoricTradesRequest, GetOrderHistoryRequest, GetOrderRequest, GetPriceTickerRequest, OpenLimitOrderRequest, OpenMarketOrderRequest, Order, OrderBookRequest, OrderBookResponse, OrderCanceled, Paginator, Ticker, Trade, TradeHistoryRequest, }, shared::Result, }; pub struct OpenLimits {} impl OpenLimits { pub async fn instantiate<E: Exchange>(parameters: E::InitParams) -> Result<E> { Ok(E::new(parameters).await?) } } #[async_trait] pub trait Exchange: ExchangeInfoRetrieval + ExchangeAccount + ExchangeMarketData + Sized { type InitParams; type InnerClient; async fn new(params: Self::InitParams) -> Result<Self>; fn inner_client(&self) -> Option<&Self::InnerClient>; } #[async_trait] pub trait ExchangeMarketData { async fn order_book(&self, req: &OrderBookRequest) -> Result<OrderBookResponse>; async fn get_price_ticker(&self, req: &GetPriceTickerRequest) -> Result<Ticker>; async fn get_historic_rates(&self, req: &GetHistoricRatesRequest) -> Result<Vec<Candle>>; async fn get_historic_trades(&self, req: &GetHistoricTradesRequest) -> Result<Vec<Trade>>; } #[async_trait] pub trait ExchangeAccount { async fn limit_buy(&self, req: &OpenLimitOrderRequest) -> Result<Order>; async fn limit_sell(&self, req: &OpenLimitOrderRequest) -> Result<Order>; async fn market_buy(&self, req: &OpenMarketOrderRequest) -> Result<Order>; async fn market_sell(&self, req: &OpenMarketOrderRequest) -> Result<Order>; async fn cancel_order(&self, req: &CancelOrderRequest) -> Result<OrderCanceled>; async fn cancel_all_orders(&self, req: &CancelAllOrdersRequest) -> Result<Vec<OrderCanceled>>; async fn get_all_open_orders(&self) -> Result<Vec<Order>>; async fn get_order_history(&self, req: &GetOrderHistoryRequest) -> Result<Vec<Order>>; async fn get_trade_history(&self, req: &TradeHistoryRequest) -> Result<Vec<Trade>>; async fn get_account_balances(&self, paginator: Option<Paginator>) -> Result<Vec<Balance>>; async fn get_order(&self, req: &GetOrderRequest) -> Result<Order>; }