From cbedc8403f6fc58896069d6dae59f2e2a5725036 Mon Sep 17 00:00:00 2001 From: WindSoilder Date: Sat, 15 Apr 2023 16:26:21 +0800 Subject: [PATCH] `update` command: make `$in`(in closure body) takes cell path (#8610) # Description Make `$in` takes cell path in `update` command The reason behind the change: https://discord.com/channels/601130461678272522/615329862395101194/1088405671080370196 > when i use update on some cell path, it's almost always because i want to start with its previous value and change it. cc @amtoine # User-Facing Changes ## Before ``` open Cargo.toml | get package | update metadata.binstall.pkg-fmt {|| $in.metadata.binstall.pkg-fmt | str replace "g" "FOO"} ``` ## After ``` open Cargo.toml | get package | update metadata.binstall.pkg-fmt {|| str replace "g" "FOO"} ``` If use want to access original raw, it can be accessed by parameters in closure: ``` open Cargo.toml | get package | update metadata.binstall.pkg-fmt {|$it| $it.metadata.binstall.pkg-fmt | str replace "g" "FOO"} ``` For this reason, I don't think we need to add a flag like `--whole` # 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 > **Note** > from `nushell` you can also use the `toolkit` as follows > ```bash > use toolkit.nu # or use an `env_change` hook to activate it automatically > toolkit check pr > ``` # 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. --- crates/nu-command/src/filters/update.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/nu-command/src/filters/update.rs b/crates/nu-command/src/filters/update.rs index 0796cde54e64..c4daced13bc0 100644 --- a/crates/nu-command/src/filters/update.rs +++ b/crates/nu-command/src/filters/update.rs @@ -75,6 +75,11 @@ impl Command for Update { example: "[[project, authors]; ['nu', ['Andrés', 'JT', 'Yehuda']]] | update authors {|row| $row.authors | str join ','}", result: Some(Value::List { vals: vec![Value::Record { cols: vec!["project".into(), "authors".into()], vals: vec![Value::test_string("nu"), Value::test_string("Andrés,JT,Yehuda")], span: Span::test_data()}], span: Span::test_data()}), }, + Example { + description: "You can also use a simple command to update 'authors' to a single string", + example: "[[project, authors]; ['nu', ['Andrés', 'JT', 'Yehuda']]] | update authors {|| str join ','}", + result: Some(Value::List { vals: vec![Value::Record { cols: vec!["project".into(), "authors".into()], vals: vec![Value::test_string("nu"), Value::test_string("Andrés,JT,Yehuda")], span: Span::test_data()}], span: Span::test_data()}), + } ] } } @@ -118,11 +123,16 @@ fn update( } } + let input_at_path = match input.clone().follow_cell_path(&cell_path.members, false) + { + Err(e) => return Value::Error { error: Box::new(e) }, + Ok(v) => v, + }; let output = eval_block( &engine_state, &mut stack, &block, - input.clone().into_pipeline_data(), + input_at_path.into_pipeline_data(), redirect_stdout, redirect_stderr, );