binance-common 0.2.3

Common data structures, error types, and utilities shared across Binance API crates.
Documentation
use std::fmt;

use crate::{
    enums::{Interval, WebSocketStreamRate},
    futures::endpoint::host::WebSocketHost,
};

#[derive(Debug)]
pub enum WebSocketSymbol {
    AdaUsdc,
    AdaUsdt,
    AvaxUsdc,
    AvaxUsdt,
    BnbUsdc,
    BnbUsdt,
    BchUsdt,
    BtcUsdc,
    BtcUsdt,
    CfxUsdt,
    DogeUsdc,
    DogeUsdt,
    EgldUsdt,
    EnaUsdt,
    EthUsdc,
    EthUsdt,
    EthBusd,
    FilUsdc,
    IcpUsdt,
    LinkUsdc,
    LinkUsdt,
    LtcUsdc,
    LtcUsdt,
    MaticUsdc,
    MaticUsdt,
    SolUsdc,
    SolUsdt,
    DotBusd,
    DotUsdt,
    XrpUsdc,
    XrpUsdt,
    PenguUsdt,
}

impl fmt::Display for WebSocketSymbol {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let symbol: &'static str = match self {
            WebSocketSymbol::AdaUsdc => "adausdc",
            WebSocketSymbol::AdaUsdt => "adausdt",
            WebSocketSymbol::AvaxUsdc => "avaxusdc",
            WebSocketSymbol::AvaxUsdt => "avaxusdt",
            WebSocketSymbol::BnbUsdc => "bnbusdc",
            WebSocketSymbol::BnbUsdt => "bnbusdt",
            WebSocketSymbol::BchUsdt => "bchusdt",
            WebSocketSymbol::BtcUsdc => "btcusdc",
            WebSocketSymbol::BtcUsdt => "btcusdt",
            WebSocketSymbol::CfxUsdt => "cfxusdt",
            WebSocketSymbol::DogeUsdc => "dogeusdc",
            WebSocketSymbol::DogeUsdt => "dogeusdt",
            WebSocketSymbol::EnaUsdt => "enausdt",
            WebSocketSymbol::EgldUsdt => "egldusdt",
            WebSocketSymbol::EthUsdc => "ethusdc",
            WebSocketSymbol::EthUsdt => "ethusdt",
            WebSocketSymbol::EthBusd => "ethbusd",
            WebSocketSymbol::FilUsdc => "filusdc",
            WebSocketSymbol::IcpUsdt => "icpusdt",
            WebSocketSymbol::LinkUsdc => "linkusdc",
            WebSocketSymbol::LinkUsdt => "linkusdt",
            WebSocketSymbol::LtcUsdc => "ltcusdc",
            WebSocketSymbol::LtcUsdt => "ltcusdt",
            WebSocketSymbol::MaticUsdc => "maticusdc",
            WebSocketSymbol::MaticUsdt => "maticusdt",
            WebSocketSymbol::SolUsdc => "solusdc",
            WebSocketSymbol::SolUsdt => "solusdt",
            WebSocketSymbol::DotBusd => "dotbusd",
            WebSocketSymbol::DotUsdt => "dotusdt",
            WebSocketSymbol::XrpUsdc => "xrpusdc",
            WebSocketSymbol::XrpUsdt => "xrpusdt",
            WebSocketSymbol::PenguUsdt => "penguusdt",
        };
        write!(f, "{}", symbol)
    }
}

pub struct WebSocketParams {
    pub route: String,
}

impl WebSocketParams {
    pub fn new(host: WebSocketHost) -> Self {
        WebSocketParams {
            route: host.as_ref().to_string(),
        }
    }

    pub fn agg_trade(mut self, symbol: WebSocketSymbol) -> Self {
        self.route
            .push_str(format!("{}@aggTrade/", symbol).as_str());
        self
    }

    pub fn mark_price(mut self, symbol: WebSocketSymbol, rate: WebSocketStreamRate) -> Self {
        self.route
            .push_str(format!("{}@markPrice@{}/", symbol, rate).as_str());
        self
    }

    pub fn mark_price_all(mut self, rate: WebSocketStreamRate) -> Self {
        self.route
            .push_str(format!("!@markPrice@{}/", rate).as_str());
        self
    }

    pub fn kline_candlesticks(mut self, symbol: WebSocketSymbol, interval: Interval) -> Self {
        self.route
            .push_str(format!("{}@kline_{}/", symbol, interval.as_ref()).as_str());
        self
    }

    pub fn symbol_ticker_mini(mut self, symbol: WebSocketSymbol) -> Self {
        self.route
            .push_str(format!("{}@miniTicker/", symbol).as_str());
        self
    }

    pub fn symbol_ticker_all(mut self) -> Self {
        self.route.push_str("!ticker@arr/");
        self
    }

    pub fn symbol_ticker(mut self, symbol: WebSocketSymbol) -> Self {
        self.route.push_str(format!("{}@ticker/", symbol).as_str());
        self
    }

    pub fn symbol_ticker_all_mini(mut self) -> Self {
        self.route.push_str("!miniTicker@arr/");
        self
    }

    pub fn all_book_tickers(mut self) -> Self {
        self.route.push_str("!bookTicker/");
        self
    }

    pub fn liquidation_order(mut self, symbol: WebSocketSymbol) -> Self {
        self.route
            .push_str(format!("{}@forceOrder/", symbol).as_str());
        self
    }

    pub fn all_market_liquidation_order(mut self) -> Self {
        self.route.push_str("!forceOrder@arr/");
        self
    }

    pub fn partial_book_depth(
        mut self,
        symbol: WebSocketSymbol,
        levels: u8,
        milliseconds: WebSocketStreamRate,
    ) -> Self {
        self.route
            .push_str(format!("{}@depth{}@{}/", symbol, levels, milliseconds).as_str());
        self
    }
}