From dc4e407ddf5cf23eb2187fd400100fe12a8a4b44 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 25 Jul 2019 01:48:45 +0800 Subject: [PATCH] add str boundary check --- src/main.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index d27ece2..2518eb2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,18 @@ fn get_term_width() -> Option { } } +// thanks https://blog.csdn.net/star_xiong/article/details/89401149 +fn find_char_boundary(s: &str, index: usize) -> usize { + if s.len() <= index { + return index; + } + let mut new_index = index; + while !s.is_char_boundary(new_index) { + new_index += 1; + } + new_index +} + fn get_term_width_message(message: &str, left: usize) -> String { match get_term_width() { None => message.to_string(), @@ -39,9 +51,9 @@ fn get_term_width_message(message: &str, left: usize) -> String { return message.to_string(); } let mut s = String::new(); - s.push_str(&message[0..w-10-5-left]); + s.push_str(&message[0..find_char_boundary(&message, w-10-5-left)]); s.push_str("[...]"); - s.push_str(&message[len-10..]); + s.push_str(&message[find_char_boundary(&message, len-10)..]); s }, }