diff --git a/crates/nu-command/src/filters/flatten.rs b/crates/nu-command/src/filters/flatten.rs index 287dee0f51..055b230ccf 100644 --- a/crates/nu-command/src/filters/flatten.rs +++ b/crates/nu-command/src/filters/flatten.rs @@ -84,12 +84,12 @@ enum TableInside<'a> { Entries(&'a str, &'a Span, Vec<&'a Value>), } -fn is_table(value: &Value) -> bool { - match value { - Value::List { vals, span: _ } => vals.iter().all(|f| f.as_record().is_ok()), - _ => false, - } -} +// fn is_table(value: &Value) -> bool { +// match value { +// Value::List { vals, span: _ } => vals.iter().all(|f| f.as_record().is_ok()), +// _ => false, +// } +// } fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span) -> Vec { let tag = match item.span() { @@ -233,7 +233,7 @@ fn flat_value(columns: &[CellPath], item: &Value, _name_tag: Span) -> Vec expanded.push(r); } expanded - } else if !is_table(item) { + } else if item.as_list().is_ok() { if let Value::List { vals, span: _ } = item { vals.to_vec() } else { diff --git a/crates/nu-protocol/src/value/mod.rs b/crates/nu-protocol/src/value/mod.rs index 70606dcc57..80fd2d8eed 100644 --- a/crates/nu-protocol/src/value/mod.rs +++ b/crates/nu-protocol/src/value/mod.rs @@ -195,6 +195,17 @@ impl Value { } } + pub fn as_list(&self) -> Result<&[Value], ShellError> { + match self { + Value::List { vals, .. } => Ok(vals), + x => Err(ShellError::CantConvert( + "list".into(), + x.get_type().to_string(), + self.span()?, + )), + } + } + pub fn as_bool(&self) -> Result { match self { Value::Bool { val, .. } => Ok(*val), diff --git a/src/main.rs b/src/main.rs index 881564a70f..3517afb58f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,10 @@ use nu_protocol::{ engine::{EngineState, Stack, StateWorkingSet}, Config, PipelineData, ShellError, Span, Value, CONFIG_VARIABLE_ID, }; -use reedline::{Completer, CompletionActionHandler, DefaultPrompt, LineBuffer, Prompt}; +use reedline::{ + Completer, CompletionActionHandler, DefaultCompleter, DefaultHinter, DefaultPrompt, LineBuffer, + Prompt, +}; use std::{ io::Write, sync::{ @@ -353,12 +356,28 @@ fn main() -> Result<()> { // turn off the hinter but I don't see any way to do that yet. let mut line_editor = if let Some(history_path) = history_path.clone() { - line_editor - .with_history(Box::new( - FileBackedHistory::with_file(1000, history_path.clone()) - .into_diagnostic()?, - )) - .into_diagnostic()? + let history = std::fs::read_to_string(&history_path); + if let Ok(history) = history { + let history_lines = history.lines().map(|x| x.to_string()).collect::>(); + line_editor + .with_hinter(Box::new( + DefaultHinter::default() + .with_completer(Box::new(DefaultCompleter::new(history_lines))) // or .with_history() + // .with_inside_line() + .with_style( + nu_ansi_term::Style::new() + .italic() + .fg(nu_ansi_term::Color::LightGray), + ), + )) + .with_history(Box::new( + FileBackedHistory::with_file(1000, history_path.clone()) + .into_diagnostic()?, + )) + .into_diagnostic()? + } else { + line_editor + } } else { line_editor }; diff --git a/src/tests.rs b/src/tests.rs index 61f2fdfac0..a87fed402f 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1308,3 +1308,11 @@ fn allow_missing_optional_params() -> TestResult { "5", ) } + +#[test] +fn flatten_should_flatten_inner_table() -> TestResult { + run_test( + "[[[name, value]; [abc, 123]]] | flatten | get value.0", + "123", + ) +}