diff --git a/crates/nu-command/src/filters/reject.rs b/crates/nu-command/src/filters/reject.rs index 81fcc3fabd..bc3a3c21f0 100644 --- a/crates/nu-command/src/filters/reject.rs +++ b/crates/nu-command/src/filters/reject.rs @@ -82,6 +82,20 @@ fn reject( .into_iter() .into_pipeline_data(engine_state.ctrlc.clone())) } + PipelineData::Value( + Value::Record { + mut cols, + mut vals, + span, + }, + metadata, + ) => { + reject_record_columns(&mut cols, &mut vals, &columns); + + let record = Value::Record { cols, vals, span }; + + Ok(PipelineData::Value(record, metadata)) + } PipelineData::ListStream(stream, ..) => { let mut output = vec![]; @@ -155,3 +169,12 @@ fn get_keep_columns(mut input: Vec, rejects: Vec) -> Vec } input } + +fn reject_record_columns(cols: &mut Vec, vals: &mut Vec, rejects: &[String]) { + for reject in rejects { + if let Some(index) = cols.iter().position(|value| value == reject) { + cols.swap_remove(index); + vals.swap_remove(index); + } + } +} diff --git a/crates/nu-command/tests/commands/mod.rs b/crates/nu-command/tests/commands/mod.rs index 8db5a5af3b..985c93afed 100644 --- a/crates/nu-command/tests/commands/mod.rs +++ b/crates/nu-command/tests/commands/mod.rs @@ -42,6 +42,7 @@ mod prepend; mod random; mod range; mod reduce; +mod reject; mod rename; mod reverse; mod rm; diff --git a/crates/nu-command/tests/commands/reject.rs b/crates/nu-command/tests/commands/reject.rs new file mode 100644 index 0000000000..d987c64d32 --- /dev/null +++ b/crates/nu-command/tests/commands/reject.rs @@ -0,0 +1,75 @@ +use nu_test_support::{nu, pipeline}; + +#[test] +fn regular_columns() { + let actual = nu!(cwd: ".", pipeline( + r#" + echo [ + [first_name, last_name, rusty_at, type]; + + [Andrés Robalino 10/11/2013 A] + [Jonathan Turner 10/12/2013 B] + [Yehuda Katz 10/11/2013 A] + ] + | reject type first_name + | columns + | str collect ", " + "# + )); + + assert_eq!(actual.out, "rusty_at, last_name"); +} + +// FIXME: needs more work +#[ignore] +#[test] +fn complex_nested_columns() { + let actual = nu!(cwd: ".", pipeline( + r#" + { + "nu": { + "committers": [ + {"name": "Andrés N. Robalino"}, + {"name": "Jonathan Turner"}, + {"name": "Yehuda Katz"} + ], + "releases": [ + {"version": "0.2"} + {"version": "0.8"}, + {"version": "0.9999999"} + ], + "0xATYKARNU": [ + ["Th", "e", " "], + ["BIG", " ", "UnO"], + ["punto", "cero"] + ] + } + } + | reject nu."0xATYKARNU" nu.committers + | get nu + | columns + | str collect ", " + "#, + )); + + assert_eq!(actual.out, "releases"); +} + +#[test] +fn ignores_duplicate_columns_rejected() { + let actual = nu!(cwd: ".", pipeline( + r#" + echo [ + ["first name", "last name"]; + + [Andrés Robalino] + [Andrés Jnth] + ] + | reject "first name" "first name" + | columns + | str collect ", " + "# + )); + + assert_eq!(actual.out, "last name"); +}