let find take linebreaks into account in Value::String (#7789)

# Description

Fixes #7774. The functionality should be the same as feeding all
`PipelineDate::Value(Value::String(_,_),_)` into `lines` before putting
it into `find`.

# 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.
This commit is contained in:
pwygab 2023-01-20 07:07:34 +08:00 committed by GitHub
parent 6a43e1a64d
commit 2982a2c963
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 2 deletions

View File

@ -8,8 +8,8 @@ use nu_engine::{env_to_string, CallExt};
use nu_protocol::{
ast::Call,
engine::{Command, EngineState, Stack},
Category, Config, Example, IntoInterruptiblePipelineData, ListStream, PipelineData, ShellError,
Signature, Span, SyntaxShape, Type, Value,
Category, Config, Example, IntoInterruptiblePipelineData, IntoPipelineData, ListStream,
PipelineData, ShellError, Signature, Span, SyntaxShape, Type, Value,
};
use nu_utils::get_ls_colors;
@ -150,6 +150,7 @@ impl Command for Find {
if let Some(regex) = regex {
find_with_regex(regex, engine_state, stack, call, input)
} else {
let input = split_string_if_multiline(input);
find_with_rest_and_highlight(engine_state, stack, call, input)
}
}
@ -591,3 +592,28 @@ mod tests {
test_examples(Find)
}
}
fn split_string_if_multiline(input: PipelineData) -> PipelineData {
match input {
PipelineData::Value(Value::String { ref val, span }, _) => {
if val.contains('\n') {
Value::List {
vals: {
val.lines()
.map(|s| Value::String {
val: s.to_string(),
span,
})
.collect()
},
span,
}
.into_pipeline_data()
.set_metadata(input.metadata())
} else {
input
}
}
_ => input,
}
}

View File

@ -109,3 +109,15 @@ fn find_with_filepath_search_with_multiple_patterns() {
assert_eq!(actual.out, r#"["amigos.txt","arepas.clu"]"#);
})
}
#[test]
fn find_takes_into_account_linebreaks_in_string() {
let actual = nu!(
cwd: ".", pipeline(
r#"
"atest\nanothertest\nnohit\n" | find a | length
"#
));
assert_eq!(actual.out, "2");
}