1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/// Make a path to a dependency, which aligns to
///
/// - [index from of Cargo's index on filesystem][1], and
/// - [index from Crates.io][2].
///
/// [1]: https://docs.rs/cargo/latest/cargo/sources/registry/index.html#the-format-of-the-index
/// [2]: https://github.com/rust-lang/crates.io-index
pub fn make_dep_path(dep_name: &str, prefix_only: bool) -> String {
let (slash, name) = if prefix_only {
("", "")
} else {
("/", dep_name)
};
match dep_name.len() {
1 => format!("1{}{}", slash, name),
2 => format!("2{}{}", slash, name),
3 => format!("3/{}{}{}", &dep_name[..1], slash, name),
_ => format!("{}/{}{}{}", &dep_name[0..2], &dep_name[2..4], slash, name),
}
}
#[cfg(test)]
mod tests {
use super::make_dep_path;
#[test]
fn prefix_only() {
assert_eq!(make_dep_path("a", true), "1");
assert_eq!(make_dep_path("ab", true), "2");
assert_eq!(make_dep_path("abc", true), "3/a");
assert_eq!(make_dep_path("Abc", true), "3/A");
assert_eq!(make_dep_path("AbCd", true), "Ab/Cd");
assert_eq!(make_dep_path("aBcDe", true), "aB/cD");
}
#[test]
fn full() {
assert_eq!(make_dep_path("a", false), "1/a");
assert_eq!(make_dep_path("ab", false), "2/ab");
assert_eq!(make_dep_path("abc", false), "3/a/abc");
assert_eq!(make_dep_path("Abc", false), "3/A/Abc");
assert_eq!(make_dep_path("AbCd", false), "Ab/Cd/AbCd");
assert_eq!(make_dep_path("aBcDe", false), "aB/cD/aBcDe");
}
}
|