//! `issue [repo]` — print key fields of an issue as JSON. use anyhow::Result; use clap::Args as ClapArgs; use serde_json::{Value, json}; use crate::client::Client; use crate::verbs::print_json; #[derive(ClapArgs)] pub struct Args { /// Issue number. number: u64, /// Repo override. repo: Option, } pub fn run(client: &Client, args: Args) -> Result<()> { let repo = client.repo(args.repo.as_deref()); let v = client.get_json(&format!("/repos/{repo}/issues/{}", args.number))?; let trimmed = json!({ "number": v.get("number"), "title": v.get("title"), "state": v.get("state"), "user": v.get("user").and_then(|u| u.get("login")), "assignees": v.get("assignees") .and_then(Value::as_array) .map(|a| a.iter().filter_map(|x| x.get("login")).cloned().collect::>()) .unwrap_or_default(), "labels": v.get("labels") .and_then(Value::as_array) .map(|a| a.iter().filter_map(|x| x.get("name")).cloned().collect::>()) .unwrap_or_default(), "body": v.get("body"), }); print_json(&trimmed) }