runtime-cli 0.1.0

Command-line client for managing git projects on Runtime
Documentation
//! `runtime api '<query>'` — escape hatch for arbitrary GraphQL.
//!
//! Accepts an optional list of `--var key=value` pairs that compose
//! the `variables` object. Values are parsed as JSON first; on parse
//! failure they fall back to strings so `--var slug=alice/r1` does the
//! intuitive thing.

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 {
    /// GraphQL query or mutation source.
    pub query: String,
    /// `key=value` variable bindings (repeat for multiple vars).
    #[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(())
}