mirror of
https://github.com/fluencelabs/jsonpath
synced 2025-04-25 09:22:19 +00:00
Replace fun input with ownership #22
This commit is contained in:
commit
19f0878b5a
@ -460,7 +460,7 @@ pub fn delete(value: Value, path: &str) -> Result<Value, JsonPathError> {
|
|||||||
/// ```
|
/// ```
|
||||||
pub fn replace_with<F>(value: Value, path: &str, fun: &mut F) -> Result<Value, JsonPathError>
|
pub fn replace_with<F>(value: Value, path: &str, fun: &mut F) -> Result<Value, JsonPathError>
|
||||||
where
|
where
|
||||||
F: FnMut(&Value) -> Value,
|
F: FnMut(Value) -> Value,
|
||||||
{
|
{
|
||||||
let mut selector = SelectorMut::default();
|
let mut selector = SelectorMut::default();
|
||||||
let value = selector.str_path(path)?.value(value).replace_with(fun)?;
|
let value = selector.str_path(path)?.value(value).replace_with(fun)?;
|
||||||
|
@ -5,6 +5,7 @@ use array_tool::vec::{Intersect, Union};
|
|||||||
use serde_json::{Number, Value};
|
use serde_json::{Number, Value};
|
||||||
|
|
||||||
use parser::*;
|
use parser::*;
|
||||||
|
use serde_json::map::Entry;
|
||||||
|
|
||||||
fn to_f64(n: &Number) -> f64 {
|
fn to_f64(n: &Number) -> f64 {
|
||||||
if n.is_i64() {
|
if n.is_i64() {
|
||||||
@ -1026,31 +1027,29 @@ pub struct SelectorMut {
|
|||||||
value: Option<Value>,
|
value: Option<Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_value<F: FnMut(&Value) -> Value>(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) {
|
||||||
let mut target = value;
|
let mut target = value;
|
||||||
|
|
||||||
for (i, token) in tokens.iter().enumerate() {
|
let last_index = tokens.len() - 1;
|
||||||
|
for (i, token) in tokens.drain(..).enumerate() {
|
||||||
let target_once = target;
|
let target_once = target;
|
||||||
let is_last = i == tokens.len() - 1;
|
let is_last = i == last_index;
|
||||||
let target_opt = match *target_once {
|
let target_opt = match *target_once {
|
||||||
Value::Object(ref mut map) => {
|
Value::Object(ref mut map) => {
|
||||||
if is_last {
|
if is_last {
|
||||||
let v = if let Some(v) = map.get(token) {
|
if let Entry::Occupied(mut e) = map.entry(token) {
|
||||||
fun(v)
|
let v = e.insert(Value::Null);
|
||||||
} else {
|
e.insert(fun(v));
|
||||||
return;
|
}
|
||||||
};
|
|
||||||
|
|
||||||
map.insert(token.clone(), v);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
map.get_mut(token)
|
map.get_mut(&token)
|
||||||
}
|
}
|
||||||
Value::Array(ref mut vec) => {
|
Value::Array(ref mut vec) => {
|
||||||
if let Ok(x) = token.parse::<usize>() {
|
if let Ok(x) = token.parse::<usize>() {
|
||||||
if is_last {
|
if is_last {
|
||||||
let v = { fun(&vec[x]) };
|
let v = std::mem::replace(&mut vec[x], Value::Null);
|
||||||
vec[x] = v;
|
vec[x] = fun(v);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vec.get_mut(x)
|
vec.get_mut(x)
|
||||||
@ -1174,7 +1173,7 @@ impl SelectorMut {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn replace_with<F: FnMut(&Value) -> Value>(
|
pub fn replace_with<F: FnMut(Value) -> Value>(
|
||||||
&mut self,
|
&mut self,
|
||||||
fun: &mut F,
|
fun: &mut F,
|
||||||
) -> Result<&mut Self, JsonPathError> {
|
) -> Result<&mut Self, JsonPathError> {
|
||||||
|
@ -56,8 +56,8 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_fun(v: &Value, fun: &js_sys::Function) -> Value {
|
fn replace_fun(v: Value, fun: &js_sys::Function) -> Value {
|
||||||
match JsValue::from_serde(v) {
|
match JsValue::from_serde(&v) {
|
||||||
Ok(js_v) => match fun.call1(&JsValue::NULL, &js_v) {
|
Ok(js_v) => match fun.call1(&JsValue::NULL, &js_v) {
|
||||||
Ok(result) => match into_serde_json(&result) {
|
Ok(result) => match into_serde_json(&result) {
|
||||||
Ok(json) => json,
|
Ok(json) => json,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user