pub fn merge_multi_categories(text: &mut String) {
let mut indices = vec![];
let mut first = true;
for (idx, ch) in text.char_indices().rev() {
if ch != ':' {
continue;
}
if first {
first = false;
continue;
}
indices.push(idx);
}
for idx in indices {
text.replace_range(idx..idx + 1, "-");
}
}
#[test]
fn test_multi_category() {
macro_rules! check {
($input:expr, $expected:expr $(,)?) => {{
let mut text = str!($input);
merge_multi_categories(&mut text);
assert_eq!(
text, $expected,
"Merged multiple categories doesn't match expected",
);
}};
}
check!("", "");
check!("alpha", "alpha");
check!("alpha:beta", "alpha:beta");
check!("alpha:beta:gamma", "alpha-beta:gamma");
check!("alpha:beta:gamma:delta", "alpha-beta-gamma:delta");
check!(
"alpha:beta:gamma:delta:epsilon",
"alpha-beta-gamma-delta:epsilon",
);
check!(
"alpha:beta:gamma:delta:epsilon:zeta",
"alpha-beta-gamma-delta-epsilon:zeta",
);
check!(
"alpha:beta:gamma:delta:epsilon:zeta:eta",
"alpha-beta-gamma-delta-epsilon-zeta:eta",
);
}