1use crate::core::Parser;
2use crate::utils::Utils;
3use regex::Regex;
4
5impl Parser {
6 pub fn login<'a>(&self, input: &'a str) -> (Option<&'a str>, Option<&'a str>) {
17 let input = Utils::substring_after_scheme(self, input);
18 let input = match input.find('/') {
19 Some(pos) => &input[..pos],
20 None => input,
21 };
22
23 let re = Regex::new(r"(.*)@(.*).*").unwrap();
24 let caps = re.captures(input);
25 if caps.is_none() {
26 return (None, None);
27 }
28
29 let caps = caps.unwrap();
30 let user_with_pass = caps.get(1).unwrap().as_str();
31 let (user, pass) = match user_with_pass.find(':') {
32 Some(v) => (Some(&user_with_pass[..v]), Some(&user_with_pass[v + 1..])),
33 None => (Some(user_with_pass), None),
34 };
35 (user, pass)
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn test_login_works_when_full_url_with_login() {
45 let input =
46 "https://user:pass@www.example.co.uk:443/blog/article/search?docid=720&hl=en#dayone";
47 let expected = (Some("user"), Some("pass"));
48 let result = Parser::new(None).login(input);
49 assert_eq!(result, expected);
50 }
51
52 #[test]
53 fn test_login_works_when_full_url_no_port() {
54 let input =
55 "https://user:pass@www.example.co.uk/blog/article/search?docid=720&hl=en#dayone";
56 let expected = (Some("user"), Some("pass"));
57 let result = Parser::new(None).login(input);
58 assert_eq!(result, expected);
59 }
60
61 #[test]
62 fn test_login_works_when_full_url_no_port_no_path() {
63 let input = "https://user:pass@www.example.co.uk";
64 let expected = (Some("user"), Some("pass"));
65 let result = Parser::new(None).login(input);
66 assert_eq!(result, expected);
67 }
68
69 #[test]
70 fn test_login_works_when_user_only() {
71 let input = "https://user@www.example.co.uk:443/blog/article/search?docid=720&hl=en#dayone";
72 let expected = (Some("user"), None);
73 let result = Parser::new(None).login(input);
74 assert_eq!(result, expected);
75 }
76
77 #[test]
78 fn test_login_works_when_user_only_no_port_no_path() {
79 let input = "https://user@www.example.co.uk";
80 let expected = (Some("user"), None);
81 let result = Parser::new(None).login(input);
82 assert_eq!(result, expected);
83 }
84
85 #[test]
86 fn test_login_works_when_git_user() {
87 let input = "git@github.com:mihaigalos/url-parse.git";
88 let expected = (Some("git"), None);
89 let result = Parser::new(None).login(input);
90 assert_eq!(result, expected);
91 }
92
93 #[test]
94 fn test_login_works_when_no_login() {
95 let input = "https://www.example.co.uk:443/blog/article/search?docid=720&hl=en#dayone";
96 let expected = (None, None);
97 let result = Parser::new(None).login(input);
98 assert_eq!(result, expected);
99 }
100}