url_parse/core/
login.rs

1use crate::core::Parser;
2use crate::utils::Utils;
3use regex::Regex;
4
5impl Parser {
6    /// Extract the domain fields from the url.
7    ///
8    /// # Example
9    /// ```rust
10    /// use url_parse::core::Parser;
11    /// let input = "https://user:pass@www.example.co.uk";
12    /// let expected = (Some("user"), Some("pass"));
13    /// let result = Parser::new(None).login(input);
14    /// assert_eq!(result, expected);
15    /// ```
16    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}