jsonerr2array/
lib.rs

1#![doc = include_str!("../README.md")]
2
3pub fn jsonerr2array(avalue: &serde_json::Value, reverse: bool, first: bool) -> serde_json::Value {
4    let mut result = serde_json::json!([]);
5    traverse_json(avalue, &mut result);
6
7    if reverse {
8        if let Some(array) = result.as_array_mut() {
9            array.reverse();
10        }
11    }
12
13    if first {
14        let tmp_result = result.get(0);
15        if tmp_result.is_some() {
16            result = tmp_result.unwrap().clone();
17        }
18    }
19
20    result
21}
22
23pub fn traverse_json(avalue: &serde_json::Value, result: &mut serde_json::Value) {
24    if avalue.is_object() {
25        let mut tmpvalue = avalue.clone();
26        let mut origin: Option<serde_json::Value> = None;
27
28        if tmpvalue.as_object().unwrap().contains_key("err") {
29            let err: &serde_json::Value = tmpvalue.as_object_mut().unwrap().get("err").unwrap();
30            if err.as_object().unwrap().contains_key("origin") {
31                let key_value = tmpvalue["err"]
32                    .as_object_mut()
33                    .unwrap()
34                    .remove_entry("origin")
35                    .unwrap();
36                origin = Some(key_value.1);
37            }
38        }
39
40        if let Some(result) = result.as_array_mut() {
41            result.push(tmpvalue);
42        }
43
44        if origin.is_some() {
45            traverse_json(&origin.unwrap(), result);
46        }
47    }
48}