use crate::Result;
use comfy_table::Table;
pub fn print_table(table: Table) -> Result<()> {
let table = table.to_string();
for line in table.lines() {
println!("{}", trim_ansi_line(line));
}
Ok(())
}
fn trim_ansi_line(line: &str) -> String {
let s = line.trim_start();
if s.is_empty() {
return String::new();
}
let plain = console::strip_ansi_codes(s);
let visible_end = plain.trim_end().chars().count();
let mut result = String::with_capacity(s.len());
let mut visible = 0usize;
let mut chars = s.chars().peekable();
while let Some(ch) = chars.next() {
if ch == '\x1b' {
result.push(ch);
if matches!(chars.peek(), Some('[')) {
result.push(chars.next().unwrap());
for c in chars.by_ref() {
result.push(c);
if c.is_ascii() && (0x40..=0x7e).contains(&(c as u8)) {
break;
}
}
} else {
if let Some(c) = chars.next() {
result.push(c);
}
}
} else {
if visible >= visible_end {
continue;
}
result.push(ch);
visible += 1;
}
}
result
}