55 lines
1.6 KiB
Rust
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)
|
|
}
|