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