mirror of
https://github.com/nushell/nushell.git
synced 2025-05-07 08:22:58 +00:00
- A few days back I've got this idea regarding recalculus of width. Now it calculates step by step. So 1 loop over all data was removed. All though there's full recalculation in case of `header_on_border` 😞 (can be fixed..... but I decided to be short) In perfect world it also shall be refactored ...... - Also have done small refactoring to switch build table from `Vec<Vec<_>>>` to table itself. To hide internals (kind of still there's things which I don't like). It touched the `--expand` algorithm lightly you can see the tests changes. - And when doing that noticed one more opportunity, to remove HashMap usage and directly use `tabled::ColoredConfig`. Which reduces copy operations and allocations. - And fixed a small issue where trailing column being using deleted column styles.  To conclude optimizations; I did small testing and it's not slower. But I didn't get the faster results either. But I believe it must be faster well in all cases, I think maybe bigger tables must be tested. Maybe someone could have a few runs to compare performance. cc: @fdncred
89 lines
2.0 KiB
Rust
89 lines
2.0 KiB
Rust
use nu_ansi_term::{Color, Style};
|
|
use nu_color_config::TextStyle;
|
|
use nu_table::{NuTable, TableTheme};
|
|
use tabled::grid::records::vec_records::Text;
|
|
|
|
fn main() {
|
|
let args: Vec<_> = std::env::args().collect();
|
|
let mut width = 0;
|
|
|
|
if args.len() > 1 {
|
|
width = args[1].parse::<usize>().expect("Need a width in columns");
|
|
}
|
|
|
|
if width < 4 {
|
|
println!("Width must be greater than or equal to 4, setting width to 80");
|
|
width = 80;
|
|
}
|
|
|
|
let (table_headers, row_data) = make_table_data();
|
|
|
|
let headers = to_cell_info_vec(&table_headers);
|
|
let rows = to_cell_info_vec(&row_data);
|
|
|
|
let mut table = NuTable::new(4, 3);
|
|
table.set_row(0, headers);
|
|
|
|
for i in 0..3 {
|
|
table.set_row(i + 1, rows.clone());
|
|
}
|
|
|
|
table.set_data_style(TextStyle::basic_left());
|
|
table.set_header_style(TextStyle::basic_center().style(Style::new().on(Color::Blue)));
|
|
table.set_theme(TableTheme::rounded());
|
|
table.set_structure(false, true, false);
|
|
|
|
let output_table = table
|
|
.draw(width)
|
|
.unwrap_or_else(|| format!("Couldn't fit table into {width} columns!"));
|
|
|
|
println!("{output_table}")
|
|
}
|
|
|
|
fn make_table_data() -> (Vec<&'static str>, Vec<&'static str>) {
|
|
let table_headers = vec![
|
|
"category",
|
|
"description",
|
|
"emoji",
|
|
"ios_version",
|
|
"unicode_version",
|
|
"aliases",
|
|
"tags",
|
|
"category2",
|
|
"description2",
|
|
"emoji2",
|
|
"ios_version2",
|
|
"unicode_version2",
|
|
"aliases2",
|
|
"tags2",
|
|
];
|
|
|
|
let row_data = vec![
|
|
"Smileys & Emotion",
|
|
"grinning face",
|
|
"😀",
|
|
"6",
|
|
"6.1",
|
|
"grinning",
|
|
"smile",
|
|
"Smileys & Emotion",
|
|
"grinning face",
|
|
"😀",
|
|
"6",
|
|
"6.1",
|
|
"grinning",
|
|
"smile",
|
|
];
|
|
|
|
(table_headers, row_data)
|
|
}
|
|
|
|
fn to_cell_info_vec(data: &[&str]) -> Vec<Text<String>> {
|
|
let mut v = vec![];
|
|
for x in data {
|
|
v.push(Text::new(String::from(*x)));
|
|
}
|
|
|
|
v
|
|
}
|