use std::collections::BTreeMap;
use jmap_types::Id;
use serde::{Deserialize, Serialize};
use crate::collision::{self, CollisionError};
const ADDRESS_BOOK_RIGHTS_TYPED_FIELDS: &[&str] = &[
"mayRead",
"mayWrite",
"mayShare",
"mayDelete",
"maySetMetadata",
];
const ADDRESS_BOOK_TYPED_FIELDS: &[&str] = &[
"id",
"name",
"description",
"sortOrder",
"isDefault",
"isSubscribed",
"shareWith",
"myRights",
"metadata",
"privateMetadata",
];
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddressBookRights {
pub may_read: bool,
pub may_write: bool,
pub may_share: bool,
pub may_delete: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub may_set_metadata: Option<bool>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
impl AddressBookRights {
pub fn validate_extras(&self) -> Result<(), CollisionError> {
collision::check(&self.extra, ADDRESS_BOOK_RIGHTS_TYPED_FIELDS)
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AddressBook {
pub id: Id,
pub name: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub sort_order: u32,
pub is_default: bool,
pub is_subscribed: bool,
#[serde(default)]
pub share_with: Option<BTreeMap<Id, AddressBookRights>>,
pub my_rights: AddressBookRights,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub private_metadata: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
impl AddressBook {
pub fn validate_extras(&self) -> Result<(), CollisionError> {
collision::check(&self.extra, ADDRESS_BOOK_TYPED_FIELDS)
}
}