diff --git a/crates/nu-command/src/filters/transpose.rs b/crates/nu-command/src/filters/transpose.rs index 873a21c90db..a85e95863ed 100644 --- a/crates/nu-command/src/filters/transpose.rs +++ b/crates/nu-command/src/filters/transpose.rs @@ -175,10 +175,22 @@ pub fn transpose( let metadata = input.metadata(); let input: Vec<_> = input.into_iter().collect(); - // Ensure error values are propagated - for i in input.iter() { - if let Value::Error { .. } = i { - return Ok(i.clone().into_pipeline_data_with_metadata(metadata)); + + // Ensure error values are propagated and non-record values are rejected + for value in input.iter() { + match value { + Value::Error { .. } => { + return Ok(value.clone().into_pipeline_data_with_metadata(metadata)) + } + Value::Record { .. } => {} // go on, this is what we're looking for + _ => { + return Err(ShellError::OnlySupportsThisInputType { + exp_input_type: "table or record".into(), + wrong_type: "list".into(), + dst_span: call.head, + src_span: value.span(), + }) + } } } diff --git a/crates/nu-command/tests/commands/transpose.rs b/crates/nu-command/tests/commands/transpose.rs index 29a7632af39..c4448fdaf65 100644 --- a/crates/nu-command/tests/commands/transpose.rs +++ b/crates/nu-command/tests/commands/transpose.rs @@ -32,3 +32,11 @@ fn throw_inner_error() { assert!(actual.err.contains(error.as_str())); } + +#[test] +fn rejects_non_table_stream_input() { + let actual = nu!("[1 2 3] | each { |it| ($it * 2) } | transpose | to nuon"); + + assert!(actual.out.is_empty()); + assert!(actual.err.contains("only table")); +}