From 31925c3d40abfb1b17036291b69a9671b65d5eb7 Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Mon, 21 Feb 2022 20:48:42 -0500 Subject: [PATCH] Compact nuon tables (#4596) --- crates/nu-command/src/formats/to/nuon.rs | 34 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/crates/nu-command/src/formats/to/nuon.rs b/crates/nu-command/src/formats/to/nuon.rs index 62315ddcd..16c326842 100644 --- a/crates/nu-command/src/formats/to/nuon.rs +++ b/crates/nu-command/src/formats/to/nuon.rs @@ -1,3 +1,4 @@ +use nu_engine::get_columns; use nu_protocol::ast::{Call, RangeInclusion}; use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::{ @@ -63,11 +64,36 @@ fn value_to_string(v: &Value, span: Span) -> Result { Value::Float { val, .. } => Ok(format!("{}", *val)), Value::Int { val, .. } => Ok(format!("{}", *val)), Value::List { vals, .. } => { - let mut collection = vec![]; - for val in vals { - collection.push(value_to_string(val, span)?); + let headers = get_columns(vals); + if vals.iter().all(|x| x.columns() == headers) { + // Table output + let headers_output = headers.join(", "); + + let mut table_output = vec![]; + for val in vals { + let mut row = vec![]; + + if let Value::Record { vals, .. } = val { + for val in vals { + row.push(value_to_string(val, span)?); + } + } + + table_output.push(row.join(", ")); + } + + Ok(format!( + "[[{}]; [{}]]", + headers_output, + table_output.join("], [") + )) + } else { + let mut collection = vec![]; + for val in vals { + collection.push(value_to_string(val, span)?); + } + Ok(format!("[{}]", collection.join(", "))) } - Ok(format!("[{}]", collection.join(", "))) } Value::Nothing { .. } => Ok("$nothing".to_string()), Value::Range { val, .. } => Ok(format!(