1use crate::core::scheme_separator::SchemeSeparator;
2use crate::core::Parser;
3impl Parser {
4 pub fn scheme<'a>(&self, input: &'a str) -> Option<(&'a str, SchemeSeparator)> {
25 let split: Vec<&str> = input.split("://").collect();
26
27 if split.len() == 2 {
28 return Some((split[0], SchemeSeparator::ColonSlashSlash));
29 };
30
31 let split: Vec<&str> = input.split(':').collect();
32 let scheme = self
33 .port_mappings
34 .keys()
35 .find(|&protocol| &split[0] == protocol)?;
36 Some((scheme, SchemeSeparator::Colon))
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn test_parse_scheme_works_when_simple_address() {
46 use crate::core::defaults::*;
47 for (protocol, _) in default_port_mappings().iter() {
48 let address = &format!("{}{}", protocol, "foo.bar");
49 let url = Parser::new(None).parse(address);
50 assert!(url.is_ok());
51 }
52 }
53
54 #[test]
55 fn test_scheme_works_when_typical() {
56 let input = "https://www.example.co.uk:443/blog/article/search?docid=720&hl=en#dayone";
57 let scheme = Parser::new(None).scheme(input);
58 assert_eq!(scheme.unwrap().0, "https");
59 }
60
61 #[test]
62 fn test_scheme_works_when_no_port() {
63 let input = "https://www.example.co.uk/blog/article/search?docid=720&hl=en#dayone";
64 let scheme = Parser::new(None).scheme(input);
65 assert_eq!(scheme.unwrap().0, "https");
66 }
67
68 #[test]
69 fn test_scheme_works_when_no_scheme() {
70 let input = "www.example.co.uk/blog/article/search?docid=720&hl=en#dayone";
71 let scheme = Parser::new(None).scheme(input);
72 assert!(scheme.is_none());
73 }
74
75 #[test]
76 fn test_scheme_works_when_no_double_slashes() {
77 let input = "https:www.example.co.uk/blog/article/search?docid=720&hl=en#dayone";
78 let scheme = Parser::new(None).scheme(input);
79 assert_eq!(scheme.unwrap().0, "https");
80 }
81}