use std::collections::BTreeMap;
use jmap_jscalendar_types::LocalDateTime;
use jmap_metadata_types::MetadataTextMatch;
use jmap_types::{Id, PatchObject, UTCDate, impl_string_enum};
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<BTreeMap<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 = "iCalendar", skip_serializing_if = "Option::is_none")]
pub icalendar: Option<serde_json::Value>,
#[serde(rename = "@type", skip_serializing_if = "Option::is_none")]
pub at_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: 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<BTreeMap<String, bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub categories: Option<BTreeMap<String, bool>>,
#[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<BTreeMap<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<BTreeMap<String, String>>,
#[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<BTreeMap<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(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>,
}
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", deny_unknown_fields)]
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<LocalDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<LocalDateTime>,
#[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 participant: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata_exists: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub private_metadata_exists: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata_text_contains: Option<MetadataTextMatch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub private_metadata_text_contains: Option<MetadataTextMatch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata_text_equals: Option<MetadataTextMatch>,
#[serde(skip_serializing_if = "Option::is_none")]
pub private_metadata_text_equals: Option<MetadataTextMatch>,
}
impl CalendarEventFilterCondition {
pub fn has_metadata_condition(&self) -> bool {
self.metadata_exists.is_some()
|| self.private_metadata_exists.is_some()
|| self.metadata_text_contains.is_some()
|| self.private_metadata_text_contains.is_some()
|| self.metadata_text_equals.is_some()
|| self.private_metadata_text_equals.is_some()
}
}
pub type CalendarEventFilter = jmap_types::Filter<CalendarEventFilterCondition>;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum CalendarEventComparatorProperty {
Id,
Uid,
Start,
Created,
Updated,
Other(String),
}
impl_string_enum!(CalendarEventComparatorProperty, "a CalendarEvent sort property string",
"id" => Id,
"uid" => Uid,
"start" => Start,
"created" => Created,
"updated" => Updated,
);
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CalendarEventComparator {
pub property: CalendarEventComparatorProperty,
#[serde(default = "bool_true", skip_serializing_if = "is_true")]
pub is_ascending: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub collation: Option<String>,
}
impl CalendarEventComparator {
pub fn new(property: CalendarEventComparatorProperty) -> Self {
Self {
property,
is_ascending: true,
collation: None,
}
}
}
fn bool_true() -> bool {
true
}
fn is_true(b: &bool) -> bool {
*b
}