@@ -155,33 +155,39 @@ inline static string StripOperator(const string& key, bool adding) {
155
155
}
156
156
157
157
// defined in config_data.cc
158
- bool TraverseCopyOnWrite (an<ConfigItemRef> root, const string& path,
159
- function<bool (an<ConfigItemRef> target)> writer);
158
+ an<ConfigItemRef> TypeCheckedCopyOnWrite (an<ConfigItemRef> parent,
159
+ const string& key);
160
+ an<ConfigItemRef> TraverseCopyOnWrite (an<ConfigItemRef> head,
161
+ const string& path);
160
162
161
- static bool EditNode (an<ConfigItemRef> target ,
163
+ static bool EditNode (an<ConfigItemRef> head ,
162
164
const string& key,
163
165
const an<ConfigItem>& value,
164
166
bool merge_tree) {
165
- DLOG (INFO) << " EditNode( " << key << " ," << merge_tree << " ) " ;
167
+ DLOG (INFO) << " edit node: " << key << " , merge_tree: " << merge_tree ;
166
168
bool appending = IsAppending (key);
167
169
bool merging = IsMerging (key, value, merge_tree);
168
- auto writer = [=](an<ConfigItemRef> target) {
169
- if ((appending || merging) && **target) {
170
- DLOG (INFO) << " writer: editing node" ;
171
- return !value ||
172
- (appending && (AppendToString (target, As<ConfigValue>(value)) ||
173
- AppendToList (target, As<ConfigList>(value)))) ||
174
- (merging && MergeTree (target, As<ConfigMap>(value)));
175
- } else {
176
- DLOG (INFO) << " writer: overwriting node" ;
177
- *target = value;
178
- return true ;
179
- }
180
- };
181
170
string path = StripOperator (key, appending || merging);
182
171
DLOG (INFO) << " appending: " << appending << " , merging: " << merging
183
172
<< " , path: " << path;
184
- return TraverseCopyOnWrite (target, path, writer);
173
+ auto find_target_node =
174
+ merge_tree ? &TypeCheckedCopyOnWrite : &TraverseCopyOnWrite;
175
+ auto target = find_target_node (head, path);
176
+ if (!target) {
177
+ // error finding target node; cannot write
178
+ return false ;
179
+ }
180
+ if ((appending || merging) && **target) {
181
+ DLOG (INFO) << " writer: editing node" ;
182
+ return !value || // no-op
183
+ (appending && (AppendToString (target, As<ConfigValue>(value)) ||
184
+ AppendToList (target, As<ConfigList>(value)))) ||
185
+ (merging && MergeTree (target, As<ConfigMap>(value)));
186
+ } else {
187
+ DLOG (INFO) << " writer: overwriting node" ;
188
+ *target = value;
189
+ return true ;
190
+ }
185
191
}
186
192
187
193
bool PatchLiteral::Resolve (ConfigCompiler* compiler) {
0 commit comments