codeberg_cli/actions/pull_request/
comment.rs

1use super::display_pull_request;
2use crate::actions::text_manipulation::select_prompt_for;
3use crate::actions::GeneralArgs;
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 anyhow::Context;
10use clap::Parser;
11use forgejo_api::structs::{CreateIssueCommentOption, PullRequest, RepoListPullRequestsQuery};
12
13/// Add comment to selected pull request
14#[derive(Parser, Debug)]
15pub struct CommentPullRequestArgs {}
16
17impl CommentPullRequestArgs {
18    pub async fn run(self, general_args: GeneralArgs) -> anyhow::Result<()> {
19        let _ = general_args;
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        tracing::debug!("{comment:?}");
41
42        Ok(())
43    }
44}
45
46async fn create_options(
47    ctx: &BergContext<CommentPullRequestArgs>,
48    pull_request: &PullRequest,
49) -> anyhow::Result<CreateIssueCommentOption> {
50    let body = ctx.editor_for(
51        "a comment",
52        format!(
53            "Write a comment for pull_request \"{}\"",
54            option_display(&pull_request.title)
55        )
56        .as_str(),
57    )?;
58
59    Ok(CreateIssueCommentOption {
60        body,
61        updated_at: None,
62    })
63}
64
65async fn select_pull_request(
66    ctx: &BergContext<CommentPullRequestArgs>,
67) -> anyhow::Result<PullRequest> {
68    let OwnerRepo { owner, repo } = ctx.owner_repo()?;
69    let pull_requests_list = spin_until_ready(ctx.client.repo_list_pull_requests(
70        owner.as_str(),
71        repo.as_str(),
72        RepoListPullRequestsQuery::default(),
73    ))
74    .await?;
75
76    fuzzy_select_with_key(
77        &pull_requests_list,
78        select_prompt_for("pull request"),
79        display_pull_request,
80    )
81    .cloned()
82}