diff --git a/crates/nu-command/src/filters/collect.rs b/crates/nu-command/src/filters/collect.rs index c9de01ca40..e426af9f0e 100644 --- a/crates/nu-command/src/filters/collect.rs +++ b/crates/nu-command/src/filters/collect.rs @@ -37,6 +37,7 @@ impl Command for Collect { let block = engine_state.get_block(capture_block.block_id).clone(); let mut stack = stack.captures_to_stack(&capture_block.captures); + let metadata = input.metadata(); let input: Value = input.into_value(call.head); if let Some(var) = block.signature.get_positional(0) { @@ -53,6 +54,7 @@ impl Command for Collect { call.redirect_stdout, call.redirect_stderr, ) + .map(|x| x.set_metadata(metadata)) } fn examples(&self) -> Vec { diff --git a/crates/nu-command/src/filters/compact.rs b/crates/nu-command/src/filters/compact.rs index 3cf99312dc..1a9d6b140c 100644 --- a/crates/nu-command/src/filters/compact.rs +++ b/crates/nu-command/src/filters/compact.rs @@ -77,31 +77,34 @@ pub fn compact( input: PipelineData, ) -> Result { let columns: Vec = call.rest(engine_state, stack, 0)?; - input.filter( - move |item| { - match item { - // Nothing is filtered out - Value::Nothing { .. } => false, - Value::Record { .. } => { - for column in columns.iter() { - match item.get_data_by_key(column) { - None => return false, - Some(x) => { - if let Value::Nothing { .. } = x { - return false; + let metadata = input.metadata(); + input + .filter( + move |item| { + match item { + // Nothing is filtered out + Value::Nothing { .. } => false, + Value::Record { .. } => { + for column in columns.iter() { + match item.get_data_by_key(column) { + None => return false, + Some(x) => { + if let Value::Nothing { .. } = x { + return false; + } } } } + // No defined columns contained Nothing + true } - // No defined columns contained Nothing - true + // Any non-Nothing, non-record should be kept + _ => true, } - // Any non-Nothing, non-record should be kept - _ => true, - } - }, - engine_state.ctrlc.clone(), - ) + }, + engine_state.ctrlc.clone(), + ) + .map(|m| m.set_metadata(metadata)) } #[cfg(test)] diff --git a/crates/nu-command/src/filters/each.rs b/crates/nu-command/src/filters/each.rs index 2dda3e93da..0f8b3f5186 100644 --- a/crates/nu-command/src/filters/each.rs +++ b/crates/nu-command/src/filters/each.rs @@ -113,6 +113,7 @@ impl Command for Each { let numbered = call.has_flag("numbered"); let keep_empty = call.has_flag("keep-empty"); + let metadata = input.metadata(); let ctrlc = engine_state.ctrlc.clone(); let outer_ctrlc = engine_state.ctrlc.clone(); let engine_state = engine_state.clone(); @@ -243,6 +244,7 @@ impl Command for Each { outer_ctrlc, ) }) + .map(|x| x.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/every.rs b/crates/nu-command/src/filters/every.rs index 59e15bee2d..71cf5462c6 100644 --- a/crates/nu-command/src/filters/every.rs +++ b/crates/nu-command/src/filters/every.rs @@ -69,6 +69,8 @@ impl Command for Every { let skip = call.has_flag("skip"); + let metadata = input.metadata(); + Ok(input .into_iter() .enumerate() @@ -79,7 +81,8 @@ impl Command for Every { None } }) - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data(engine_state.ctrlc.clone()) + .set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/flatten.rs b/crates/nu-command/src/filters/flatten.rs index 4be616e9e5..a6c5bf6fa6 100644 --- a/crates/nu-command/src/filters/flatten.rs +++ b/crates/nu-command/src/filters/flatten.rs @@ -112,11 +112,14 @@ fn flatten( ) -> Result { let tag = call.head; let columns: Vec = call.rest(engine_state, stack, 0)?; + let metadata = input.metadata(); - input.flat_map( - move |item| flat_value(&columns, &item, tag), - engine_state.ctrlc.clone(), - ) + input + .flat_map( + move |item| flat_value(&columns, &item, tag), + engine_state.ctrlc.clone(), + ) + .map(|x| x.set_metadata(metadata)) } enum TableInside<'a> { diff --git a/crates/nu-command/src/filters/get.rs b/crates/nu-command/src/filters/get.rs index 8077de9d76..2c43318a0d 100644 --- a/crates/nu-command/src/filters/get.rs +++ b/crates/nu-command/src/filters/get.rs @@ -46,6 +46,7 @@ impl Command for Get { let rest: Vec = call.rest(engine_state, stack, 1)?; let ignore_errors = call.has_flag("ignore-errors"); let ctrlc = engine_state.ctrlc.clone(); + let metadata = input.metadata(); if rest.is_empty() { let output = input @@ -81,6 +82,7 @@ impl Command for Get { Ok(output.into_iter().into_pipeline_data(ctrlc)) } + .map(|x| x.set_metadata(metadata)) } fn examples(&self) -> Vec { vec![ diff --git a/crates/nu-command/src/filters/group.rs b/crates/nu-command/src/filters/group.rs index 1125ae47e5..414d26ffe2 100644 --- a/crates/nu-command/src/filters/group.rs +++ b/crates/nu-command/src/filters/group.rs @@ -73,6 +73,7 @@ impl Command for Group { ) -> Result { let group_size: Spanned = call.req(engine_state, stack, 0)?; let ctrlc = engine_state.ctrlc.clone(); + let metadata = input.metadata(); //FIXME: add in support for external redirection when engine-q supports it generally @@ -82,7 +83,9 @@ impl Command for Group { span: call.head, }; - Ok(each_group_iterator.into_pipeline_data(ctrlc)) + Ok(each_group_iterator + .into_pipeline_data(ctrlc) + .set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/headers.rs b/crates/nu-command/src/filters/headers.rs index 5b25cd9dbf..5041beae16 100644 --- a/crates/nu-command/src/filters/headers.rs +++ b/crates/nu-command/src/filters/headers.rs @@ -77,11 +77,12 @@ impl Command for Headers { input: PipelineData, ) -> Result { let config = stack.get_config()?; + let metadata = input.metadata(); let value = input.into_value(call.head); let headers = extract_headers(&value, &config)?; let new_headers = replace_headers(value, &headers)?; - Ok(new_headers.into_pipeline_data()) + Ok(new_headers.into_pipeline_data().set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/par_each.rs b/crates/nu-command/src/filters/par_each.rs index 60bb5f099e..29c60f6de3 100644 --- a/crates/nu-command/src/filters/par_each.rs +++ b/crates/nu-command/src/filters/par_each.rs @@ -61,6 +61,7 @@ impl Command for ParEach { let capture_block: CaptureBlock = call.req(engine_state, stack, 0)?; let numbered = call.has_flag("numbered"); + let metadata = input.metadata(); let ctrlc = engine_state.ctrlc.clone(); let engine_state = engine_state.clone(); let block_id = capture_block.block_id; @@ -288,6 +289,7 @@ impl Command for ParEach { ) } } + .map(|res| res.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/prepend.rs b/crates/nu-command/src/filters/prepend.rs index b7685b3877..689b2a8fa9 100644 --- a/crates/nu-command/src/filters/prepend.rs +++ b/crates/nu-command/src/filters/prepend.rs @@ -82,12 +82,14 @@ impl Command for Prepend { ) -> Result { let val: Value = call.req(engine_state, stack, 0)?; let vec: Vec = process_value(val); + let metadata = input.metadata(); Ok(vec .into_iter() .chain(input) .into_iter() - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data(engine_state.ctrlc.clone()) + .set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/range.rs b/crates/nu-command/src/filters/range.rs index 9584c494a5..92944d7b79 100644 --- a/crates/nu-command/src/filters/range.rs +++ b/crates/nu-command/src/filters/range.rs @@ -65,6 +65,7 @@ impl Command for Range { call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let rows: nu_protocol::Range = call.req(engine_state, stack, 0)?; let rows_from = get_range_val(rows.from); @@ -112,6 +113,7 @@ impl Command for Range { Ok(iter.into_pipeline_data(engine_state.ctrlc.clone())) } } + .map(|x| x.set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/reject.rs b/crates/nu-command/src/filters/reject.rs index 3497f819a4..d12150c680 100644 --- a/crates/nu-command/src/filters/reject.rs +++ b/crates/nu-command/src/filters/reject.rs @@ -72,6 +72,7 @@ fn reject( if columns.is_empty() { return Err(ShellError::CantFindColumn(span, span)); } + let metadata = input.metadata(); let mut keep_columns = vec![]; @@ -160,6 +161,7 @@ fn reject( } x => Ok(x), } + .map(|x| x.set_metadata(metadata)) } fn get_input_cols(input: Vec) -> Vec { diff --git a/crates/nu-command/src/filters/rename.rs b/crates/nu-command/src/filters/rename.rs index 5abe6c26c9..08da7c78b3 100644 --- a/crates/nu-command/src/filters/rename.rs +++ b/crates/nu-command/src/filters/rename.rs @@ -110,49 +110,52 @@ fn rename( } let columns: Vec = call.rest(engine_state, stack, 0)?; + let metadata = input.metadata(); - input.map( - move |item| match item { - Value::Record { - mut cols, - vals, - span, - } => { - match &specified_column { - Some(c) => { - // check if the specified column to be renamed exists - if !cols.contains(&c[0]) { - return Value::Error { - error: ShellError::UnsupportedInput( - "The specified column does not exist".to_string(), - specified_col_span.unwrap_or(span), - ), - }; + input + .map( + move |item| match item { + Value::Record { + mut cols, + vals, + span, + } => { + match &specified_column { + Some(c) => { + // check if the specified column to be renamed exists + if !cols.contains(&c[0]) { + return Value::Error { + error: ShellError::UnsupportedInput( + "The specified column does not exist".to_string(), + specified_col_span.unwrap_or(span), + ), + }; + } + for (idx, val) in cols.iter_mut().enumerate() { + if *val == c[0] { + cols[idx] = c[1].to_string(); + break; + } + } } - for (idx, val) in cols.iter_mut().enumerate() { - if *val == c[0] { - cols[idx] = c[1].to_string(); - break; + None => { + for (idx, val) in columns.iter().enumerate() { + if idx >= cols.len() { + // skip extra new columns names if we already reached the final column + break; + } + cols[idx] = val.clone(); } } } - None => { - for (idx, val) in columns.iter().enumerate() { - if idx >= cols.len() { - // skip extra new columns names if we already reached the final column - break; - } - cols[idx] = val.clone(); - } - } + + Value::Record { cols, vals, span } } - - Value::Record { cols, vals, span } - } - x => x, - }, - engine_state.ctrlc.clone(), - ) + x => x, + }, + engine_state.ctrlc.clone(), + ) + .map(|x| x.set_metadata(metadata)) } #[cfg(test)] diff --git a/crates/nu-command/src/filters/rotate.rs b/crates/nu-command/src/filters/rotate.rs index 6781fc4ee3..2d4cced010 100644 --- a/crates/nu-command/src/filters/rotate.rs +++ b/crates/nu-command/src/filters/rotate.rs @@ -205,6 +205,7 @@ pub fn rotate( call: &Call, input: PipelineData, ) -> Result { + let metadata = input.metadata(); let col_given_names: Vec = call.rest(engine_state, stack, 0)?; let mut values = input.into_iter().collect::>(); let mut old_column_names = vec![]; @@ -288,7 +289,8 @@ pub fn rotate( }], span: call.head, } - .into_pipeline_data()); + .into_pipeline_data() + .set_metadata(metadata)); } // holder for the new records @@ -344,7 +346,8 @@ pub fn rotate( vals: final_values, span: call.head, } - .into_pipeline_data()) + .into_pipeline_data() + .set_metadata(metadata)) } #[cfg(test)] diff --git a/crates/nu-command/src/filters/select.rs b/crates/nu-command/src/filters/select.rs index eeea838950..f59ddb4af2 100644 --- a/crates/nu-command/src/filters/select.rs +++ b/crates/nu-command/src/filters/select.rs @@ -90,6 +90,7 @@ fn select( let input = if !rows.is_empty() { rows.sort_unstable(); // let skip = call.has_flag("skip"); + let metadata = input.metadata(); let pipeline_iter: PipelineIterator = input.into_iter(); NthIterator { @@ -99,6 +100,7 @@ fn select( current: 0, } .into_pipeline_data(engine_state.ctrlc.clone()) + .set_metadata(metadata) } else { input }; @@ -109,6 +111,7 @@ fn select( vals: input_vals, span, }, + metadata, .., ) => { let mut output = vec![]; @@ -133,9 +136,10 @@ fn select( Ok(output .into_iter() - .into_pipeline_data(engine_state.ctrlc.clone())) + .into_pipeline_data(engine_state.ctrlc.clone()) + .set_metadata(metadata)) } - PipelineData::ListStream(stream, ..) => Ok(stream + PipelineData::ListStream(stream, metadata, ..) => Ok(stream .map(move |x| { if !columns.is_empty() { let mut cols = vec![]; @@ -158,8 +162,9 @@ fn select( x } }) - .into_pipeline_data(engine_state.ctrlc.clone())), - PipelineData::Value(v, ..) => { + .into_pipeline_data(engine_state.ctrlc.clone()) + .set_metadata(metadata)), + PipelineData::Value(v, metadata, ..) => { if !columns.is_empty() { let mut cols = vec![]; let mut vals = vec![]; @@ -172,9 +177,11 @@ fn select( vals.push(result); } - Ok(Value::Record { cols, vals, span }.into_pipeline_data()) + Ok(Value::Record { cols, vals, span } + .into_pipeline_data() + .set_metadata(metadata)) } else { - Ok(v.into_pipeline_data()) + Ok(v.into_pipeline_data().set_metadata(metadata)) } } _ => Ok(PipelineData::new(span)), diff --git a/crates/nu-command/src/filters/transpose.rs b/crates/nu-command/src/filters/transpose.rs index 2cbb5795ce..b85738f998 100644 --- a/crates/nu-command/src/filters/transpose.rs +++ b/crates/nu-command/src/filters/transpose.rs @@ -133,6 +133,7 @@ pub fn transpose( }; let ctrlc = engine_state.ctrlc.clone(); + let metadata = input.metadata(); let input: Vec<_> = input.into_iter().collect(); let args = transpose_args; @@ -226,7 +227,8 @@ pub fn transpose( span: name, } })) - .into_pipeline_data(ctrlc)) + .into_pipeline_data(ctrlc) + .set_metadata(metadata)) } #[cfg(test)] diff --git a/crates/nu-command/src/filters/update_cells.rs b/crates/nu-command/src/filters/update_cells.rs index bf7ebda4e4..6dc33b6b9d 100644 --- a/crates/nu-command/src/filters/update_cells.rs +++ b/crates/nu-command/src/filters/update_cells.rs @@ -129,6 +129,7 @@ impl Command for UpdateCells { let orig_env_vars = stack.env_vars.clone(); let orig_env_hidden = stack.env_hidden.clone(); + let metadata = input.metadata(); let ctrlc = engine_state.ctrlc.clone(); let block: Block = engine_state.get_block(block.block_id).clone(); @@ -163,7 +164,8 @@ impl Command for UpdateCells { redirect_stderr, span, } - .into_pipeline_data(ctrlc)) + .into_pipeline_data(ctrlc) + .set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/window.rs b/crates/nu-command/src/filters/window.rs index b1a049ddb4..0480cd2465 100644 --- a/crates/nu-command/src/filters/window.rs +++ b/crates/nu-command/src/filters/window.rs @@ -144,6 +144,7 @@ impl Command for Window { ) -> Result { let group_size: Spanned = call.req(engine_state, stack, 0)?; let ctrlc = engine_state.ctrlc.clone(); + let metadata = input.metadata(); let stride: Option = call.get_flag(engine_state, stack, "stride")?; let stride = stride.unwrap_or(1); @@ -158,7 +159,9 @@ impl Command for Window { stride, }; - Ok(each_group_iterator.into_pipeline_data(ctrlc)) + Ok(each_group_iterator + .into_pipeline_data(ctrlc) + .set_metadata(metadata)) } } diff --git a/crates/nu-command/src/filters/zip_.rs b/crates/nu-command/src/filters/zip_.rs index 6f36288ca4..95ad43f068 100644 --- a/crates/nu-command/src/filters/zip_.rs +++ b/crates/nu-command/src/filters/zip_.rs @@ -87,6 +87,7 @@ impl Command for Zip { let other: Value = call.req(engine_state, stack, 0)?; let head = call.head; let ctrlc = engine_state.ctrlc.clone(); + let metadata = input.metadata(); Ok(input .into_iter() @@ -95,7 +96,8 @@ impl Command for Zip { vals: vec![x, y], span: head, }) - .into_pipeline_data(ctrlc)) + .into_pipeline_data(ctrlc) + .set_metadata(metadata)) } }