Merge two parameter sets, with inline parameters taking precedence over file parameters. Top-level keys (like "parameters") are merged recursively, but parameter values themselves are replaced (not merged) when specified inline. # Arguments `file_params` - Parameters from file (JSON or YAML format) `inline_params` - Inline parameters (JSON or YAML format) that take precedence # Returns `Result
(file_params: &str, inline_params: &str)
| 654 | /// - Either parameter set cannot be parsed as valid JSON or YAML |
| 655 | /// - The merged result cannot be serialized to JSON |
| 656 | pub fn merge_parameters(file_params: &str, inline_params: &str) -> Result<String, DscError> { |
| 657 | use serde_json::Value; |
| 658 | |
| 659 | // Convert both parameter inputs to maps |
| 660 | let mut file_map = params_to_map(file_params, "FileParameters")?; |
| 661 | let inline_map = params_to_map(inline_params, "InlineParameters")?; |
| 662 | |
| 663 | // Merge top-level keys |
| 664 | for (key, inline_value) in &inline_map { |
| 665 | if key == "parameters" { |
| 666 | // Special handling for "parameters" key - merge at parameter name level only |
| 667 | // Within each parameter name, inline replaces (not merges) |
| 668 | if let Some(file_params_value) = file_map.get_mut("parameters") { |
| 669 | if let (Some(file_params_obj), Some(inline_params_obj)) = (file_params_value.as_object_mut(), inline_value.as_object()) { |
| 670 | // For each parameter in inline, replace (not merge) in file |
| 671 | for (param_name, param_value) in inline_params_obj { |
| 672 | file_params_obj.insert(param_name.clone(), param_value.clone()); |
| 673 | } |
| 674 | } else { |
| 675 | // If one is not an object, inline replaces completely |
| 676 | file_map.insert(key.clone(), inline_value.clone()); |
| 677 | } |
| 678 | } else { |
| 679 | // "parameters" key doesn't exist in file, add it |
| 680 | file_map.insert(key.clone(), inline_value.clone()); |
| 681 | } |
| 682 | } else { |
| 683 | // For other top-level keys, inline value replaces file value |
| 684 | file_map.insert(key.clone(), inline_value.clone()); |
| 685 | } |
| 686 | } |
| 687 | |
| 688 | let merged = Value::Object(file_map); |
| 689 | Ok(serde_json::to_string(&merged)?) |
| 690 | } |
no test coverage detected