use jmap_types::Id;
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Thread {
pub id: Id,
pub email_ids: Vec<Id>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
impl Thread {
pub fn new(id: Id, email_ids: Vec<Id>) -> Self {
Self {
id,
email_ids,
extra: serde_json::Map::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn thread_preserves_vendor_extras() {
let raw = json!({
"id": "t1",
"emailIds": ["e1", "e2"],
"acmeCorpConversationTag": "support"
});
let thr: Thread = serde_json::from_value(raw).unwrap();
assert_eq!(
thr.extra
.get("acmeCorpConversationTag")
.and_then(|v| v.as_str()),
Some("support")
);
let back = serde_json::to_value(&thr).unwrap();
assert_eq!(back["acmeCorpConversationTag"], "support");
}
}