diff --git a/crates/nu-command/src/filters/append.rs b/crates/nu-command/src/filters/append.rs index 0b84a846fa..40d8aff19e 100644 --- a/crates/nu-command/src/filters/append.rs +++ b/crates/nu-command/src/filters/append.rs @@ -118,8 +118,7 @@ only unwrap the outer list, and leave the variable's contents untouched."# Ok(input .into_iter() .chain(other.into_pipeline_data()) - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } diff --git a/crates/nu-command/src/filters/columns.rs b/crates/nu-command/src/filters/columns.rs index e21041ccfc..ae2f7d9338 100644 --- a/crates/nu-command/src/filters/columns.rs +++ b/crates/nu-command/src/filters/columns.rs @@ -145,8 +145,7 @@ fn getcol( Ok(input_cols .into_iter() .map(move |x| Value::string(x, head)) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } PipelineData::ExternalStream { .. } => Err(ShellError::OnlySupportsThisInputType { exp_input_type: "record or table".into(), diff --git a/crates/nu-command/src/filters/default.rs b/crates/nu-command/src/filters/default.rs index bd8ab1a113..f4311aef9c 100644 --- a/crates/nu-command/src/filters/default.rs +++ b/crates/nu-command/src/filters/default.rs @@ -78,51 +78,56 @@ fn default( call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let value: Value = call.req(engine_state, stack, 0)?; let column: Option> = call.opt(engine_state, stack, 1)?; let ctrlc = engine_state.ctrlc.clone(); if let Some(column) = column { - input.map( - move |item| { - let span = item.span(); - match item { - Value::Record { - val: mut record, .. - } => { - let mut found = false; + input + .map( + move |item| { + let span = item.span(); + match item { + Value::Record { + val: mut record, .. + } => { + let mut found = false; - for (col, val) in record.iter_mut() { - if *col == column.item { - found = true; - if matches!(val, Value::Nothing { .. }) { - *val = value.clone(); + for (col, val) in record.iter_mut() { + if *col == column.item { + found = true; + if matches!(val, Value::Nothing { .. }) { + *val = value.clone(); + } } } - } - if !found { - record.push(column.item.clone(), value.clone()); - } + if !found { + record.push(column.item.clone(), value.clone()); + } - Value::record(record, span) + Value::record(record, span) + } + _ => item, } - _ => item, - } - }, - ctrlc, - ) + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } else if input.is_nothing() { Ok(value.into_pipeline_data()) } else { - input.map( - move |item| match item { - Value::Nothing { .. } => value.clone(), - x => x, - }, - ctrlc, - ) + input + .map( + move |item| match item { + Value::Nothing { .. } => value.clone(), + x => x, + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/drop/column.rs b/crates/nu-command/src/filters/drop/column.rs index f1496900f1..d7c20c40b3 100644 --- a/crates/nu-command/src/filters/drop/column.rs +++ b/crates/nu-command/src/filters/drop/column.rs @@ -94,6 +94,7 @@ fn drop_cols( // `[{a: 1}, {b: 2}] | drop column` // This will drop the column "a" instead of "b" even though column "b" // is displayed farther to the right. + let metadata = input.metadata(); match input { PipelineData::ListStream(mut stream, ..) => { if let Some(mut first) = stream.next() { @@ -106,7 +107,7 @@ fn drop_cols( Err(e) => Value::error(e, head), } })) - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } else { Ok(PipelineData::Empty) } @@ -121,14 +122,14 @@ fn drop_cols( drop_record_cols(val, head, &drop_cols)? } } - Ok(Value::list(vals, span).into_pipeline_data()) + Ok(Value::list(vals, span).into_pipeline_data_with_metadata(metadata)) } Value::Record { val: mut record, .. } => { let len = record.len().saturating_sub(columns); record.truncate(len); - Ok(Value::record(record, span).into_pipeline_data()) + Ok(Value::record(record, span).into_pipeline_data_with_metadata(metadata)) } // Propagate errors Value::Error { error, .. } => Err(*error), diff --git a/crates/nu-command/src/filters/drop/drop_.rs b/crates/nu-command/src/filters/drop/drop_.rs index c2deb9f40b..1c67c0f63a 100644 --- a/crates/nu-command/src/filters/drop/drop_.rs +++ b/crates/nu-command/src/filters/drop/drop_.rs @@ -96,8 +96,7 @@ impl Command for Drop { if rows_to_drop == 0 { Ok(v.into_iter() - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } else { let k = if vlen < rows_to_drop { 0 @@ -106,9 +105,7 @@ impl Command for Drop { }; let iter = v.into_iter().take(k as usize); - Ok(iter - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + Ok(iter.into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } } diff --git a/crates/nu-command/src/filters/drop/nth.rs b/crates/nu-command/src/filters/drop/nth.rs index 00f2fc31ba..dfd0ccbcf4 100644 --- a/crates/nu-command/src/filters/drop/nth.rs +++ b/crates/nu-command/src/filters/drop/nth.rs @@ -104,6 +104,7 @@ impl Command for DropNth { call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let number_or_range = extract_int_or_range(engine_state, stack, call)?; let mut lower_bound = None; let rows = match number_or_range { @@ -165,14 +166,14 @@ impl Command for DropNth { .into_iter() .take(lower_bound) .collect::>() - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } else { Ok(DropNthIterator { input: input.into_iter(), rows, current: 0, } - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } } diff --git a/crates/nu-command/src/filters/every.rs b/crates/nu-command/src/filters/every.rs index 77a0c282e9..43cefbf387 100644 --- a/crates/nu-command/src/filters/every.rs +++ b/crates/nu-command/src/filters/every.rs @@ -85,8 +85,7 @@ impl Command for Every { None } }) - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } diff --git a/crates/nu-command/src/filters/find.rs b/crates/nu-command/src/filters/find.rs index 30c728e743..09ecf2cd68 100644 --- a/crates/nu-command/src/filters/find.rs +++ b/crates/nu-command/src/filters/find.rs @@ -392,7 +392,7 @@ fn find_with_rest_and_highlight( }, ctrlc, ), - PipelineData::ListStream(stream, meta) => Ok(ListStream::from_stream( + PipelineData::ListStream(stream, metadata) => Ok(ListStream::from_stream( stream .map(move |mut x| { let span = x.span(); @@ -421,8 +421,7 @@ fn find_with_rest_and_highlight( }), ctrlc.clone(), ) - .into_pipeline_data(ctrlc) - .set_metadata(meta)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), PipelineData::ExternalStream { stdout: None, .. } => Ok(PipelineData::empty()), PipelineData::ExternalStream { stdout: Some(stream), @@ -583,8 +582,7 @@ fn split_string_if_multiline(input: PipelineData, head_span: Span) -> PipelineDa .collect(), span, ) - .into_pipeline_data() - .set_metadata(input.metadata()) + .into_pipeline_data_with_metadata(input.metadata()) } else { input } diff --git a/crates/nu-command/src/filters/first.rs b/crates/nu-command/src/filters/first.rs index 04138bcf79..c3f2f2809c 100644 --- a/crates/nu-command/src/filters/first.rs +++ b/crates/nu-command/src/filters/first.rs @@ -106,9 +106,7 @@ fn first_helper( // early exit for `first 0` if rows_desired == 0 { - return Ok(Vec::::new() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)); + return Ok(Vec::::new().into_pipeline_data_with_metadata(metadata, ctrlc)); } match input { @@ -126,8 +124,7 @@ fn first_helper( Ok(vals .into_iter() .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } Value::Binary { val, .. } => { @@ -152,8 +149,7 @@ fn first_helper( Ok(val .into_range_iter(ctrlc.clone())? .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } // Propagate errors by explicitly matching them before the final case. @@ -176,8 +172,7 @@ fn first_helper( } else { Ok(ls .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } PipelineData::ExternalStream { span, .. } => Err(ShellError::OnlySupportsThisInputType { diff --git a/crates/nu-command/src/filters/group.rs b/crates/nu-command/src/filters/group.rs index b8c23f84b3..9404222fa3 100644 --- a/crates/nu-command/src/filters/group.rs +++ b/crates/nu-command/src/filters/group.rs @@ -70,9 +70,7 @@ impl Command for Group { span: call.head, }; - Ok(each_group_iterator - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + Ok(each_group_iterator.into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/headers.rs b/crates/nu-command/src/filters/headers.rs index a21908b180..e2d340b34b 100644 --- a/crates/nu-command/src/filters/headers.rs +++ b/crates/nu-command/src/filters/headers.rs @@ -73,7 +73,7 @@ impl Command for Headers { let (old_headers, new_headers) = extract_headers(&value, config)?; let new_headers = replace_headers(value, &old_headers, &new_headers)?; - Ok(new_headers.into_pipeline_data().set_metadata(metadata)) + Ok(new_headers.into_pipeline_data_with_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/insert.rs b/crates/nu-command/src/filters/insert.rs index 60ceb12f2c..b07383121e 100644 --- a/crates/nu-command/src/filters/insert.rs +++ b/crates/nu-command/src/filters/insert.rs @@ -109,6 +109,7 @@ fn insert( call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let span = call.head; let cell_path: CellPath = call.req(engine_state, stack, 0)?; @@ -129,47 +130,49 @@ fn insert( let orig_env_vars = stack.env_vars.clone(); let orig_env_hidden = stack.env_hidden.clone(); - input.map( - move |mut input| { - // with_env() is used here to ensure that each iteration uses - // a different set of environment variables. - // Hence, a 'cd' in the first loop won't affect the next loop. - stack.with_env(&orig_env_vars, &orig_env_hidden); + input + .map( + move |mut input| { + // with_env() is used here to ensure that each iteration uses + // a different set of environment variables. + // Hence, a 'cd' in the first loop won't affect the next loop. + stack.with_env(&orig_env_vars, &orig_env_hidden); - // Element argument - if let Some(var) = block.signature.get_positional(0) { - if let Some(var_id) = &var.var_id { - stack.add_var(*var_id, input.clone()) - } - } - - let output = eval_block( - &engine_state, - &mut stack, - &block, - input.clone().into_pipeline_data(), - redirect_stdout, - redirect_stderr, - ); - - match output { - Ok(pd) => { - let span = pd.span().unwrap_or(span); - if let Err(e) = input.insert_data_at_cell_path( - &cell_path.members, - pd.into_value(span), - span, - ) { - return Value::error(e, span); + // Element argument + if let Some(var) = block.signature.get_positional(0) { + if let Some(var_id) = &var.var_id { + stack.add_var(*var_id, input.clone()) } - - input } - Err(e) => Value::error(e, span), - } - }, - ctrlc, - ) + + let output = eval_block( + &engine_state, + &mut stack, + &block, + input.clone().into_pipeline_data(), + redirect_stdout, + redirect_stderr, + ); + + match output { + Ok(pd) => { + let span = pd.span().unwrap_or(span); + if let Err(e) = input.insert_data_at_cell_path( + &cell_path.members, + pd.into_value(span), + span, + ) { + return Value::error(e, span); + } + + input + } + Err(e) => Value::error(e, span), + } + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } else { if let Some(PathMember::Int { val, .. }) = cell_path.members.first() { let mut input = input.into_iter(); @@ -187,22 +190,24 @@ fn insert( .into_iter() .chain(vec![replacement]) .chain(input) - .into_pipeline_data(ctrlc)); + .into_pipeline_data_with_metadata(metadata, ctrlc)); } - input.map( - move |mut input| { - let replacement = replacement.clone(); + input + .map( + move |mut input| { + let replacement = replacement.clone(); - if let Err(e) = - input.insert_data_at_cell_path(&cell_path.members, replacement, span) - { - return Value::error(e, span); - } + if let Err(e) = + input.insert_data_at_cell_path(&cell_path.members, replacement, span) + { + return Value::error(e, span); + } - input - }, - ctrlc, - ) + input + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/join.rs b/crates/nu-command/src/filters/join.rs index 7e02070b30..4156009664 100644 --- a/crates/nu-command/src/filters/join.rs +++ b/crates/nu-command/src/filters/join.rs @@ -68,6 +68,7 @@ impl Command for Join { call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let table_2: Value = call.req(engine_state, stack, 0)?; let l_on: Value = call.req(engine_state, stack, 1)?; let r_on: Value = call @@ -87,7 +88,7 @@ impl Command for Join { Value::String { val: r_on, .. }, ) => { let result = join(rows_1, rows_2, l_on, r_on, join_type, span); - Ok(PipelineData::Value(result, None)) + Ok(PipelineData::Value(result, metadata)) } _ => Err(ShellError::UnsupportedInput { msg: "(PipelineData, table, string, string)".into(), diff --git a/crates/nu-command/src/filters/last.rs b/crates/nu-command/src/filters/last.rs index 99ec89383b..944ef59374 100644 --- a/crates/nu-command/src/filters/last.rs +++ b/crates/nu-command/src/filters/last.rs @@ -96,9 +96,7 @@ impl Command for Last { // early exit for `last 0` if rows_desired == 0 { - return Ok(Vec::::new() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)); + return Ok(Vec::::new().into_pipeline_data_with_metadata(metadata, ctrlc)); } match input { @@ -118,12 +116,12 @@ impl Command for Last { if return_single_element { if let Some(last) = buf.pop_back() { - Ok(last.into_pipeline_data().set_metadata(metadata)) + Ok(last.into_pipeline_data_with_metadata(metadata)) } else { Ok(PipelineData::empty().set_metadata(metadata)) } } else { - Ok(buf.into_pipeline_data(ctrlc).set_metadata(metadata)) + Ok(buf.into_pipeline_data_with_metadata(metadata, ctrlc)) } } PipelineData::Value(val, _) => { @@ -143,8 +141,7 @@ impl Command for Last { .rev() .take(rows_desired) .rev() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } Value::Binary { val, .. } => { diff --git a/crates/nu-command/src/filters/prepend.rs b/crates/nu-command/src/filters/prepend.rs index 4977827763..d45062761e 100644 --- a/crates/nu-command/src/filters/prepend.rs +++ b/crates/nu-command/src/filters/prepend.rs @@ -123,8 +123,7 @@ only unwrap the outer list, and leave the variable's contents untouched."# .into_pipeline_data() .into_iter() .chain(input) - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } diff --git a/crates/nu-command/src/filters/reject.rs b/crates/nu-command/src/filters/reject.rs index 8315394da0..c10db35e9e 100644 --- a/crates/nu-command/src/filters/reject.rs +++ b/crates/nu-command/src/filters/reject.rs @@ -215,6 +215,7 @@ fn reject( cell_paths: Vec, ) -> Result { let mut unique_rows: HashSet = HashSet::new(); + let metadata = input.metadata(); let val = input.into_value(span); let mut val = val; let mut new_columns = vec![]; @@ -257,7 +258,7 @@ fn reject( for cell_path in new_columns { val.remove_data_at_cell_path(&cell_path.members)?; } - Ok(val.into_pipeline_data()) + Ok(val.into_pipeline_data_with_metadata(metadata)) } #[cfg(test)] diff --git a/crates/nu-command/src/filters/reverse.rs b/crates/nu-command/src/filters/reverse.rs index 48dedaa5ba..7809531f77 100644 --- a/crates/nu-command/src/filters/reverse.rs +++ b/crates/nu-command/src/filters/reverse.rs @@ -72,9 +72,7 @@ impl Command for Reverse { #[allow(clippy::needless_collect)] let v: Vec<_> = input.into_iter_strict(call.head)?.collect(); let iter = v.into_iter().rev(); - Ok(iter - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + Ok(iter.into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } } diff --git a/crates/nu-command/src/filters/select.rs b/crates/nu-command/src/filters/select.rs index 9560fe1c63..f6c2ae6fb6 100644 --- a/crates/nu-command/src/filters/select.rs +++ b/crates/nu-command/src/filters/select.rs @@ -244,8 +244,7 @@ fn select( rows: unique_rows.into_iter().peekable(), current: 0, } - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone()) } else { input }; @@ -285,8 +284,7 @@ fn select( Ok(output .into_iter() - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } _ => { if !columns.is_empty() { @@ -303,10 +301,9 @@ fn select( } Ok(Value::record(record, call_span) - .into_pipeline_data() - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata)) } else { - Ok(v.into_pipeline_data().set_metadata(metadata)) + Ok(v.into_pipeline_data_with_metadata(metadata)) } } } @@ -332,9 +329,7 @@ fn select( } } - Ok(values - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + Ok(values.into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } _ => Ok(PipelineData::empty()), } diff --git a/crates/nu-command/src/filters/shuffle.rs b/crates/nu-command/src/filters/shuffle.rs index be77b532c2..3afc9c6f42 100644 --- a/crates/nu-command/src/filters/shuffle.rs +++ b/crates/nu-command/src/filters/shuffle.rs @@ -38,9 +38,7 @@ impl Command for Shuffle { let mut v: Vec<_> = input.into_iter_strict(call.head)?.collect(); v.shuffle(&mut thread_rng()); let iter = v.into_iter(); - Ok(iter - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)) + Ok(iter.into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())) } fn examples(&self) -> Vec { diff --git a/crates/nu-command/src/filters/skip/skip_.rs b/crates/nu-command/src/filters/skip/skip_.rs index 7bd2256750..09763d8e31 100644 --- a/crates/nu-command/src/filters/skip/skip_.rs +++ b/crates/nu-command/src/filters/skip/skip_.rs @@ -130,22 +130,17 @@ impl Command for Skip { } } - Ok(Value::binary(output, bytes_span) - .into_pipeline_data() - .set_metadata(metadata)) + Ok(Value::binary(output, bytes_span).into_pipeline_data_with_metadata(metadata)) } PipelineData::Value(Value::Binary { val, .. }, metadata) => { let bytes = val.into_iter().skip(n).collect::>(); - Ok(Value::binary(bytes, input_span) - .into_pipeline_data() - .set_metadata(metadata)) + Ok(Value::binary(bytes, input_span).into_pipeline_data_with_metadata(metadata)) } _ => Ok(input .into_iter_strict(call.head)? .skip(n) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), } } } diff --git a/crates/nu-command/src/filters/skip/skip_until.rs b/crates/nu-command/src/filters/skip/skip_until.rs index 4dd76fd051..06fce9baee 100644 --- a/crates/nu-command/src/filters/skip/skip_until.rs +++ b/crates/nu-command/src/filters/skip/skip_until.rs @@ -113,8 +113,7 @@ impl Command for SkipUntil { pipeline_data.into_value(span).is_true() }) }) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/skip/skip_while.rs b/crates/nu-command/src/filters/skip/skip_while.rs index ec2fd83b69..6202a96780 100644 --- a/crates/nu-command/src/filters/skip/skip_while.rs +++ b/crates/nu-command/src/filters/skip/skip_while.rs @@ -118,8 +118,7 @@ impl Command for SkipWhile { pipeline_data.into_value(span).is_true() }) }) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/take/take_.rs b/crates/nu-command/src/filters/take/take_.rs index 97b3da9e5a..eceda4f4f6 100644 --- a/crates/nu-command/src/filters/take/take_.rs +++ b/crates/nu-command/src/filters/take/take_.rs @@ -60,8 +60,7 @@ impl Command for Take { Value::List { vals, .. } => Ok(vals .into_iter() .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), Value::Binary { val, .. } => { let slice: Vec = val.into_iter().take(rows_desired).collect(); Ok(PipelineData::Value(Value::binary(slice, span), metadata)) @@ -69,8 +68,7 @@ impl Command for Take { Value::Range { val, .. } => Ok(val .into_range_iter(ctrlc.clone())? .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), // Propagate errors by explicitly matching them before the final case. Value::Error { error, .. } => Err(*error), other => Err(ShellError::OnlySupportsThisInputType { @@ -83,8 +81,7 @@ impl Command for Take { } PipelineData::ListStream(ls, metadata) => Ok(ls .take(rows_desired) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), PipelineData::ExternalStream { span, .. } => { Err(ShellError::OnlySupportsThisInputType { exp_input_type: "list, binary or range".into(), diff --git a/crates/nu-command/src/filters/take/take_until.rs b/crates/nu-command/src/filters/take/take_until.rs index ed65c1c3d0..b1daca58d8 100644 --- a/crates/nu-command/src/filters/take/take_until.rs +++ b/crates/nu-command/src/filters/take/take_until.rs @@ -75,6 +75,7 @@ impl Command for TakeUntil { call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let span = call.head; let capture_block: Closure = call.req(engine_state, stack, 0)?; @@ -109,7 +110,7 @@ impl Command for TakeUntil { pipeline_data.into_value(span).is_true() }) }) - .into_pipeline_data(ctrlc)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/take/take_while.rs b/crates/nu-command/src/filters/take/take_while.rs index 10a43f3d47..dddbd4c435 100644 --- a/crates/nu-command/src/filters/take/take_while.rs +++ b/crates/nu-command/src/filters/take/take_while.rs @@ -75,6 +75,7 @@ impl Command for TakeWhile { call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let span = call.head; let capture_block: Closure = call.req(engine_state, stack, 0)?; @@ -109,7 +110,7 @@ impl Command for TakeWhile { pipeline_data.into_value(span).is_true() }) }) - .into_pipeline_data(ctrlc)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/transpose.rs b/crates/nu-command/src/filters/transpose.rs index ccb0a65182..433930a04c 100644 --- a/crates/nu-command/src/filters/transpose.rs +++ b/crates/nu-command/src/filters/transpose.rs @@ -291,7 +291,7 @@ pub fn transpose( metadata, )) } else { - Ok(result_data.into_pipeline_data(ctrlc).set_metadata(metadata)) + Ok(result_data.into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/uniq.rs b/crates/nu-command/src/filters/uniq.rs index 26e2576690..dcf965a0f5 100644 --- a/crates/nu-command/src/filters/uniq.rs +++ b/crates/nu-command/src/filters/uniq.rs @@ -311,9 +311,7 @@ pub fn uniq( uniq_values.into_iter().map(|v| v.val).collect() }; - Ok(Value::list(result, head) - .into_pipeline_data() - .set_metadata(metadata)) + Ok(Value::list(result, head).into_pipeline_data_with_metadata(metadata)) } fn sort(iter: IntoIter) -> Vec { diff --git a/crates/nu-command/src/filters/upsert.rs b/crates/nu-command/src/filters/upsert.rs index c4ea332a44..a3e287dff7 100644 --- a/crates/nu-command/src/filters/upsert.rs +++ b/crates/nu-command/src/filters/upsert.rs @@ -128,6 +128,7 @@ fn upsert( call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let span = call.head; let cell_path: CellPath = call.req(engine_state, stack, 0)?; @@ -148,43 +149,45 @@ fn upsert( let orig_env_vars = stack.env_vars.clone(); let orig_env_hidden = stack.env_hidden.clone(); - input.map( - move |mut input| { - // with_env() is used here to ensure that each iteration uses - // a different set of environment variables. - // Hence, a 'cd' in the first loop won't affect the next loop. - stack.with_env(&orig_env_vars, &orig_env_hidden); + input + .map( + move |mut input| { + // with_env() is used here to ensure that each iteration uses + // a different set of environment variables. + // Hence, a 'cd' in the first loop won't affect the next loop. + stack.with_env(&orig_env_vars, &orig_env_hidden); - if let Some(var) = block.signature.get_positional(0) { - if let Some(var_id) = &var.var_id { - stack.add_var(*var_id, input.clone()) - } - } - - let output = eval_block( - &engine_state, - &mut stack, - &block, - input.clone().into_pipeline_data(), - redirect_stdout, - redirect_stderr, - ); - - match output { - Ok(pd) => { - if let Err(e) = - input.upsert_data_at_cell_path(&cell_path.members, pd.into_value(span)) - { - return Value::error(e, span); + if let Some(var) = block.signature.get_positional(0) { + if let Some(var_id) = &var.var_id { + stack.add_var(*var_id, input.clone()) } - - input } - Err(e) => Value::error(e, span), - } - }, - ctrlc, - ) + + let output = eval_block( + &engine_state, + &mut stack, + &block, + input.clone().into_pipeline_data(), + redirect_stdout, + redirect_stderr, + ); + + match output { + Ok(pd) => { + if let Err(e) = input + .upsert_data_at_cell_path(&cell_path.members, pd.into_value(span)) + { + return Value::error(e, span); + } + + input + } + Err(e) => Value::error(e, span), + } + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } else { if let Some(PathMember::Int { val, span, .. }) = cell_path.members.first() { let mut input = input.into_iter(); @@ -208,21 +211,24 @@ fn upsert( .into_iter() .chain(vec![replacement]) .chain(input) - .into_pipeline_data(ctrlc)); + .into_pipeline_data_with_metadata(metadata, ctrlc)); } - input.map( - move |mut input| { - let replacement = replacement.clone(); + input + .map( + move |mut input| { + let replacement = replacement.clone(); - if let Err(e) = input.upsert_data_at_cell_path(&cell_path.members, replacement) { - return Value::error(e, span); - } + if let Err(e) = input.upsert_data_at_cell_path(&cell_path.members, replacement) + { + return Value::error(e, span); + } - input - }, - ctrlc, - ) + input + }, + ctrlc, + ) + .map(|x| x.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/values.rs b/crates/nu-command/src/filters/values.rs index e74c8a65fe..1a2c847fa0 100644 --- a/crates/nu-command/src/filters/values.rs +++ b/crates/nu-command/src/filters/values.rs @@ -149,8 +149,7 @@ fn values( Value::List { vals, .. } => match get_values(&vals, head, span) { Ok(cols) => Ok(cols .into_iter() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), Err(err) => Err(err), }, Value::CustomValue { val, .. } => { @@ -158,15 +157,13 @@ fn values( match get_values(&[input_as_base_value], head, span) { Ok(cols) => Ok(cols .into_iter() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), Err(err) => Err(err), } } Value::Record { val, .. } => Ok(val .into_values() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), Value::LazyRecord { val, .. } => { let record = match val.collect()? { Value::Record { val, .. } => val, @@ -178,8 +175,7 @@ fn values( }; Ok(record .into_values() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } // Propagate errors Value::Error { error, .. } => Err(*error), @@ -196,8 +192,7 @@ fn values( match get_values(&vals, head, head) { Ok(cols) => Ok(cols .into_iter() - .into_pipeline_data(ctrlc) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, ctrlc)), Err(err) => Err(err), } } diff --git a/crates/nu-command/src/filters/where_.rs b/crates/nu-command/src/filters/where_.rs index 0ee20856f7..201473ba6c 100644 --- a/crates/nu-command/src/filters/where_.rs +++ b/crates/nu-command/src/filters/where_.rs @@ -102,8 +102,7 @@ not supported."# Err(err) => Some(Value::error(err, span)), } }) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } fn examples(&self) -> Vec { diff --git a/crates/nu-command/src/filters/window.rs b/crates/nu-command/src/filters/window.rs index 8ebddb6250..55d30c6a68 100644 --- a/crates/nu-command/src/filters/window.rs +++ b/crates/nu-command/src/filters/window.rs @@ -135,9 +135,7 @@ impl Command for Window { remainder, }; - Ok(each_group_iterator - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + Ok(each_group_iterator.into_pipeline_data_with_metadata(metadata, ctrlc)) } } diff --git a/crates/nu-command/src/filters/wrap.rs b/crates/nu-command/src/filters/wrap.rs index 75171a798a..082ebf5897 100644 --- a/crates/nu-command/src/filters/wrap.rs +++ b/crates/nu-command/src/filters/wrap.rs @@ -48,17 +48,14 @@ impl Command for Wrap { | PipelineData::ListStream { .. } => Ok(input .into_iter() .map(move |x| Value::record(record! { name.clone() => x }, span)) - .into_pipeline_data(engine_state.ctrlc.clone()) - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata, engine_state.ctrlc.clone())), PipelineData::ExternalStream { .. } => Ok(Value::record( record! { name => input.into_value(call.head) }, span, ) - .into_pipeline_data() - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata)), PipelineData::Value(input, ..) => Ok(Value::record(record! { name => input }, span) - .into_pipeline_data() - .set_metadata(metadata)), + .into_pipeline_data_with_metadata(metadata)), } } diff --git a/crates/nu-command/src/filters/zip.rs b/crates/nu-command/src/filters/zip.rs index 7454513027..1b37bd110f 100644 --- a/crates/nu-command/src/filters/zip.rs +++ b/crates/nu-command/src/filters/zip.rs @@ -100,8 +100,7 @@ impl Command for Zip { .into_iter() .zip(other.into_pipeline_data()) .map(move |(x, y)| Value::list(vec![x, y], head)) - .into_pipeline_data(ctrlc) - .set_metadata(metadata)) + .into_pipeline_data_with_metadata(metadata, ctrlc)) } }