use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Calendar {
#[serde(skip_serializing_if = "String::is_empty")]
pub id: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub summary: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub foreground_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selected: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_role: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CalendarPatch {
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub foreground_color: Option<String>,
}
pub type CalendarUpdate = CalendarPatch;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CalendarListEntry {
#[serde(skip_serializing_if = "String::is_empty")]
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: 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 time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary_override: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub foreground_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hidden: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selected: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_reminders: Option<Vec<Reminder>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CalendarListPatch {
#[serde(skip_serializing_if = "Option::is_none")]
pub color_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary_override: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selected: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hidden: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_reminders: Option<Vec<Reminder>>,
}
pub type CalendarListUpdate = CalendarListPatch;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Reminder {
pub method: Option<String>,
pub minutes: Option<i64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Event {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: 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 status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<EventDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<EventDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hangout_link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html_link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attendees: Option<Vec<EventAttendee>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recurring_event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creator: Option<EventPerson>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organizer: Option<EventPerson>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EventPatch {
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: 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 start: Option<EventDateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<EventDateTime>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EventDateTime {
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub date_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EventAttendee {
pub id: Option<String>,
pub email: Option<String>,
pub display_name: Option<String>,
pub organizer: Option<bool>,
#[serde(rename = "self")]
pub is_self: Option<bool>,
pub resource: Option<bool>,
pub optional: Option<bool>,
pub response_status: Option<String>,
pub comment: Option<String>,
pub additional_guests: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EventPerson {
pub id: Option<String>,
pub email: Option<String>,
pub display_name: Option<String>,
#[serde(rename = "self")]
pub is_self: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Events {
pub kind: Option<String>,
pub etag: Option<String>,
pub summary: Option<String>,
pub description: Option<String>,
pub updated: Option<String>,
pub time_zone: Option<String>,
pub access_role: Option<String>,
pub next_page_token: Option<String>,
pub next_sync_token: Option<String>,
#[serde(default)]
pub items: Vec<Event>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CalendarList {
pub kind: Option<String>,
pub etag: Option<String>,
pub next_page_token: Option<String>,
pub next_sync_token: Option<String>,
#[serde(default)]
pub items: Vec<CalendarListEntry>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct FreeBusyRequest {
pub time_min: String,
pub time_max: String,
#[serde(default)]
pub items: Vec<FreeBusyItem>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct FreeBusyItem {
pub id: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct FreeBusyResponse {
pub time_min: Option<String>,
pub time_max: Option<String>,
#[serde(default)]
pub calendars: HashMap<String, FreeBusyCalendar>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct FreeBusyCalendar {
#[serde(default)]
pub busy: Vec<TimePeriod>,
pub errors: Option<Vec<FreeBusyError>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct FreeBusyError {
pub domain: Option<String>,
pub reason: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct TimePeriod {
pub start: Option<String>,
pub end: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct EventListOptions {
pub time_min: Option<String>,
pub time_max: Option<String>,
pub query: Option<String>,
pub max_results: Option<usize>,
}
#[derive(Debug, Clone, Default)]
pub struct EventInstancesOptions {
pub max_results: Option<usize>,
pub time_min: Option<String>,
pub time_max: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Channel {
#[serde(skip_serializing_if = "String::is_empty")]
pub id: String,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub channel_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiration: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<HashMap<String, String>>,
}
impl Channel {
pub fn webhook(id: impl Into<String>, address: impl Into<String>) -> Self {
Self {
id: id.into(),
channel_type: Some("web_hook".into()),
address: Some(address.into()),
..Self::default()
}
}
pub fn stop(id: impl Into<String>, resource_id: impl Into<String>) -> Self {
Self {
id: id.into(),
resource_id: Some(resource_id.into()),
..Self::default()
}
}
}
pub type WatchRequest = Channel;
pub type ChannelRequest = Channel;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Colors {
pub kind: Option<String>,
pub updated: Option<String>,
#[serde(default)]
pub calendar: HashMap<String, CalendarColor>,
#[serde(default)]
pub event: HashMap<String, EventColor>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct CalendarColor {
pub background: Option<String>,
pub foreground: Option<String>,
pub selected: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct EventColor {
pub background: Option<String>,
pub foreground: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Settings {
pub kind: Option<String>,
pub etag: Option<String>,
pub next_page_token: Option<String>,
pub next_sync_token: Option<String>,
#[serde(default)]
pub items: Vec<Setting>,
#[serde(flatten)]
pub extra: HashMap<String, Value>,
}
pub type SettingsList = Settings;
pub type CalendarSettings = Settings;
pub type CalendarSetting = Setting;
impl Settings {
pub fn value(&self, id: &str) -> Option<&str> {
self.items
.iter()
.find(|setting| setting.id == id)
.map(|setting| setting.value.as_str())
.or_else(|| self.extra.get(id).and_then(Value::as_str))
}
pub fn timezone(&self) -> Option<&str> {
self.value("timezone")
}
pub fn locale(&self) -> Option<&str> {
self.value("locale")
}
pub fn week_start(&self) -> Option<&str> {
self.value("weekStart")
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Setting {
pub id: String,
pub value: String,
pub etag: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct AclScope {
#[serde(rename = "type")]
pub r#type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
}
impl AclScope {
pub fn is_empty(&self) -> bool {
self.r#type.is_empty() && self.value.is_none()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct AclRule {
#[serde(skip_serializing_if = "String::is_empty")]
pub id: String,
#[serde(skip_serializing_if = "AclScope::is_empty")]
pub scope: AclScope,
#[serde(skip_serializing_if = "String::is_empty")]
pub role: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct AclPatch {
#[serde(skip_serializing_if = "Option::is_none")]
pub scope: Option<AclScope>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct AclList {
pub kind: Option<String>,
pub etag: Option<String>,
pub next_page_token: Option<String>,
pub next_sync_token: Option<String>,
#[serde(default)]
pub items: Vec<AclRule>,
}