mkt-core 0.2.0

Core traits, errors, and configuration for the mkt exchange client ecosystem.
Documentation
use async_trait::async_trait;
use mkt_types::{
    Balance, Fill, FuturesCancelOrderRequest, FuturesOrderQuery, FuturesOrderRequest, Kline,
    KlineRequest, LastPrice, MarketInfo, Order, OrderBook, Position, SetLeverageRequest,
    SpotCancelOrderRequest, SpotOrderQuery, SpotOrderRequest, Symbol, Trade,
};

use crate::{
    Capabilities, EventStream, PrivateEventStream, PrivateSubscription, Result, Subscription,
};
use mkt_types::ExchangeId;

pub trait ExchangeInfo: Send + Sync {
    fn id(&self) -> ExchangeId;
    fn capabilities(&self) -> Capabilities;
}

#[async_trait]
pub trait MarketData: Send + Sync {
    async fn markets(&self) -> Result<Vec<MarketInfo>>;
    async fn last_price(&self, symbol: &Symbol) -> Result<LastPrice>;
    async fn last_prices(&self, symbols: Option<&[Symbol]>) -> Result<Vec<LastPrice>>;
    async fn order_book(&self, symbol: &Symbol, depth: Option<u16>) -> Result<OrderBook>;
    async fn recent_trades(&self, symbol: &Symbol, limit: Option<u32>) -> Result<Vec<Trade>>;
    async fn klines(&self, request: KlineRequest) -> Result<Vec<Kline>>;
}

#[async_trait]
pub trait SpotTrading: Send + Sync {
    async fn place_spot_order(&self, request: SpotOrderRequest) -> Result<Order>;
    async fn cancel_spot_order(&self, request: SpotCancelOrderRequest) -> Result<Order>;
    async fn spot_order(&self, query: SpotOrderQuery) -> Result<Order>;
    async fn open_spot_orders(&self, symbol: Option<&Symbol>) -> Result<Vec<Order>>;
    async fn spot_fills(&self, query: SpotOrderQuery) -> Result<Vec<Fill>>;
}

#[async_trait]
pub trait FuturesTrading: Send + Sync {
    async fn place_futures_order(&self, request: FuturesOrderRequest) -> Result<Order>;
    async fn cancel_futures_order(&self, request: FuturesCancelOrderRequest) -> Result<Order>;
    async fn futures_order(&self, query: FuturesOrderQuery) -> Result<Order>;
    async fn open_futures_orders(&self, symbol: Option<&Symbol>) -> Result<Vec<Order>>;
    async fn futures_fills(&self, query: FuturesOrderQuery) -> Result<Vec<Fill>>;
    async fn positions(&self, symbol: Option<&Symbol>) -> Result<Vec<Position>>;
    async fn set_leverage(&self, request: SetLeverageRequest) -> Result<()>;
}

#[async_trait]
pub trait Account: Send + Sync {
    async fn balances(&self) -> Result<Vec<Balance>>;
}

#[async_trait]
pub trait PublicStream: Send + Sync {
    async fn subscribe_public(
        &self,
        subscriptions: Vec<Subscription>,
    ) -> Result<Box<dyn EventStream>>;
}

#[async_trait]
pub trait PrivateStream: Send + Sync {
    async fn subscribe_private(
        &self,
        subscriptions: Vec<PrivateSubscription>,
    ) -> Result<Box<dyn PrivateEventStream>>;
}