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

39 lines
1.3 KiB
Rust

//! `pr <number> [repo]` — print key fields of a PR as JSON.
use anyhow::Result;
use clap::Args as ClapArgs;
use serde_json::json;
use crate::client::{Client, index};
use crate::verbs::{blocking_summaries, dependency_summaries, issue_reactions, print_json};
#[derive(ClapArgs)]
pub struct Args {
/// PR number.
number: u64,
}
pub fn run(client: &Client, args: Args) -> Result<()> {
let (owner, name) = client.owner_repo()?;
let pull = client
.api()
.repo_get_pull_request(owner, name, index(args.number)?)
.send()?;
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": pull.number,
"title": pull.title,
"state": pull.state,
"merged": pull.merged,
"user": pull.user.as_ref().and_then(|u| u.login.as_deref()),
"head_sha": pull.head.as_ref().and_then(|h| h.sha.as_deref()),
"head_branch": pull.head.as_ref().and_then(|h| h.label.as_deref()),
"base_branch": pull.base.as_ref().and_then(|b| b.label.as_deref()),
"dependencies": dependencies,
"blocking": blocking,
"reactions": reactions,
});
print_json(&trimmed)
}