use std::collections::HashMap;
use jmap_types::{Id, PatchObject, UTCDate};
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CalendarEvent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_event_id: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub calendar_ids: Option<HashMap<Id, bool>>,
#[serde(default = "some_false", serialize_with = "serialize_false_if_none")]
pub is_draft: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_origin: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub utc_start: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub utc_end: Option<UTCDate>,
#[serde(default = "some_false", serialize_with = "serialize_false_if_none")]
pub use_default_alerts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub may_invite_self: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub may_invite_others: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hide_attendees: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blob_id: Option<Id>,
#[serde(rename = "iCalComponent", skip_serializing_if = "Option::is_none")]
pub ical_component: Option<String>,
#[serde(rename = "@type", skip_serializing_if = "Option::is_none")]
pub at_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_to: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prod_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sequence: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_content_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_without_time: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locations: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub virtual_locations: 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 locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keywords: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub categories: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence_id_time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence_rules: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded_recurrence_rules: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence_overrides: Option<HashMap<String, PatchObject>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub free_busy_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub privacy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sent_by: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organizer_calendar_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub participants: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alerts: 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 time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zones: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
fn serialize_false_if_none<S: serde::Serializer>(
value: &Option<bool>,
serializer: S,
) -> Result<S::Ok, S::Error> {
serializer.serialize_bool(value.unwrap_or(false))
}
fn some_false() -> Option<bool> {
Some(false)
}
#[non_exhaustive]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CalendarEventFilterCondition {
#[serde(skip_serializing_if = "Option::is_none")]
pub in_calendar: Option<Id>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attendee: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
}
pub type CalendarEventFilter = jmap_types::query::Filter<CalendarEventFilterCondition>;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CalendarEventComparator {
pub property: String,
#[serde(default = "default_ascending")]
pub is_ascending: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub collation: Option<String>,
}
fn default_ascending() -> bool {
true
}