From 7a181960b7c660d070ea82868f53205e8a259653 Mon Sep 17 00:00:00 2001 From: Ian Manske Date: Tue, 13 Feb 2024 23:59:14 +0000 Subject: [PATCH] Prevent duplicate records keys when decoding from nuon (#11807) # Description Fixes #11749: `from nuon` allows duplicate record keys --- crates/nu-command/src/formats/from/nuon.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/nu-command/src/formats/from/nuon.rs b/crates/nu-command/src/formats/from/nuon.rs index c3a75057bf..edaccb51f2 100644 --- a/crates/nu-command/src/formats/from/nuon.rs +++ b/crates/nu-command/src/formats/from/nuon.rs @@ -310,7 +310,8 @@ fn convert_to_value( )) } Expr::Record(key_vals) => { - let mut record = Record::new(); + let mut record = Record::with_capacity(key_vals.len()); + let mut key_spans = Vec::with_capacity(key_vals.len()); for key_val in key_vals { match key_val { @@ -327,9 +328,16 @@ fn convert_to_value( } }; - let value = convert_to_value(val, span, original_text)?; - - record.push(key_str, value); + if let Some(i) = record.index_of(&key_str) { + return Err(ShellError::ColumnDefinedTwice { + col_name: key_str, + second_use: key.span, + first_use: key_spans[i], + }); + } else { + key_spans.push(key.span); + record.push(key_str, convert_to_value(val, span, original_text)?); + } } RecordItem::Spread(_, inner) => { return Err(ShellError::OutsideSpannedLabeledError {