use std::collections::HashMap;
use jmap_types::{Id, PatchObject, UTCDate};
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactCard {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_book_ids: Option<HashMap<Id, bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub members: Option<HashMap<String, bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prod_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_to: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nicknames: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organizations: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speak_to_as: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub titles: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub emails: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub online_services: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phones: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub preferred_languages: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub calendars: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduling_addresses: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub addresses: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub crypto_keys: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub directories: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub localizations: Option<HashMap<String, PatchObject>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub anniversaries: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keywords: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notes: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub personal_info: Option<serde_json::Value>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[non_exhaustive]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactCardFilterCondition {
#[serde(skip_serializing_if = "Option::is_none")]
pub in_address_book: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_member: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_before: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_after: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_before: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_after: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(rename = "name/given", skip_serializing_if = "Option::is_none")]
pub name_given: Option<String>,
#[serde(rename = "name/surname", skip_serializing_if = "Option::is_none")]
pub name_surname: Option<String>,
#[serde(rename = "name/surname2", skip_serializing_if = "Option::is_none")]
pub name_surname2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organization: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub online_service: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactCardComparator {
pub property: String,
#[serde(default = "default_true")]
pub is_ascending: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub collation: Option<String>,
}
fn default_true() -> bool {
true
}