diff --git a/crates/util/src/util.rs b/crates/util/src/util.rs index 80e4a1b316d767fb26d7fb248a6d23fca868c82a..882e1d704baddc771bcdf0d7980a6a0173730b58 100644 --- a/crates/util/src/util.rs +++ b/crates/util/src/util.rs @@ -534,9 +534,8 @@ pub struct NumericPrefixWithSuffix<'a>(i32, &'a str); impl<'a> NumericPrefixWithSuffix<'a> { pub fn from_numeric_prefixed_str(str: &'a str) -> Option { - let mut chars = str.chars(); - let prefix: String = chars.by_ref().take_while(|c| c.is_ascii_digit()).collect(); - let remainder = chars.as_str(); + let i = str.chars().take_while(|c| c.is_ascii_digit()).count(); + let (prefix, remainder) = str.split_at(i); match prefix.parse::() { Ok(prefix) => Some(NumericPrefixWithSuffix(prefix, remainder)), @@ -617,6 +616,33 @@ mod tests { assert_eq!(truncate_and_trailoff("èèèèèè", 5), "èèèèè…"); } + #[test] + fn test_numeric_prefix_str_method() { + let target = "1a"; + assert_eq!( + NumericPrefixWithSuffix::from_numeric_prefixed_str(target), + Some(NumericPrefixWithSuffix(1, "a")) + ); + + let target = "12ab"; + assert_eq!( + NumericPrefixWithSuffix::from_numeric_prefixed_str(target), + Some(NumericPrefixWithSuffix(12, "ab")) + ); + + let target = "12_ab"; + assert_eq!( + NumericPrefixWithSuffix::from_numeric_prefixed_str(target), + Some(NumericPrefixWithSuffix(12, "_ab")) + ); + + let target = "1_2ab"; + assert_eq!( + NumericPrefixWithSuffix::from_numeric_prefixed_str(target), + Some(NumericPrefixWithSuffix(1, "_2ab")) + ); + } + #[test] fn test_numeric_prefix_with_suffix() { let mut sorted = vec!["1-abc", "10", "11def", "2", "21-abc"];