use std::env;
use std::time::Duration;
use tokio::time::sleep;
use dotenv::dotenv;
use onise::error::KrakenResult;
use onise::KrakenClient;
use onise::ws_client::KrakenWsClient;
use onise::ws_models::WsSubscriptionPayload;
#[tokio::main]
async fn main() -> KrakenResult<()> {
let mode = env::args().nth(1).unwrap_or_else(|| "rest".to_string());
match mode.as_str() {
"rest" => run_rest().await,
"ws" => run_ws().await,
other => {
eprintln!("Unknown mode: {}. Usage: cargo run -- [rest|ws]", other);
Ok(())
}
}
}
async fn run_rest() -> KrakenResult<()> {
dotenv().ok();
let api_key = env::var("KRAKEN_API_KEY").ok();
let api_secret = env::var("KRAKEN_API_SECRET").ok();
let client = KrakenClient::new(api_key, api_secret, None);
match client.get_server_time().await {
Ok(server_time) => println!("Server time: {:?}", server_time),
Err(e) => eprintln!("Error: {}", e),
}
match client.get_balance().await {
Ok(balance) => {
println!("Balance: {:?}", balance.balances);
}
Err(e) => {
eprintln!("Error fetching balance: {}", e);
}
}
Ok(())
}
async fn run_ws() -> KrakenResult<()> {
let url = env::var("WS_URL").unwrap_or_else(|_| "wss://ws.kraken.com/v2".to_string());
let token = env::var("KRAKEN_WS_TOKEN").ok();
let client = KrakenWsClient::connect(&url).await?;
if let Some(t) = token {
client.authorize(&t, Some(1)).await?;
}
client.send_ping(Some(2)).await?;
client
.subscribe(
WsSubscriptionPayload::Ticker {
symbol: "XBT/USD".into(),
},
Some(3),
)
.await?;
println!("Connected to {url}. Listening for WS messages...");
loop {
sleep(Duration::from_secs(10)).await;
}
}