Opinionated Android 15+ Linux Terminal Setup
android
linux
command-line-tools
1use url::Url;
2
3pub fn extract_repo_name(url: &str) -> Option<String> {
4 let parsed = Url::parse(url).ok()?;
5 let mut segments = parsed.path_segments()?;
6 let username = segments.next()?;
7 let mut repo = segments.next()?;
8
9 if let Some(stripped) = repo.strip_suffix(".git") {
10 repo = stripped;
11 }
12
13 Some(format!("{}-{}", username, repo))
14}
15
16pub fn extract_version(url: &str) -> (String, Option<String>) {
17 let repo_name = url.replace("https://tangled.sh/", "").replace("@", "");
18 match url.rfind('@') {
19 Some(idx) => {
20 let (repo, version) = url.split_at(idx);
21 let version = &version[1..];
22 match version == repo_name {
23 true => (url.to_string(), None),
24 false => (repo.to_string(), Some(version.to_string())),
25 }
26 }
27 None => (url.to_string(), None),
28 }
29}
30
31#[cfg(test)]
32mod tests {
33
34 use super::*;
35
36 #[test]
37 fn test_extract_repo_name() {
38 let url = "https://github.com/tsirysndr/pkgs.git";
39 let expected = Some("tsirysndr-pkgs".into());
40 let result = extract_repo_name(url);
41 assert_eq!(result, expected);
42 }
43
44 #[test]
45 fn test_extract_repo_name_no_git() {
46 let url = "https://github.com/tsirysndr/pkgs";
47 let expected = Some("tsirysndr-pkgs".into());
48 let result = extract_repo_name(url);
49 assert_eq!(result, expected);
50 }
51
52 #[test]
53 fn test_extract_repo_name_invalid_url() {
54 let url = "invalid-url";
55 let expected = None;
56 let result = extract_repo_name(url);
57 assert_eq!(result, expected);
58 }
59}