//! `pr-request-review [--remove]` — add or remove a //! requested reviewer on a PR. Unlike `assign` (assignees, mutate + //! PATCH the issue) Forgejo has a dedicated endpoint pair for review //! requests: `POST /repos/{repo}/pulls/{index}/requested_reviewers` //! adds, `DELETE` (same path + body) removes. Requesting a review from //! a user who is already requested is a Forgejo-side no-op, so the verb //! is idempotent in both directions. use anyhow::Result; use clap::Args as ClapArgs; use serde_json::json; use crate::client::Client; #[derive(ClapArgs)] pub struct Args { /// PR number. pub(crate) number: u64, /// User login to request a review from (or withdraw with `--remove`). user: String, /// Withdraw the review request instead of adding it. #[arg(long)] remove: bool, } pub fn run(client: &Client, args: Args) -> Result<()> { let repo = client.repo(); let path = format!("/repos/{repo}/pulls/{}/requested_reviewers", args.number); let body = json!({ "reviewers": [args.user] }); if args.remove { client.delete(&path, Some(&body))?; println!( "review request withdrawn: {} on #{}", args.user, args.number ); } else { client.post_json(&path, &body)?; println!("review requested: {} on #{}", args.user, args.number); } Ok(()) }