From 1d5e7b441b9564b7ee9fe822d908b20fbf4b8682 Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:40:18 +1200 Subject: [PATCH] Treat empty pipelines as pass-through (#8395) # Description This allows empty pipelines to pass their emptiness through a filter. This helps fix issues like trying to run a filter on an `ls` in an empty directory. It also feels a bit more reasonable that a filter filters what is *there* but doesn't require something to be there. fixes #8393 # User-Facing Changes No breaking changes (that I know of). Should allow filtering to be a little less surprising with emptiness. # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. --------- Co-authored-by: amtoine --- crates/nu-command/tests/commands/where_.rs | 7 +++++++ crates/nu-protocol/src/pipeline_data.rs | 8 ++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/nu-command/tests/commands/where_.rs b/crates/nu-command/tests/commands/where_.rs index 1f1ccc764b..ebf1ff5bb9 100644 --- a/crates/nu-command/tests/commands/where_.rs +++ b/crates/nu-command/tests/commands/where_.rs @@ -189,3 +189,10 @@ fn where_gt_null() { let actual = nu!("[{foo: 123} {}] | where foo? > 10 | to nuon"); assert_eq!(actual.out, "[[foo]; [123]]"); } + +#[test] +fn pass_through_empty_pipelines() { + let actual = nu!(cwd: ".", pipeline(r#"null | where name == "foo" | to json"#)); + + assert_eq!(actual.out, "[]"); +} diff --git a/crates/nu-protocol/src/pipeline_data.rs b/crates/nu-protocol/src/pipeline_data.rs index 3e47d2efca..7257cfe224 100644 --- a/crates/nu-protocol/src/pipeline_data.rs +++ b/crates/nu-protocol/src/pipeline_data.rs @@ -302,6 +302,7 @@ impl PipelineData { }, // Propagate errors by explicitly matching them before the final case. Value::Error { error } => Err(*error), + Value::Nothing { .. } => Ok(PipelineIterator(PipelineData::empty())), other => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary, raw data or range".into(), wrong_type: other.get_type().to_string(), @@ -309,12 +310,7 @@ impl PipelineData { src_span: other.expect_span(), }), }, - PipelineData::Empty => Err(ShellError::OnlySupportsThisInputType { - exp_input_type: "list, binary, raw data or range".into(), - wrong_type: "null".into(), - dst_span: span, - src_span: span, - }), + PipelineData::Empty => Ok(PipelineIterator(PipelineData::empty())), other => Ok(PipelineIterator(other)), } }