jsonerr2array 0.0.2

jsonerr to array
Documentation
#![doc = include_str!("../README.md")]

pub fn jsonerr2array(avalue: &serde_json::Value, reverse: bool, first: bool) -> serde_json::Value {
    let mut result = serde_json::json!([]);
    traverse_json(avalue, &mut result);

    if reverse {
        if let Some(array) = result.as_array_mut() {
            array.reverse();
        }
    }

    if first {
        let tmp_result = result.get(0);
        if tmp_result.is_some() {
            result = tmp_result.unwrap().clone();
        }
    }

    result
}

pub fn traverse_json(avalue: &serde_json::Value, result: &mut serde_json::Value) {
    if avalue.is_object() {
        let mut tmpvalue = avalue.clone();
        let mut origin: Option<serde_json::Value> = None;

        if tmpvalue.as_object().unwrap().contains_key("err") {
            let err: &serde_json::Value = tmpvalue.as_object_mut().unwrap().get("err").unwrap();
            if err.as_object().unwrap().contains_key("origin") {
                let key_value = tmpvalue["err"]
                    .as_object_mut()
                    .unwrap()
                    .remove_entry("origin")
                    .unwrap();
                origin = Some(key_value.1);
            }
        }

        if let Some(result) = result.as_array_mut() {
            result.push(tmpvalue);
        }

        if origin.is_some() {
            traverse_json(&origin.unwrap(), result);
        }
    }
}