use serde::{Deserialize, Deserializer};
pub(crate) fn or_default<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de> + Default,
{
Ok(Option::<T>::deserialize(deserializer)?.unwrap_or_default())
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::{json, Map, Value};
#[derive(Debug, Deserialize)]
struct Node {
#[serde(default, deserialize_with = "or_default")]
labels: Vec<String>,
#[serde(default, deserialize_with = "or_default")]
properties: Map<String, Value>,
}
#[test]
fn null_absent_and_present_all_decode() {
let explicit_null: Node =
serde_json::from_value(json!({"labels": null, "properties": null})).unwrap();
assert!(explicit_null.labels.is_empty());
assert!(explicit_null.properties.is_empty());
let absent: Node = serde_json::from_value(json!({})).unwrap();
assert!(absent.labels.is_empty());
let present: Node =
serde_json::from_value(json!({"labels": ["User"], "properties": {"name": "ada"}}))
.unwrap();
assert_eq!(present.labels, vec!["User"]);
assert_eq!(present.properties["name"], "ada");
}
}