use std::time::Duration;
use alpaca_sdk::data::{CryptoDataStream, CryptoFeed, StreamMessage};
use alpaca_sdk::{Credentials, Result};
use futures_util::StreamExt as _;
#[tokio::main]
async fn main() -> Result<()> {
let mut stream = CryptoDataStream::new(Credentials::from_env()?, CryptoFeed::Us)?;
stream.subscribe_trades(["BTC/USD", "ETH/USD"]);
let mut messages = Box::pin(stream.run());
let mut seen = 0_usize;
let outcome = tokio::time::timeout(Duration::from_secs(30), async {
while let Some(message) = messages.next().await {
match message {
Ok(StreamMessage::Subscription(subs)) => {
println!("subscribed to trades: {:?}", subs.trades);
}
Ok(StreamMessage::Trade(trade)) => {
println!(
"{} {} @ {} size={}",
trade.timestamp, trade.symbol, trade.price, trade.size
);
seen += 1;
if seen >= 5 {
return;
}
}
Ok(StreamMessage::Error(error)) => println!("server said: {error:?}"),
Ok(_) => {}
Err(error) => {
println!("stream error: {error}");
return;
}
}
}
})
.await;
println!("\n{seen} trade(s); timed out: {}", outcome.is_err());
Ok(())
}