40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
/// `[head chars]...[tail chars]` middle truncation.
|
|
///
|
|
/// Values too short for the ellipsis to save space are left alone.
|
|
pub fn middle_truncate(value: &str, head: usize, tail: usize) -> String {
|
|
let len = value.chars().count();
|
|
if len <= head + tail + 3 {
|
|
return value.to_string();
|
|
}
|
|
let head: String = value.chars().take(head).collect();
|
|
let tail: String = value.chars().skip(len - tail).collect();
|
|
format!("{head}...{tail}")
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn middle_truncates_long_values_only() {
|
|
assert_eq!(
|
|
middle_truncate(
|
|
"a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d",
|
|
10,
|
|
10,
|
|
),
|
|
"a008def157...ad57a3564d"
|
|
);
|
|
assert_eq!(
|
|
middle_truncate(
|
|
"30617:a008def15796fba9a0d6fab04e8fd57089285d9fd505da5a83fe8aad57a3564d:ngit",
|
|
10,
|
|
10
|
|
),
|
|
"30617:a008...3564d:ngit"
|
|
);
|
|
// Too short to save space with the ellipsis, left alone.
|
|
assert_eq!(middle_truncate("short", 10, 10), "short");
|
|
}
|
|
}
|