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 <stevan.antoine@gmail.com>
This commit is contained in:
JT 2023-06-18 21:40:18 +12:00 committed by GitHub
parent c12b211075
commit 1d5e7b441b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 6 deletions

View File

@ -189,3 +189,10 @@ fn where_gt_null() {
let actual = nu!("[{foo: 123} {}] | where foo? > 10 | to nuon"); let actual = nu!("[{foo: 123} {}] | where foo? > 10 | to nuon");
assert_eq!(actual.out, "[[foo]; [123]]"); 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, "[]");
}

View File

@ -302,6 +302,7 @@ impl PipelineData {
}, },
// Propagate errors by explicitly matching them before the final case. // Propagate errors by explicitly matching them before the final case.
Value::Error { error } => Err(*error), Value::Error { error } => Err(*error),
Value::Nothing { .. } => Ok(PipelineIterator(PipelineData::empty())),
other => Err(ShellError::OnlySupportsThisInputType { other => Err(ShellError::OnlySupportsThisInputType {
exp_input_type: "list, binary, raw data or range".into(), exp_input_type: "list, binary, raw data or range".into(),
wrong_type: other.get_type().to_string(), wrong_type: other.get_type().to_string(),
@ -309,12 +310,7 @@ impl PipelineData {
src_span: other.expect_span(), src_span: other.expect_span(),
}), }),
}, },
PipelineData::Empty => Err(ShellError::OnlySupportsThisInputType { PipelineData::Empty => Ok(PipelineIterator(PipelineData::empty())),
exp_input_type: "list, binary, raw data or range".into(),
wrong_type: "null".into(),
dst_span: span,
src_span: span,
}),
other => Ok(PipelineIterator(other)), other => Ok(PipelineIterator(other)),
} }
} }