From 8a85299575a469cce508d608d56b96a18cd30118 Mon Sep 17 00:00:00 2001 From: Maxim Zhiburt Date: Fri, 31 Mar 2023 15:53:57 +0300 Subject: [PATCH] Fix of a fix of #8671 (#8675) Hi @fdncred, I accidentally noticed that your fix tricks wrapping a bit. ![image](https://user-images.githubusercontent.com/20165848/228908201-0d5c7878-739f-43a3-b931-a8dc9df85cd7.png) It must address it. PS: I believe the issue was originally caused by a false positive of clippy. (maybe we shall report it I am not sure) --------- Signed-off-by: Maxim Zhiburt --- crates/nu-command/src/debug/inspect_table.rs | 154 ++++++++----------- 1 file changed, 67 insertions(+), 87 deletions(-) diff --git a/crates/nu-command/src/debug/inspect_table.rs b/crates/nu-command/src/debug/inspect_table.rs index f9bf42bca7..bb7009b2b4 100644 --- a/crates/nu-command/src/debug/inspect_table.rs +++ b/crates/nu-command/src/debug/inspect_table.rs @@ -7,8 +7,9 @@ use tabled::{ }; use self::{ - global_horizontal_char::SetHorizontalChar, peak2::Peak2, table_column_width::GetColumnWidths, - truncate_table::TruncateTable, width_increase::IncWidth, + global_horizontal_char::SetHorizontalCharOnFirstRow, peak2::Peak2, + table_column_width::get_first_cell_width, truncate_table::TruncateTable, + width_increase::IncWidth, }; pub fn build_table(value: Value, description: String, termsize: usize) -> String { @@ -23,11 +24,8 @@ pub fn build_table(value: Value, description: String, termsize: usize) -> String let mut desc_table = Builder::from(desc).build(); let desc_table_width = desc_table.total_width(); - let width = if desc_table_width > termsize { - val_table_width.clamp(termsize, desc_table_width) - } else { - val_table_width.clamp(desc_table_width, termsize) - }; + #[allow(clippy::manual_clamp)] + let width = val_table_width.max(desc_table_width).min(termsize); desc_table .with(Style::rounded().off_bottom()) @@ -40,10 +38,11 @@ pub fn build_table(value: Value, description: String, termsize: usize) -> String .with(Wrap::new(width).priority::()) .with(IncWidth(width)); - let mut desc_widths = GetColumnWidths(Vec::new()); - desc_table.with(&mut desc_widths); + // we use only 1, cause left border considered 0 position + let count_split_lines = 1; + let desc_width = get_first_cell_width(&mut desc_table) + count_split_lines; - val_table.with(SetHorizontalChar::new('┼', '┴', 0, desc_widths.0[0])); + val_table.with(SetHorizontalCharOnFirstRow::new('┼', '┴', desc_width)); format!("{desc_table}\n{val_table}") } @@ -138,17 +137,12 @@ mod util { ), Value::List { vals, .. } => { let mut columns = get_columns(&vals); - let mut data = convert_records_to_dataset(&columns, vals); + let data = convert_records_to_dataset(&columns, vals); - if columns.is_empty() && !data.is_empty() { + if columns.is_empty() { columns = vec![String::from("")]; } - // We need something to draw a table with - if data.is_empty() { - data.push(vec!["".to_string()]) - } - (columns, data) } Value::String { val, span } => { @@ -163,7 +157,7 @@ mod util { (vec![String::from("")], lines) } - Value::Nothing { .. } => (vec!["".to_string()], vec![vec!["".to_string()]]), + Value::Nothing { .. } => (vec![], vec![]), value => ( vec![String::from("")], vec![vec![debug_string_without_formatting(&value)]], @@ -270,18 +264,30 @@ mod peak2 { } mod table_column_width { - use tabled::papergrid::{records::Records, Estimate}; + use tabled::{ + papergrid::{records::Records, width::CfgWidthFunction}, + Table, + }; - pub struct GetColumnWidths(pub Vec); + pub fn get_first_cell_width(table: &mut Table) -> usize { + let mut opt = GetFirstCellWidth(0); + table.with(&mut opt); + opt.0 + } - impl tabled::TableOption for GetColumnWidths - where - R: Records, - { + struct GetFirstCellWidth(pub usize); + + impl tabled::TableOption for GetFirstCellWidth { fn change(&mut self, table: &mut tabled::Table) { - let mut evaluator = tabled::papergrid::width::WidthEstimator::default(); - evaluator.estimate(table.get_records(), table.get_config()); - self.0 = evaluator.into(); + let w = table + .get_records() + .get_width((0, 0), CfgWidthFunction::default()); + let pad = table + .get_config() + .get_padding(tabled::papergrid::Entity::Cell(0, 0)); + let pad = pad.left.size + pad.right.size; + + self.0 = w + pad; } } } @@ -292,91 +298,65 @@ mod global_horizontal_char { Table, TableOption, }; - pub struct SetHorizontalChar { + pub struct SetHorizontalCharOnFirstRow { c1: char, c2: char, - line: usize, - position: usize, + pos: usize, } - impl SetHorizontalChar { - pub fn new(c1: char, c2: char, line: usize, position: usize) -> Self { - Self { - c1, - c2, - line, - position, - } + impl SetHorizontalCharOnFirstRow { + pub fn new(c1: char, c2: char, pos: usize) -> Self { + Self { c1, c2, pos } } } - impl TableOption for SetHorizontalChar + impl TableOption for SetHorizontalCharOnFirstRow where R: Records, { fn change(&mut self, table: &mut Table) { - let shape = table.shape(); - - let is_last_line = self.line == (shape.0 * 2); - let mut row = self.line; - if is_last_line { - row = self.line - 1; + if table.is_empty() { + return; } + let shape = table.shape(); + let mut evaluator = WidthEstimator::default(); evaluator.estimate(table.get_records(), table.get_config()); let widths: Vec<_> = evaluator.into(); - let mut i = 0; + let has_vertical = table.get_config().has_vertical(0, shape.1); + if has_vertical && self.pos == 0 { + let mut border = table.get_config().get_border((0, 0), shape); + border.left_top_corner = Some(self.c1); + table.get_config_mut().set_border((0, 0), border); + return; + } + + let mut i = 1; #[allow(clippy::needless_range_loop)] - for column in 0..shape.1 { - let has_vertical = table.get_config().has_vertical(column, shape.1); + for (col, width) in widths.into_iter().enumerate() { + if self.pos < i + width { + let o = self.pos - i; + table + .get_config_mut() + .override_horizontal_border((0, col), self.c2, Begin(o)); + return; + } + i += width; + + let has_vertical = table.get_config().has_vertical(col, shape.1); if has_vertical { - if self.position == i { - let mut border = table.get_config().get_border((row, column), shape); - if is_last_line { - border.left_bottom_corner = Some(self.c1); - } else { - border.left_top_corner = Some(self.c1); - } - - table.get_config_mut().set_border((row, column), border); - + if self.pos == i { + let mut border = table.get_config().get_border((0, col), shape); + border.right_top_corner = Some(self.c1); + table.get_config_mut().set_border((0, col), border); return; } i += 1; } - - let width = widths[column]; - - if self.position < i + width { - let offset = self.position + 1 - i; - // let offset = width - offset; - - table.get_config_mut().override_horizontal_border( - (self.line, column), - self.c2, - Begin(offset), - ); - - return; - } - - i += width; - } - - let has_vertical = table.get_config().has_vertical(shape.1, shape.1); - if self.position == i && has_vertical { - let mut border = table.get_config().get_border((row, shape.1), shape); - if is_last_line { - border.left_bottom_corner = Some(self.c1); - } else { - border.left_top_corner = Some(self.c1); - } - - table.get_config_mut().set_border((row, shape.1), border); } } }