mod crawlers;
mod msg;
mod utils;
use std::sync::mpsc::Sender;
pub use crawlers::fetch_symbols_retry;
pub use crypto_market_type::MarketType;
pub use crypto_msg_type::MessageType;
pub use msg::*;
pub use utils::get_hot_spot_symbols;
pub async fn crawl_trade(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"binance" => crawlers::binance::crawl_trade(market_type, symbols, tx).await,
"bitmex" => crawlers::bitmex::crawl_trade(market_type, symbols, tx).await,
"deribit" => crawlers::deribit::crawl_trade(market_type, symbols, tx).await,
"bitfinex" | "bitget" | "bithumb" | "bitstamp" | "bitz" | "bybit" | "coinbase_pro"
| "dydx" | "ftx" | "gate" | "huobi" | "kraken" | "kucoin" | "mexc" | "okx" | "zb"
| "zbg" => {
crawlers::crawl_event(exchange, MessageType::Trade, market_type, symbols, tx).await
}
_ => panic!("{} does NOT have the trade websocket channel", exchange),
}
}
pub async fn crawl_l2_event(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"bitmex" => crawlers::bitmex::crawl_l2_event(market_type, symbols, tx).await,
"huobi" => crawlers::huobi::crawl_l2_event(market_type, symbols, tx).await,
"binance" | "bitfinex" | "bitget" | "bithumb" | "bitstamp" | "bitz" | "bybit"
| "coinbase_pro" | "deribit" | "dydx" | "ftx" | "gate" | "kraken" | "kucoin" | "mexc"
| "okx" | "zb" | "zbg" => {
crawlers::crawl_event(exchange, MessageType::L2Event, market_type, symbols, tx).await
}
_ => panic!(
"{} does NOT have the incremental level2 websocket channel",
exchange
),
}
}
pub async fn crawl_l3_event(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"bitfinex" | "bitstamp" | "coinbase_pro" | "kucoin" => {
crawlers::crawl_event(exchange, MessageType::L3Event, market_type, symbols, tx).await
}
_ => panic!(
"{} does NOT have the incremental level3 websocket channel",
exchange
),
}
}
pub fn crawl_l2_snapshot(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
crawlers::crawl_snapshot(exchange, market_type, MessageType::L2Snapshot, symbols, tx);
}
pub async fn crawl_bbo(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"binance" => crawlers::binance::crawl_bbo(market_type, symbols, tx).await,
"bitmex" => crawlers::bitmex::crawl_bbo(market_type, symbols, tx).await,
"kucoin" => crawlers::kucoin::crawl_bbo(market_type, symbols, tx).await,
"deribit" | "ftx" | "gate" | "huobi" | "kraken" | "okx" => {
crawlers::crawl_event(exchange, MessageType::BBO, market_type, symbols, tx).await
}
_ => panic!("{} does NOT have BBO websocket channel", exchange),
}
}
pub async fn crawl_l2_topk(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"bitmex" => crawlers::bitmex::crawl_l2_topk(market_type, symbols, tx).await,
"binance" | "bitget" | "bybit" | "bitstamp" | "deribit" | "huobi" | "kucoin" | "mexc"
| "okx" | "zb" => {
crawlers::crawl_event(exchange, MessageType::L2TopK, market_type, symbols, tx).await
}
_ => panic!(
"{} does NOT have the level2 top-k snapshot websocket channel",
exchange
),
}
}
pub fn crawl_l3_snapshot(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
crawlers::crawl_snapshot(exchange, market_type, MessageType::L3Snapshot, symbols, tx)
}
pub async fn crawl_ticker(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"binance" => crawlers::binance::crawl_ticker(market_type, symbols, tx).await,
"bitfinex" | "bitget" | "bithumb" | "bitz" | "bybit" | "coinbase_pro" | "deribit"
| "gate" | "huobi" | "kraken" | "kucoin" | "mexc" | "okx" => {
crawlers::crawl_event(exchange, MessageType::Ticker, market_type, symbols, tx).await
}
"zb" => crawlers::zb::crawl_ticker(market_type, symbols, tx).await,
"zbg" => crawlers::zbg::crawl_ticker(market_type, symbols, tx).await,
_ => panic!("{} does NOT have the ticker websocket channel", exchange),
}
}
pub async fn crawl_funding_rate(
exchange: &str,
market_type: MarketType,
symbols: Option<&[String]>,
tx: Sender<Message>,
) {
match exchange {
"binance" => crawlers::binance::crawl_funding_rate(market_type, symbols, tx).await,
"bitmex" => crawlers::bitmex::crawl_funding_rate(market_type, symbols, tx).await,
"huobi" => crawlers::huobi::crawl_funding_rate(market_type, symbols, tx).await,
"okx" => crawlers::okx::crawl_funding_rate(market_type, symbols, tx).await,
_ => panic!("{} does NOT have perpetual swap market", exchange),
}
}
pub async fn crawl_candlestick(
exchange: &str,
market_type: MarketType,
symbol_interval_list: Option<&[(String, usize)]>,
tx: Sender<Message>,
) {
match exchange {
"bitmex" => {
crawlers::bitmex::crawl_candlestick(market_type, symbol_interval_list, tx).await
}
"binance" | "bitfinex" | "bitget" | "bitz" | "bybit" | "deribit" | "gate" | "huobi"
| "kraken" | "kucoin" | "mexc" | "okx" | "zb" | "zbg" => {
crawlers::crawl_candlestick_ext(exchange, market_type, symbol_interval_list, tx).await
}
_ => panic!(
"{} does NOT have the candlestick websocket channel",
exchange
),
};
}
pub fn crawl_open_interest(exchange: &str, market_type: MarketType, tx: Sender<Message>) {
crawlers::crawl_open_interest(exchange, market_type, tx);
}
pub async fn subscribe_symbol(
exchange: &str,
market_type: MarketType,
symbol: &str,
msg_types: &[MessageType],
tx: Sender<String>,
) {
let ws_client = crawlers::create_ws_client_symbol(exchange, market_type, tx).await;
let symbols = vec![symbol.to_string()];
let commands = crypto_msg_type::get_ws_commands(exchange, msg_types, &symbols, true, None);
ws_client.send(&commands).await;
ws_client.run().await;
ws_client.close();
}