From 415242b299cfcb3c2824da5ee525dd08ac4e8f30 Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Tue, 25 Mar 2025 19:42:12 +0000 Subject: [PATCH] Fix formatting of YAML merge key error messages --- src/metadata/error.rs | 3 ++- src/metadata/yaml/merge.rs | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/metadata/error.rs b/src/metadata/error.rs index 50b33752..e3ae9d4a 100644 --- a/src/metadata/error.rs +++ b/src/metadata/error.rs @@ -347,12 +347,13 @@ impl std::fmt::Display for YamlMergeKeyError { let yaml = to_yaml(&self.value); if saphyr::YamlEmitter::new(&mut output).dump(&yaml).is_ok() { + // The emitter starts the dumped YAML with ---\n, so strip that. write!( f, "invalid YAML merge key value at line {} column {}: {}", self.value.span.start.line(), self.value.span.start.col(), - output + output.get(4..).unwrap_or_default() ) } else { write!( diff --git a/src/metadata/yaml/merge.rs b/src/metadata/yaml/merge.rs index 89994125..f16c0b88 100644 --- a/src/metadata/yaml/merge.rs +++ b/src/metadata/yaml/merge.rs @@ -72,3 +72,49 @@ fn merge_hashes( } hash1 } + +#[cfg(test)] +mod tests { + use super::*; + + mod process_merge_keys { + use crate::metadata::parse; + + use super::*; + + #[test] + fn should_error_if_merge_key_value_has_a_single_value_that_is_not_a_hash() { + let yaml = parse( + " +- &anchor1 test +- <<: *anchor1 + value: test-value-2", + ); + + let error_message = process_merge_keys(yaml).unwrap_err().to_string(); + + assert_eq!( + "invalid YAML merge key value at line 3 column 6: test", + error_message + ); + } + + #[test] + fn should_error_if_merge_key_value_is_an_array_of_non_hash_values() { + let yaml = parse( + " +- &anchor1 {key: test-key} +- &anchor2 test +- <<: [*anchor1, *anchor2] + value: test-value-2", + ); + + let error_message = process_merge_keys(yaml).unwrap_err().to_string(); + + assert_eq!( + "invalid YAML merge key value at line 4 column 17: test", + error_message + ); + } + } +}