#![allow(clippy::unwrap_used, clippy::expect_used)]
use futures_util::StreamExt;
use rustrade_data::{
exchange::binance::futures::BinanceFuturesUsd,
streams::{Streams, reconnect::stream::ReconnectingStream},
subscriber::WebSocketSubscriber,
subscription::trade::PublicTrades,
};
use rustrade_instrument::instrument::market_data::kind::MarketDataInstrumentKind;
use tracing::{info, warn};
#[rustfmt::skip]
#[tokio::main]
async fn main() {
init_logging();
let streams = Streams::<PublicTrades>::builder()
.subscribe(WebSocketSubscriber, [
(BinanceFuturesUsd::default(), "btc", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
])
.subscribe(WebSocketSubscriber, [
(BinanceFuturesUsd::default(), "eth", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
])
.subscribe(WebSocketSubscriber, [
(BinanceFuturesUsd::default(), "xrp", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
(BinanceFuturesUsd::default(), "sol", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
(BinanceFuturesUsd::default(), "avax", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
(BinanceFuturesUsd::default(), "ltc", "usdt", MarketDataInstrumentKind::Perpetual, PublicTrades),
])
.init()
.await
.unwrap();
let mut joined_stream = streams
.select_all()
.with_error_handler(|error| warn!(?error, "MarketStream generated error"));
while let Some(event) = joined_stream.next().await {
info!("{event:?}");
}
}
fn init_logging() {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::filter::EnvFilter::builder()
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
.from_env_lossy(),
)
.with_ansi(cfg!(debug_assertions))
.json()
.init()
}