nerf_dart/
lib.rs

1pub fn to_nerf_dart(uri: &str) -> String {
2    let parsed = url::Url::parse(uri).unwrap();
3
4    // Remove unwanted components
5    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}