use std::sync::Arc;
use anyhow::{Context, Result, bail};
use clap::Parser;
use questrade_client::{OnTokenRefresh, QuestradeClient, TokenManager};
#[derive(Parser)]
#[command(name = "dump_responses")]
struct Args {
#[arg(long, env = "QUESTRADE_REFRESH_TOKEN")]
refresh_token: String,
#[arg(long, default_value_t = false)]
practice: bool,
#[arg(long, value_parser = ["time", "markets", "accounts"])]
endpoint: String,
#[arg(long)]
account_id: Option<String>,
#[arg(long)]
symbol_id: Option<u64>,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter("questrade_client=debug")
.with_writer(std::io::stderr)
.init();
let args = Args::parse();
let on_refresh: OnTokenRefresh = Arc::new(|token| {
eprintln!("--- Token rotated. Run this to update: ---");
eprintln!("export QUESTRADE_REFRESH_TOKEN={}", token.refresh_token);
});
let tm = TokenManager::new(args.refresh_token, args.practice, Some(on_refresh), None)
.await
.context("Failed to create token manager")?;
let client = QuestradeClient::new(tm)?;
let path = match args.endpoint.as_str() {
"time" => "/time".to_string(),
"markets" => "/markets".to_string(),
"accounts" => "/accounts".to_string(),
other => bail!("Unknown endpoint: {other}"),
};
let text = client.get_text(&path).await?;
println!("{text}");
Ok(())
}