Skip to content

Commit d9bc12d

Browse files
Fix YAML merge key precedence logic
Co-authored-by: waldekmastykarz <11164679+waldekmastykarz@users.noreply.github.com>
1 parent 05c08c4 commit d9bc12d

2 files changed

Lines changed: 26 additions & 7 deletions

File tree

DevProxy.Abstractions/Extensions/YamlConfigurationExtensions.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private void FlattenMappingNode(YamlMappingNode mappingNode, string prefix)
110110
var fullKey = string.IsNullOrEmpty(prefix)
111111
? kvp.Key
112112
: $"{prefix}{ConfigurationPath.KeyDelimiter}{kvp.Key}";
113-
Data.TryAdd(fullKey, kvp.Value);
113+
Data[fullKey] = kvp.Value;
114114
}
115115

116116
// Then process regular keys (they override merged values)
@@ -167,7 +167,8 @@ private void CollectMergedValuesFromNode(YamlNode node, string prefix, Dictionar
167167
}
168168
break;
169169
case YamlScalarNode scalarNode:
170-
values.TryAdd(prefix, scalarNode.Value);
170+
// Later values override earlier values within merged content
171+
values[prefix] = scalarNode.Value;
171172
break;
172173
}
173174
}

DevProxy.Abstractions/Utils/ProxyYaml.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,21 @@ public static bool TryConvertYamlToJson(string yamlContent, out string? jsonCont
100100
{
101101
var result = new Dictionary<string, object?>();
102102

103+
// First, process all merge keys to get merged values
104+
var mergedValues = new Dictionary<string, object?>();
103105
foreach (var entry in mappingNode.Children)
104106
{
105107
var key = ((YamlScalarNode)entry.Key).Value ?? string.Empty;
106108

107-
// Handle YAML merge key (<<)
108109
if (key == "<<")
109110
{
110-
// Merge the referenced mapping into the current one
111111
if (entry.Value is YamlMappingNode mergeMapping)
112112
{
113113
var mergeDict = ConvertMappingNode(mergeMapping);
114114
foreach (var kvp in mergeDict)
115115
{
116-
// Only add if not already present (current values take precedence)
117-
result.TryAdd(kvp.Key, kvp.Value);
116+
// Later merges override earlier merges
117+
mergedValues[kvp.Key] = kvp.Value;
118118
}
119119
}
120120
else if (entry.Value is YamlSequenceNode mergeSequence)
@@ -127,14 +127,32 @@ public static bool TryConvertYamlToJson(string yamlContent, out string? jsonCont
127127
var mergeDict = ConvertMappingNode(itemMapping);
128128
foreach (var kvp in mergeDict)
129129
{
130-
result.TryAdd(kvp.Key, kvp.Value);
130+
mergedValues[kvp.Key] = kvp.Value;
131131
}
132132
}
133133
}
134134
}
135+
}
136+
}
137+
138+
// Add merged values to result first
139+
foreach (var kvp in mergedValues)
140+
{
141+
result[kvp.Key] = kvp.Value;
142+
}
143+
144+
// Then, process explicit keys (they override merged values)
145+
foreach (var entry in mappingNode.Children)
146+
{
147+
var key = ((YamlScalarNode)entry.Key).Value ?? string.Empty;
148+
149+
// Skip merge keys
150+
if (key == "<<")
151+
{
135152
continue;
136153
}
137154

155+
// Explicit keys always override merged values
138156
result[key] = ConvertNode(entry.Value);
139157
}
140158

0 commit comments

Comments
 (0)