diff --git a/crates/nu-command/src/filters/select.rs b/crates/nu-command/src/filters/select.rs index 71a2389c79..f630f19df8 100644 --- a/crates/nu-command/src/filters/select.rs +++ b/crates/nu-command/src/filters/select.rs @@ -206,7 +206,6 @@ fn select( let columns = new_columns; let input = if !unique_rows.is_empty() { - // let skip = call.has_flag(engine_state, stack, "skip")?; let metadata = input.metadata(); let pipeline_iter: PipelineIterator = input.into_iter(); @@ -231,37 +230,31 @@ fn select( Value::List { vals: input_vals, .. } => { - let mut output = vec![]; - let mut columns_with_value = Vec::new(); - for input_val in input_vals { - if !columns.is_empty() { - let mut record = Record::new(); - for path in &columns { - //FIXME: improve implementation to not clone - match input_val.clone().follow_cell_path(&path.members, false) { - Ok(fetcher) => { - record.push(path.to_column_name(), fetcher); - if !columns_with_value.contains(&path) { - columns_with_value.push(path); + Ok(input_vals + .into_iter() + .map(move |input_val| { + if !columns.is_empty() { + let mut record = Record::new(); + for path in &columns { + //FIXME: improve implementation to not clone + match input_val.clone().follow_cell_path(&path.members, false) { + Ok(fetcher) => { + record.push(path.to_column_name(), fetcher); } - } - Err(e) => { - return Err(e); + Err(e) => return Value::error(e, call_span), } } + + Value::record(record, span) + } else { + input_val.clone() } - - output.push(Value::record(record, span)) - } else { - output.push(input_val) - } - } - - Ok(output.into_iter().into_pipeline_data_with_metadata( - call_span, - engine_state.signals().clone(), - metadata, - )) + }) + .into_pipeline_data_with_metadata( + call_span, + engine_state.signals().clone(), + metadata, + )) } _ => { if !columns.is_empty() { @@ -286,31 +279,29 @@ fn select( } } PipelineData::ListStream(stream, metadata, ..) => { - let mut values = vec![]; - - for x in stream { - if !columns.is_empty() { - let mut record = Record::new(); - for path in &columns { - //FIXME: improve implementation to not clone - match x.clone().follow_cell_path(&path.members, false) { - Ok(value) => { - record.push(path.to_column_name(), value); + Ok(stream + .map(move |x| { + if !columns.is_empty() { + let mut record = Record::new(); + for path in &columns { + //FIXME: improve implementation to not clone + match x.clone().follow_cell_path(&path.members, false) { + Ok(value) => { + record.push(path.to_column_name(), value); + } + Err(e) => return Value::error(e, call_span), } - Err(e) => return Err(e), } + Value::record(record, call_span) + } else { + x } - values.push(Value::record(record, call_span)); - } else { - values.push(x); - } - } - - Ok(values.into_pipeline_data_with_metadata( - call_span, - engine_state.signals().clone(), - metadata, - )) + }) + .into_pipeline_data_with_metadata( + call_span, + engine_state.signals().clone(), + metadata, + )) } _ => Ok(PipelineData::empty()), } diff --git a/crates/nu-command/tests/commands/select.rs b/crates/nu-command/tests/commands/select.rs index 004aa16d6b..534943767f 100644 --- a/crates/nu-command/tests/commands/select.rs +++ b/crates/nu-command/tests/commands/select.rs @@ -63,7 +63,7 @@ fn complex_nested_columns() { fn fails_if_given_unknown_column_name() { let actual = nu!(pipeline( r#" - echo [ + [ [first_name, last_name, rusty_at, type]; [Andrés Robalino '10/11/2013' A] @@ -71,7 +71,6 @@ fn fails_if_given_unknown_column_name() { [Yehuda Katz '10/11/2013' A] ] | select rrusty_at first_name - | length "# ));