diff --git a/crates/nu-command/src/filters/sort_by.rs b/crates/nu-command/src/filters/sort_by.rs index b5a805595..76dab26c8 100644 --- a/crates/nu-command/src/filters/sort_by.rs +++ b/crates/nu-command/src/filters/sort_by.rs @@ -1,3 +1,4 @@ +use nu_engine::column::column_does_not_exist; use nu_engine::CallExt; use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; @@ -101,10 +102,19 @@ impl Command for SortBy { pub fn sort(vec: &mut [Value], columns: Vec, call: &Call) -> Result<(), ShellError> { match &vec[0] { Value::Record { - cols: _cols, + cols, vals: _input_vals, .. } => { + if columns.is_empty() { + println!("sort-by requires a column name to sort table data"); + return Err(ShellError::CantFindColumn(call.head, call.head)); + } + + if column_does_not_exist(columns.clone(), cols.to_vec()) { + return Err(ShellError::CantFindColumn(call.head, call.head)); + } + vec.sort_by(|a, b| { process(a, b, &columns[0], call) .expect("sort_by Value::Record bug") diff --git a/crates/nu-engine/src/column.rs b/crates/nu-engine/src/column.rs index 8726d5033..834ad2c86 100644 --- a/crates/nu-engine/src/column.rs +++ b/crates/nu-engine/src/column.rs @@ -1,4 +1,5 @@ use nu_protocol::Value; +use std::collections::HashSet; pub fn get_columns(input: &[Value]) -> Vec { let mut columns = vec![]; @@ -15,3 +16,23 @@ pub fn get_columns(input: &[Value]) -> Vec { columns } + +/* +* Check to see if any of the columns inside the input +* does not exist in a vec of columns +*/ + +pub fn column_does_not_exist(inputs: Vec, columns: Vec) -> bool { + let mut set = HashSet::new(); + for column in columns { + set.insert(column); + } + + for input in &inputs { + if set.contains(input) { + continue; + } + return true; + } + false +}