codeberg_cli/actions/pull_request/
comment.rs1use super::display_pull_request;
2use crate::actions::text_manipulation::select_prompt_for;
3use crate::render::json::JsonToStdout;
4use crate::render::option::option_display;
5use crate::render::spinner::spin_until_ready;
6use crate::render::ui::fuzzy_select_with_key;
7use crate::types::context::BergContext;
8use crate::types::git::OwnerRepo;
9use crate::{actions::GeneralArgs, types::output::OutputMode};
10use anyhow::Context;
11use clap::Parser;
12use forgejo_api::structs::{CreateIssueCommentOption, PullRequest, RepoListPullRequestsQuery};
13
14#[derive(Parser, Debug)]
16pub struct CommentPullRequestArgs {}
17
18impl CommentPullRequestArgs {
19 pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
20 let ctx = BergContext::new(self, general_args).await?;
21
22 let OwnerRepo { owner, repo } = ctx.owner_repo()?;
23 let pull_request = select_pull_request(&ctx).await?;
24 let pull_request_id = pull_request
25 .id
26 .context("Selected milestone doesn't have an ID")?;
27
28 let options = create_options(&ctx, &pull_request).await?;
29
30 let comment = ctx
31 .client
32 .issue_create_comment(
33 owner.as_str(),
34 repo.as_str(),
35 pull_request_id as u64,
36 options,
37 )
38 .await?;
39
40 match general_args.output_mode {
41 OutputMode::Pretty => {
42 tracing::debug!("{comment:?}");
43 }
44 OutputMode::Json => comment.print_json()?,
45 }
46
47 Ok(())
48 }
49}
50
51async fn create_options(
52 ctx: &BergContext<CommentPullRequestArgs>,
53 pull_request: &PullRequest,
54) -> anyhow::Result<CreateIssueCommentOption> {
55 let body = ctx.editor_for(
56 "a comment",
57 format!(
58 "Write a comment for pull_request \"{}\"",
59 option_display(&pull_request.title)
60 )
61 .as_str(),
62 )?;
63
64 Ok(CreateIssueCommentOption {
65 body,
66 updated_at: None,
67 })
68}
69
70async fn select_pull_request(
71 ctx: &BergContext<CommentPullRequestArgs>,
72) -> anyhow::Result<PullRequest> {
73 let OwnerRepo { owner, repo } = ctx.owner_repo()?;
74 let (_, pull_requests_list) = spin_until_ready(ctx.client.repo_list_pull_requests(
75 owner.as_str(),
76 repo.as_str(),
77 RepoListPullRequestsQuery::default(),
78 ))
79 .await?;
80
81 fuzzy_select_with_key(
82 &pull_requests_list,
83 select_prompt_for("pull request"),
84 display_pull_request,
85 )
86 .cloned()
87}