//! `pr assign-reviewer [--remove]` — add or remove a //! requested reviewer on a PR. Unlike `pr assign-committer` (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 forgejo_api::structs::PullReviewRequestOptions; use crate::client::{Client, index}; #[derive(ClapArgs)] pub struct Args { /// PR number. 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 (owner, name) = client.owner_repo()?; let idx = index(args.number)?; let body = PullReviewRequestOptions { reviewers: Some(vec![args.user.clone()]), team_reviewers: None, }; if args.remove { client .api() .repo_delete_pull_review_requests(owner, name, idx, body) .send()?; println!( "review request withdrawn: {} on #{}", args.user, args.number ); } else { client .api() .repo_create_pull_review_requests(owner, name, idx, body) .send()?; println!("review requested: {} on #{}", args.user, args.number); } Ok(()) }