1use anyhow::{Result, bail};
2use clap_complete::engine::ArgValueCompleter;
3
4use crate::commands::Run;
5use crate::completions;
6use crate::git;
7use crate::providers::{detect_provider, review_provider};
8use crate::style;
9
10#[derive(Debug, clap::Args)]
12pub struct View {
13 #[arg(add = ArgValueCompleter::new(completions::branch_candidates))]
14 branch: Option<String>,
15}
16
17impl Run for View {
18 fn run(self) -> Result<()> {
19 view(self.branch.as_deref())
20 }
21}
22
23fn view(branch: Option<&str>) -> Result<()> {
24 let branch = branch
25 .map(str::to_owned)
26 .map_or_else(git::current_branch, Ok)?;
27 let provider = detect_provider()?;
28 let review_provider = review_provider(provider.kind);
29
30 let Some(review) = review_provider.review_for_branch_including_closed(&branch)? else {
32 bail!(
33 "no {} review found for {branch}; submit it first with `git stk submit`",
34 provider.kind
35 );
36 };
37
38 anstream::println!(
39 "opening {} {} {}",
40 review.id,
41 style::state(&review.state),
42 style::dim(&review.url)
43 );
44 let output = review_provider.open_review(&review)?;
45 if !output.is_empty() {
46 println!("{output}");
47 }
48 Ok(())
49}