diff --git a/melib/src/backends/jmap/objects/email.rs b/melib/src/backends/jmap/objects/email.rs index 032c259c..579537ad 100644 --- a/melib/src/backends/jmap/objects/email.rs +++ b/melib/src/backends/jmap/objects/email.rs @@ -154,7 +154,7 @@ pub struct EmailObject { pub size: u64, #[serde(default)] pub received_at: String, - #[serde(default)] + #[serde(default, deserialize_with = "deserialize_none_default")] pub message_id: Vec, #[serde(default)] pub to: Option>, @@ -199,6 +199,20 @@ pub struct EmailObject { pub extra: HashMap, } +/// Deserializer that uses `Default::default()` in place of a present but `null` +/// value. Note that `serde(default)` doesn't apply if the key is present but +/// has a value of `null`. +fn deserialize_none_default<'de, D, T>( + deserializer: D, +) -> std::result::Result +where + D: Deserializer<'de>, + T: Deserialize<'de> + Default, +{ + let v = Option::::deserialize(deserializer)?; + Ok(v.unwrap_or(T::default())) +} + impl EmailObject { _impl!(get keywords, keywords: HashMap); }