use std::time::Duration;
use kiteconnect_rs::ticker::{Mode, Ticker, TickerEvent};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let (ticker, handle) = Ticker::builder("<api_key>", "<access_token>")
.auto_reconnect(true)
.reconnect_max_retries(10)
.connect_timeout(Duration::from_secs(10))
.build()?;
let mut event_receiver = handle.subscribe_events();
let event_handle_clone = handle.clone();
let serve_task = tokio::spawn(async move {
if let Err(e) = ticker.serve().await {
eprintln!("Ticker serve error: {}", e);
}
});
let event_task = tokio::spawn(async move {
while let Ok(event) = event_receiver.recv().await {
match event {
TickerEvent::Connect => {
println!("Connected! Subscribing to instruments...");
let tokens = vec![256265, 738561];
if let Err(e) = event_handle_clone.subscribe(tokens.clone()).await {
eprintln!("Subscribe error: {}", e);
} else {
println!("Subscribed to tokens: {:?}", tokens);
}
if let Err(e) = event_handle_clone
.set_mode(Mode::Full, tokens.clone())
.await
{
eprintln!("Set mode error: {}", e);
}
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
let more_tokens = vec![341249]; if let Err(e) = event_handle_clone.subscribe(more_tokens.clone()).await {
eprintln!("Subscribe error: {}", e);
} else {
println!("Added more subscriptions: {:?}", more_tokens);
}
}
TickerEvent::Tick(tick) => {
println!(
"Tick: {} - Price: {:.2}, Volume: {}",
tick.instrument_token, tick.last_price, tick.volume_traded
);
}
TickerEvent::Error(e) => {
eprintln!("Error: {}", e);
}
TickerEvent::Close(code, reason) => {
println!("Connection closed: {} - {}", code, reason);
break;
}
TickerEvent::Reconnect(attempt, delay) => {
println!("Reconnecting (attempt {}), waiting {:?}...", attempt, delay);
}
_ => {}
}
}
});
tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
println!("Unsubscribing from token 341249...");
if let Err(e) = handle.unsubscribe(vec![341249]).await {
eprintln!("Unsubscribe error: {}", e);
}
println!("Changing mode to Quote for remaining tokens...");
if let Err(e) = handle.set_mode(Mode::Quote, vec![256265, 738561]).await {
eprintln!("Set mode error: {}", e);
}
tokio::select! {
_ = serve_task => println!("Serve task completed"),
_ = event_task => println!("Event handler completed"),
}
Ok(())
}