From 2c8618b757c472cfed1e31e714b46fd41dcc7e29 Mon Sep 17 00:00:00 2001 From: Jeremy Andrews Date: Mon, 30 Oct 2023 17:33:40 +0100 Subject: [PATCH] don't panic when truncating non-utf8 --- src/util.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/util.rs b/src/util.rs index 746321b0..403024eb 100644 --- a/src/util.rs +++ b/src/util.rs @@ -247,14 +247,15 @@ pub fn median( /// // All characters are returned as the string is less than 15 characters long. /// assert_eq!(util::truncate_string("shorter string", 15), "shorter string"); /// ``` -pub fn truncate_string(str_to_truncate: &str, max_length: u64) -> String { - let mut string_to_truncate = str_to_truncate.to_string(); - if string_to_truncate.len() as u64 > max_length { - let truncated_length = max_length - 2; - string_to_truncate.truncate(truncated_length as usize); - string_to_truncate += ".."; +pub fn truncate_string(str_to_truncate: &str, max_length: usize) -> String { + if str_to_truncate.char_indices().count() > max_length { + match str_to_truncate.char_indices().nth(max_length - 2) { + None => str_to_truncate.to_string(), + Some((idx, _)) => format!("{}..", &str_to_truncate[..idx]), + } + } else { + str_to_truncate.to_string() } - string_to_truncate } /// Determine if a timer expired, with second granularity. @@ -561,6 +562,8 @@ mod tests { assert_eq!(truncate_string("abcde", 4), "ab.."); assert_eq!(truncate_string("abcde", 3), "a.."); assert_eq!(truncate_string("abcde", 2), ".."); + assert_eq!(truncate_string("これはテストだ", 10), "これはテストだ"); + assert_eq!(truncate_string("これはテストだ", 3), "こ.."); } #[tokio::test]