Return Option<Value> from fun on replace_with to all user to return None (remove the value and not replace with Null)

This commit is contained in:
Guy Korland
2019-08-26 15:41:43 +03:00
committed by freestrings
parent e0db04aed9
commit 17a8608392
6 changed files with 24 additions and 16 deletions

View File

@ -1027,15 +1027,15 @@ pub struct SelectorMut {
value: Option<Value>,
}
<<<<<<< HEAD
<<<<<<< HEAD
fn replace_value<F: FnMut(Value) -> Value>(
mut tokens: Vec<String>,
value: &mut Value,
fun: &mut F,
) {
=======
fn replace_value<F: FnMut(Value) -> Value>(mut tokens: Vec<String>, value: &mut Value, fun: &mut F) {
>>>>>>> improve performance avoid remove & insert to map
let mut target = value;
let last_index = tokens.len() - 1;
@ -1061,7 +1061,11 @@ fn replace_value<F: FnMut(Value) -> Value>(mut tokens: Vec<String>, value: &mut
if let Ok(x) = token.parse::<usize>() {
if is_last {
let v = std::mem::replace(&mut vec[x], Value::Null);
vec[x] = fun(v);
if let Some(res) = fun(v) {
vec[x] = res;
} else {
vec.remove(x);
}
return;
}
vec.get_mut(x)
@ -1167,7 +1171,11 @@ impl SelectorMut {
}
pub fn delete(&mut self) -> Result<&mut Self, JsonPathError> {
self.replace_with(&mut |_| Value::Null)
self.replace_with(&mut |_| Some(Value::Null))
}
pub fn remove(&mut self) -> Result<&mut Self, JsonPathError> {
self.replace_with(&mut |_| None)
}
fn select(&self) -> Result<Vec<&Value>, JsonPathError> {
@ -1185,7 +1193,7 @@ impl SelectorMut {
}
}
pub fn replace_with<F: FnMut(Value) -> Value>(
pub fn replace_with<F: FnMut(Value) -> Option<Value>>(
&mut self,
fun: &mut F,
) -> Result<&mut Self, JsonPathError> {