Skip to main content

gitee_cli_rs/
web.rs

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
21/// Open `url` in a browser when possible; on failure (headless / no opener)
22/// print the URL and succeed.
23pub 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}