1pub fn to_nerf_dart(uri: &str) -> String {
2 let parsed = url::Url::parse(uri).unwrap();
3
4 let host = parsed.host_str().unwrap_or_default();
6 let port = parsed.port().map(|p| format!(":{}", p)).unwrap_or_default();
7
8 let mut path = parsed.path_segments().unwrap().map(|s|s.to_string()).collect::<Vec<String>>();
9
10 if let Some(last) = path.last() {
11 if !last.is_empty() {
12 path.pop();
13 path.push("".to_string());
14 }
15 }
16
17 let mut path = path.join("/");
18 if !path.starts_with("/") {
19 path.insert(0, '/');
20 }
21
22 let final_url = format!("//{}{}{}", host, port, path);
23
24 final_url
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 fn valid_nerf_dart(uri: &str, valid: Option<&str>) {
32 let valid = valid.unwrap_or("//registry.npmjs.org/");
33
34 assert_eq!(to_nerf_dart(uri), valid);
35 }
36
37 #[test]
38 fn nerf_date_runs() {
39 valid_nerf_dart("http://registry.npmjs.org", None);
40 valid_nerf_dart("http://registry.npmjs.org/some-package", None);
41 valid_nerf_dart("http://registry.npmjs.org/some-package?write=true", None);
42 valid_nerf_dart("http://user:pass@registry.npmjs.org/some-package?write=true", None);
43 valid_nerf_dart("http://registry.npmjs.org/#random-hash", None);
44 valid_nerf_dart("http://registry.npmjs.org/some-package#random-hash", None);
45 }
46
47 #[test]
48 fn couch_nerf_dart() {
49 valid_nerf_dart("http://relative.couchapp.npm:8080/design/-/rewrite/", Some("//relative\
50 .couchapp.npm:8080/design/-/rewrite/"));
51 valid_nerf_dart("http://relative.couchapp.npm:8080/design/-/rewrite/", Some("//relative.couchapp.npm:8080/design/-/rewrite/"))
52 }
53
54 #[test]
55 fn couch_nerf_dart_2() {
56 valid_nerf_dart("http://relative.couchapp.npm:8080/design/-/rewrite/some-package",
57 Some("//relative.couchapp.npm:8080/design/-/rewrite/"));
58 }
59}