From 48cfc9b598d97626f03a5802f851b34281829a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20N=2E=20Robalino?= Date: Wed, 12 Aug 2020 02:51:24 -0500 Subject: [PATCH] apply all the block run's stream. (#2339) --- crates/nu-cli/src/commands/insert.rs | 28 +++++++++++++------- crates/nu-cli/src/commands/update.rs | 36 ++++++++++++++++---------- crates/nu-cli/tests/commands/insert.rs | 26 +++++++------------ crates/nu-cli/tests/commands/update.rs | 16 ++++++++++++ 4 files changed, 65 insertions(+), 41 deletions(-) diff --git a/crates/nu-cli/src/commands/insert.rs b/crates/nu-cli/src/commands/insert.rs index e938d54ac5..f940bd0800 100644 --- a/crates/nu-cli/src/commands/insert.rs +++ b/crates/nu-cli/src/commands/insert.rs @@ -73,27 +73,35 @@ async fn process_row( match result { Ok(mut stream) => { + let values = stream.drain_vec().await; + let errors = context.get_errors(); if let Some(error) = errors.first() { return Err(error.clone()); } + let result = if values.len() == 1 { + let value = values + .get(0) + .ok_or_else(|| ShellError::unexpected("No value to insert with"))?; + + value.clone() + } else if values.is_empty() { + UntaggedValue::nothing().into_untagged_value() + } else { + UntaggedValue::table(&values).into_untagged_value() + }; + match input { obj @ Value { value: UntaggedValue::Row(_), .. - } => { - if let Some(result) = stream.next().await { - match obj.insert_data_at_column_path(&column, result) { - Ok(v) => OutputStream::one(ReturnSuccess::value(v)), - Err(e) => OutputStream::one(Err(e)), - } - } else { - OutputStream::empty() - } - } + } => match obj.insert_data_at_column_path(&column, result) { + Ok(v) => OutputStream::one(ReturnSuccess::value(v)), + Err(e) => OutputStream::one(Err(e)), + }, Value { tag, .. } => OutputStream::one(Err(ShellError::labeled_error( "Unrecognized type in stream", "original value", diff --git a/crates/nu-cli/src/commands/update.rs b/crates/nu-cli/src/commands/update.rs index a74d256942..195e9120df 100644 --- a/crates/nu-cli/src/commands/update.rs +++ b/crates/nu-cli/src/commands/update.rs @@ -77,31 +77,39 @@ async fn process_row( match result { Ok(mut stream) => { + let values = stream.drain_vec().await; + let errors = context.get_errors(); if let Some(error) = errors.first() { return Err(error.clone()); } + let result = if values.len() == 1 { + let value = values + .get(0) + .ok_or_else(|| ShellError::unexpected("No value to update with"))?; + + value.clone() + } else if values.is_empty() { + UntaggedValue::nothing().into_untagged_value() + } else { + UntaggedValue::table(&values).into_untagged_value() + }; + match input { obj @ Value { value: UntaggedValue::Row(_), .. - } => { - if let Some(result) = stream.next().await { - match obj.replace_data_at_column_path(&field, result) { - Some(v) => OutputStream::one(ReturnSuccess::value(v)), - None => OutputStream::one(Err(ShellError::labeled_error( - "update could not find place to insert column", - "column name", - obj.tag, - ))), - } - } else { - OutputStream::empty() - } - } + } => match obj.replace_data_at_column_path(&field, result) { + Some(v) => OutputStream::one(ReturnSuccess::value(v)), + None => OutputStream::one(Err(ShellError::labeled_error( + "update could not find place to insert column", + "column name", + obj.tag, + ))), + }, Value { tag, .. } => OutputStream::one(Err(ShellError::labeled_error( "Unrecognized type in stream", "original value", diff --git a/crates/nu-cli/tests/commands/insert.rs b/crates/nu-cli/tests/commands/insert.rs index ecd8be7b21..530a1eda8f 100644 --- a/crates/nu-cli/tests/commands/insert.rs +++ b/crates/nu-cli/tests/commands/insert.rs @@ -1,7 +1,7 @@ use nu_test_support::{nu, pipeline}; #[test] -fn insert_plugin() { +fn sets_the_column_from_a_block_run_output() { let actual = nu!( cwd: "tests/fixtures/formats", pipeline( r#" @@ -16,25 +16,17 @@ fn insert_plugin() { } #[test] -fn downcase_upcase() { +fn sets_the_column_from_a_block_full_stream_output() { let actual = nu!( - cwd: ".", pipeline( + cwd: "tests/fixtures/formats", pipeline( r#" - echo abcd | wrap downcase | insert upcase { echo $it.downcase | str upcase } | format "{downcase}{upcase}" + wrap _ + | insert content { open --raw cargo_sample.toml | lines | first 5 } + | get content.1 + | str contains "nu" + | echo $it "# )); - assert_eq!(actual.out, "abcdABCD"); -} - -#[test] -fn number_and_its_negative_equal_zero() { - let actual = nu!( - cwd: ".", pipeline( - r#" - echo 1..10 | wrap num | insert neg { = $it.num * -1 } | math sum | = $it.num + $it.neg - "# - )); - - assert_eq!(actual.out, "0"); + assert_eq!(actual.out, "true"); } diff --git a/crates/nu-cli/tests/commands/update.rs b/crates/nu-cli/tests/commands/update.rs index bd5a524ec0..5bac7ce573 100644 --- a/crates/nu-cli/tests/commands/update.rs +++ b/crates/nu-cli/tests/commands/update.rs @@ -30,3 +30,19 @@ fn sets_the_column_from_a_block_run_output() { assert_eq!(actual.out, "0.7.0"); } + +#[test] +fn sets_the_column_from_a_block_full_stream_output() { + let actual = nu!( + cwd: "tests/fixtures/formats", pipeline( + r#" + wrap content + | update content { open --raw cargo_sample.toml | lines | first 5 } + | get content.1 + | str contains "nu" + | echo $it + "# + )); + + assert_eq!(actual.out, "true"); +}