use serde::{Deserialize, Serialize};
use crate::util::QueryBuilder;
#[derive(Clone, Debug, Deserialize)]
pub struct Calendar {
pub inbox_id: String,
pub timezone: String,
pub event_count: u64,
pub created_at: String,
pub updated_at: String,
pub etag: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EventKind {
Single,
Series,
Instance,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EventStatus {
Confirmed,
Tentative,
Cancelled,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum DurationMode {
Nominal,
Exact,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EventSource {
Api,
Email,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ResponseStatus {
NeedsAction,
Accepted,
Declined,
Tentative,
#[serde(other)]
Unknown,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct CalendarAttendee {
pub email: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub responded_at: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct Recurrence {
pub rule: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub exdates: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub rdates: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub truncate_before: Option<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct CalendarEvent {
pub event_id: String,
#[serde(default)]
pub kind: Option<EventKind>,
#[serde(default)]
pub series_id: Option<String>,
#[serde(default)]
pub original_start: Option<String>,
#[serde(default)]
pub original_start_at: Option<String>,
#[serde(default)]
pub is_exception: Option<bool>,
pub title: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub location: Option<String>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
#[serde(default)]
pub status: Option<EventStatus>,
pub all_day: bool,
pub start: String,
pub end: String,
pub timezone: String,
#[serde(default)]
pub duration_mode: Option<DurationMode>,
pub duration_value: i64,
pub start_at: String,
pub end_at: String,
#[serde(default)]
pub recurrence: Option<Recurrence>,
#[serde(default)]
pub attendees: Vec<CalendarAttendee>,
pub attendee_count: u32,
#[serde(default)]
pub response_status: Option<ResponseStatus>,
pub uid: String,
pub sequence: u32,
#[serde(default)]
pub source: Option<EventSource>,
#[serde(default)]
pub organizer_email: Option<String>,
#[serde(default)]
pub origin_message_id: Option<String>,
#[serde(default)]
pub resource_revision: Option<u64>,
#[serde(default)]
pub etag: Option<String>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Consistency {
Eventual,
Primary,
}
impl Consistency {
pub(crate) fn as_str(self) -> &'static str {
match self {
Consistency::Eventual => "eventual",
Consistency::Primary => "primary",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MutationMode {
Single,
Future,
}
impl MutationMode {
pub(crate) fn as_str(self) -> &'static str {
match self {
MutationMode::Single => "single",
MutationMode::Future => "future",
}
}
}
#[derive(Clone, Debug, Default)]
pub struct CalendarEventsQuery {
pub after: Option<String>,
pub before: Option<String>,
pub include_overlapping: Option<bool>,
pub limit: Option<u32>,
pub page_token: Option<String>,
pub consistency: Option<Consistency>,
}
impl CalendarEventsQuery {
pub(crate) fn query(&self) -> Vec<(&'static str, String)> {
QueryBuilder::new()
.opt("after", self.after.as_ref())
.opt("before", self.before.as_ref())
.opt("include_overlapping", self.include_overlapping.as_ref())
.opt("limit", self.limit.as_ref())
.opt("page_token", self.page_token.as_ref())
.opt(
"consistency",
self.consistency.map(Consistency::as_str).as_ref(),
)
.build()
}
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct CreateCalendarEvent {
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<String>,
pub title: 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 metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<EventStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_day: Option<bool>,
pub start: String,
pub end: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_mode: Option<DurationMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence: Option<Recurrence>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub attendees: Vec<CalendarAttendee>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_invites: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct UpdateCalendarEvent {
#[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 metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<EventStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_day: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration_mode: Option<DurationMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurrence: Option<Recurrence>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub attendees: Vec<CalendarAttendee>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_invites: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct RespondToCalendarEvent {
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_reply: Option<bool>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct CalendarEventList {
pub count: u64,
#[serde(default)]
pub events: Vec<CalendarEvent>,
#[serde(default)]
pub next_page_token: Option<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct CalendarEventMutation {
pub event: CalendarEvent,
#[serde(default)]
pub operation_id: Option<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct DeleteCalendarEventResult {
#[serde(default)]
pub deletion_id: Option<String>,
#[serde(default)]
pub event: Option<CalendarEvent>,
}