From 8b85ec9d614c76c03e7b61a7e52d0fb19eef2f6c Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Sun, 11 Aug 2019 18:07:15 +0300 Subject: [PATCH] pass value not reference to fun --- src/lib.rs | 2 +- src/select/mod.rs | 18 +++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b42d4fb..7ee96da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -460,7 +460,7 @@ pub fn delete(value: Value, path: &str) -> Result { /// ``` pub fn replace_with(value: Value, path: &str, fun: &mut F) -> Result where - F: FnMut(&Value) -> Value, + F: FnMut(Value) -> Value, { let mut selector = SelectorMut::default(); let value = selector.str_path(path)?.value(value).replace_with(fun)?; diff --git a/src/select/mod.rs b/src/select/mod.rs index b240b11..4f286a4 100644 --- a/src/select/mod.rs +++ b/src/select/mod.rs @@ -1026,7 +1026,7 @@ pub struct SelectorMut { value: Option, } -fn replace_value Value>(tokens: Vec, value: &mut Value, fun: &mut F) { +fn replace_value Value>(tokens: Vec, value: &mut Value, fun: &mut F) { let mut target = value; for (i, token) in tokens.iter().enumerate() { @@ -1035,13 +1035,9 @@ fn replace_value Value>(tokens: Vec, value: &mut Val let target_opt = match *target_once { Value::Object(ref mut map) => { if is_last { - let v = if let Some(v) = map.get(token) { - fun(v) - } else { - return; - }; - - map.insert(token.clone(), v); + if let Some(v) = map.remove(token) { + map.insert(token.clone(), fun(v)); + } return; } map.get_mut(token) @@ -1049,8 +1045,8 @@ fn replace_value Value>(tokens: Vec, value: &mut Val Value::Array(ref mut vec) => { if let Ok(x) = token.parse::() { if is_last { - let v = { fun(&vec[x]) }; - vec[x] = v; + let v = std::mem::replace(&mut vec[x], Value::Null); + vec[x] = fun(v); return; } vec.get_mut(x) @@ -1174,7 +1170,7 @@ impl SelectorMut { } } - pub fn replace_with Value>( + pub fn replace_with Value>( &mut self, fun: &mut F, ) -> Result<&mut Self, JsonPathError> {