1use crate::error::Result;
2use crate::repo::Repo;
3use std::io::Write;
4
5pub fn repo_url(host: &str, repo: &Repo) -> String {
6 format!("https://{host}/{}/{}", repo.owner, repo.name)
7}
8
9pub fn pull_url(host: &str, repo: &Repo, number: i64) -> String {
10 format!("{}/pulls/{number}", repo_url(host, repo))
11}
12
13pub fn issue_url(host: &str, repo: &Repo, ident: &str) -> String {
14 format!("{}/issues/{ident}", repo_url(host, repo))
15}
16
17pub fn release_url(host: &str, repo: &Repo, tag: &str) -> String {
18 format!("{}/releases/tag/{tag}", repo_url(host, repo))
19}
20
21pub fn open_or_print(url: &str) -> Result<()> {
24 match open::that(url) {
25 Ok(()) => Ok(()),
26 Err(_) => {
27 let mut out = std::io::stdout().lock();
28 writeln!(out, "{url}")?;
29 Ok(())
30 }
31 }
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37 use crate::repo::Repo;
38
39 fn repo() -> Repo {
40 Repo {
41 owner: "oschina".into(),
42 name: "gitee-cli".into(),
43 }
44 }
45
46 #[test]
47 fn builds_ticket_url_shapes() {
48 let r = repo();
49 assert_eq!(
50 repo_url("gitee.com", &r),
51 "https://gitee.com/oschina/gitee-cli"
52 );
53 assert_eq!(
54 pull_url("gitee.com", &r, 12),
55 "https://gitee.com/oschina/gitee-cli/pulls/12"
56 );
57 assert_eq!(
58 issue_url("gitee.com", &r, "I6D3AV"),
59 "https://gitee.com/oschina/gitee-cli/issues/I6D3AV"
60 );
61 assert_eq!(
62 release_url("gitee.com", &r, "v1.2.3"),
63 "https://gitee.com/oschina/gitee-cli/releases/tag/v1.2.3"
64 );
65 }
66}