Skip to content

Commit 1cb288d

Browse files
perf: avoid unnecessary clone in filter_value_keys
Use std::mem::take instead of cloning values when rebuilding objects. Since the original value is no longer needed after insertion, we can take ownership rather than clone, reducing memory allocations.
1 parent 383cc12 commit 1cb288d

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

src/utils.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,23 @@ pub fn merge_schema(a: &mut Value, b: &Value) {
5050
}
5151
}
5252

53+
/// Same as merge_schema but takes ownership of `b` to avoid clones.
54+
/// Use this when you don't need `b` after the merge.
55+
pub fn merge_schema_owned(a: &mut Value, b: Value) {
56+
match (a, b) {
57+
(Value::Object(a_map), Value::Object(b_map)) => {
58+
for (k, v) in b_map {
59+
if let Some(va) = a_map.get_mut(&k) {
60+
merge_schema_owned(va, v);
61+
} else {
62+
a_map.insert(k, v);
63+
}
64+
}
65+
}
66+
(a, b) => *a = b,
67+
}
68+
}
69+
5370
/// Merge schema and update some keys
5471
///
5572
/// This is a thin wrapper around `merge_schema` that additionally:
@@ -750,7 +767,7 @@ pub fn filter_value_keys(value: &mut Value) {
750767
for (key, val) in obj.iter_mut() {
751768
let new_key = escape_chars(&unescape_chars(key, true), true);
752769
filter_value_keys(val);
753-
new_obj.insert(new_key, val.clone());
770+
new_obj.insert(new_key, std::mem::take(val));
754771
}
755772

756773
*obj = new_obj;

0 commit comments

Comments
 (0)