use std::thread;
fn strip_null_fields_mut(json: &mut serde_json::Value) {
use serde_json::Value;
match *json {
Value::Null | Value::Bool(_) | Value::Number(_) | Value::String(_) => {
}
Value::Array(ref mut arr) => {
for mut v in arr {
strip_null_fields_mut(&mut v);
}
}
Value::Object(ref mut obj) => {
let keys_to_remove = obj.iter().filter_map(|(k, v)| {
if v.is_null() {
Some(k.to_owned())
} else {
None
}
}).collect::<Vec<_>>();
for key in keys_to_remove {
obj.remove(&key);
}
}
}
}
pub fn strip_null_fields<V>(json: V) -> serde_json::Value
where
V: Into<serde_json::Value>,
{
let mut json = json.into();
strip_null_fields_mut(&mut json);
json
}
pub(crate) trait GetDefaulting<T: Default> {
fn get_defaulting(&mut self) -> &mut T;
}
impl<T: Default> GetDefaulting<T> for Option<T> {
fn get_defaulting(&mut self) -> &mut T {
self.get_or_insert_with(Default::default)
}
}
pub(crate) fn panic_or_print_error(msg: &anyhow::Error) {
if thread::panicking() {
let _ = println!("{}", msg);
} else {
panic!("{}", msg);
}
}