//! `close ` — close an issue or PR. use anyhow::Result; use clap::Args as ClapArgs; use serde_json::json; use crate::client::{Client, index}; use crate::verbs::print_json; #[derive(ClapArgs)] pub struct Args { /// Issue or PR number. pub(crate) number: u64, } pub fn run(client: &Client, args: Args) -> Result<()> { let (owner, name) = client.owner_repo()?; let resp = client .api() .issue_edit_issue(owner, name, index(args.number)?, state_edit("closed")) .send()?; print_json(&json!({ "number": resp.number, "state": resp.state, })) } /// An `EditIssueOption` that only sets `state` — shared by `close` / /// `reopen` (the null fields ride along and Forgejo treats them as /// "leave unchanged"). pub(crate) fn state_edit(state: &str) -> forgejo_api::structs::EditIssueOption { forgejo_api::structs::EditIssueOption { assignee: None, assignees: None, body: None, due_date: None, milestone: None, r#ref: None, state: Some(state.to_owned()), title: None, unset_due_date: None, updated_at: None, } }