pub fn strip_ansi_codes(s: &str) -> String {
let mut result = String::with_capacity(s.len());
let mut chars = s.chars().peekable();
while let Some(c) = chars.next() {
if c == '\x1b' {
if chars.peek() == Some(&'[') {
chars.next();
while let Some(&next) = chars.peek() {
chars.next();
if next.is_ascii_alphabetic() || next == '~' || next == '@' {
break;
}
}
} else if chars.peek() == Some(&']') {
chars.next();
while let Some(&next) = chars.peek() {
if next == '\x07' {
chars.next();
break;
} else if next == '\x1b' {
chars.next();
if chars.peek() == Some(&'\\') {
chars.next();
}
break;
}
chars.next();
}
} else {
chars.next();
}
} else {
result.push(c);
}
}
result
}
#[cfg(test)]
#[path = "string_utils_tests.rs"]
mod tests;