hyperhive/hive-forge/src/verbs/issue.rs

55 lines
1.6 KiB
Rust

//! `issue <number> [repo]` — print key fields of an issue as JSON.
use anyhow::Result;
use clap::Args as ClapArgs;
use serde_json::json;
use crate::client::{Client, index};
use crate::verbs::{
attachment_json, blocking_summaries, dependency_summaries, issue_reactions, print_json,
};
#[derive(ClapArgs)]
pub struct Args {
/// Issue number.
number: u64,
}
pub fn run(client: &Client, args: Args) -> Result<()> {
let (owner, name) = client.owner_repo()?;
let issue = client
.api()
.issue_get_issue(owner, name, index(args.number)?)
.send()?;
let assignees: Vec<&str> = issue
.assignees
.as_deref()
.unwrap_or_default()
.iter()
.filter_map(|u| u.login.as_deref())
.collect();
let labels: Vec<&str> = issue
.labels
.as_deref()
.unwrap_or_default()
.iter()
.filter_map(|l| l.name.as_deref())
.collect();
let dependencies = dependency_summaries(client, owner, name, args.number)?;
let blocking = blocking_summaries(client, owner, name, args.number)?;
let reactions = issue_reactions(client, owner, name, args.number)?;
let trimmed = json!({
"number": issue.number,
"title": issue.title,
"state": issue.state,
"user": issue.user.as_ref().and_then(|u| u.login.as_deref()),
"assignees": assignees,
"labels": labels,
"dependencies": dependencies,
"blocking": blocking,
"reactions": reactions,
"body": issue.body,
"attachments": attachment_json(issue.assets.as_deref()),
});
print_json(&trimmed)
}