use std::io::Write;
use anyhow::{anyhow, Result};
use clap::Args;
use serde_json::{json, Map, Value};
use crate::client;
#[derive(Debug, Args)]
pub struct ApiArgs {
pub query: String,
#[arg(long = "var", value_name = "KEY=VALUE")]
pub vars: Vec<String>,
}
pub fn run(args: ApiArgs) -> Result<()> {
let (cli, _cfg) = client::authenticated()?;
let mut vars = Map::new();
for raw in &args.vars {
let (k, v) = raw
.split_once('=')
.ok_or_else(|| anyhow!("expected `KEY=VALUE`, got `{raw}`"))?;
let parsed =
serde_json::from_str::<Value>(v).unwrap_or_else(|_| Value::String(v.to_string()));
vars.insert(k.to_string(), parsed);
}
let result = cli.execute_raw(&args.query, json!(vars))?;
let mut stdout = std::io::stdout().lock();
stdout.write_all(serde_json::to_string_pretty(&result)?.as_bytes())?;
stdout.write_all(b"\n")?;
Ok(())
}