use serde::{Deserialize, Serialize};
pub const JMAP_CID_URI: &str = "urn:ietf:params:jmap:cid";
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CidCapability {
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_object_round_trips() {
let cap: CidCapability = serde_json::from_str("{}").unwrap();
assert!(cap.extra.is_empty());
let json = serde_json::to_string(&cap).unwrap();
assert_eq!(json, "{}");
}
#[test]
fn vendor_extras_preserved_through_round_trip() {
let input = r#"{"acmeCorpFastDigest":true,"vendor.example:limit":1024}"#;
let cap: CidCapability = serde_json::from_str(input).unwrap();
assert_eq!(cap.extra.len(), 2);
assert_eq!(
cap.extra.get("acmeCorpFastDigest"),
Some(&serde_json::Value::Bool(true)),
);
assert_eq!(
cap.extra.get("vendor.example:limit"),
Some(&serde_json::Value::Number(1024.into())),
);
let round_tripped = serde_json::to_string(&cap).unwrap();
let cap2: CidCapability = serde_json::from_str(&round_tripped).unwrap();
assert_eq!(cap, cap2);
}
#[test]
fn default_constructs_empty() {
let cap = CidCapability::default();
assert!(cap.extra.is_empty());
let json = serde_json::to_string(&cap).unwrap();
assert_eq!(json, "{}");
}
}