1use serde::{Deserialize, Serialize};
2
3use crate::util::QueryBuilder;
4
5#[derive(Clone, Debug, Deserialize)]
7pub struct Calendar {
8 pub inbox_id: String,
10 pub timezone: String,
12 pub event_count: u64,
14 pub created_at: String,
16 pub updated_at: String,
18 pub etag: String,
21}
22
23#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
25#[serde(rename_all = "lowercase")]
26pub enum EventKind {
27 Single,
29 Series,
31 Instance,
33 #[serde(other)]
35 Unknown,
36}
37
38#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(rename_all = "lowercase")]
41pub enum EventStatus {
42 Confirmed,
44 Tentative,
46 Cancelled,
48 #[serde(other)]
50 Unknown,
51}
52
53#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "lowercase")]
56pub enum DurationMode {
57 Nominal,
60 Exact,
62 #[serde(other)]
64 Unknown,
65}
66
67#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
69#[serde(rename_all = "lowercase")]
70pub enum EventSource {
71 Api,
73 Email,
75 #[serde(other)]
77 Unknown,
78}
79
80#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize)]
82#[serde(rename_all = "snake_case")]
83pub enum ResponseStatus {
84 NeedsAction,
86 Accepted,
88 Declined,
90 Tentative,
92 #[serde(other)]
94 Unknown,
95}
96
97#[derive(Clone, Debug, Default, Serialize, Deserialize)]
99pub struct CalendarAttendee {
100 pub email: String,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
104 pub name: Option<String>,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub status: Option<String>,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
110 pub role: Option<String>,
111 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub comment: Option<String>,
114 #[serde(default, skip_serializing_if = "Option::is_none")]
116 pub responded_at: Option<String>,
117}
118
119#[derive(Clone, Debug, Default, Serialize, Deserialize)]
123pub struct Recurrence {
124 pub rule: String,
126 #[serde(default, skip_serializing_if = "Vec::is_empty")]
128 pub exdates: Vec<String>,
129 #[serde(default, skip_serializing_if = "Vec::is_empty")]
131 pub rdates: Vec<serde_json::Value>,
132 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub truncate_before: Option<String>,
135}
136
137#[derive(Clone, Debug, Deserialize)]
139pub struct CalendarEvent {
140 pub event_id: String,
142 #[serde(default)]
144 pub kind: Option<EventKind>,
145 #[serde(default)]
147 pub series_id: Option<String>,
148 #[serde(default)]
150 pub original_start: Option<String>,
151 #[serde(default)]
153 pub original_start_at: Option<String>,
154 #[serde(default)]
156 pub is_exception: Option<bool>,
157 pub title: String,
159 #[serde(default)]
161 pub description: Option<String>,
162 #[serde(default)]
164 pub location: Option<String>,
165 #[serde(default)]
167 pub metadata: Option<serde_json::Value>,
168 #[serde(default)]
170 pub status: Option<EventStatus>,
171 pub all_day: bool,
173 pub start: String,
175 pub end: String,
177 pub timezone: String,
179 #[serde(default)]
181 pub duration_mode: Option<DurationMode>,
182 pub duration_value: i64,
184 pub start_at: String,
186 pub end_at: String,
188 #[serde(default)]
190 pub recurrence: Option<Recurrence>,
191 #[serde(default)]
193 pub attendees: Vec<CalendarAttendee>,
194 pub attendee_count: u32,
196 #[serde(default)]
198 pub response_status: Option<ResponseStatus>,
199 pub uid: String,
201 pub sequence: u32,
203 #[serde(default)]
205 pub source: Option<EventSource>,
206 #[serde(default)]
208 pub organizer_email: Option<String>,
209 #[serde(default)]
211 pub origin_message_id: Option<String>,
212 #[serde(default)]
214 pub resource_revision: Option<u64>,
215 #[serde(default)]
217 pub etag: Option<String>,
218 pub created_at: String,
220 pub updated_at: String,
222}
223
224#[derive(Clone, Copy, Debug, PartialEq, Eq)]
227pub enum Consistency {
228 Eventual,
230 Primary,
232}
233
234impl Consistency {
235 pub(crate) fn as_str(self) -> &'static str {
236 match self {
237 Consistency::Eventual => "eventual",
238 Consistency::Primary => "primary",
239 }
240 }
241}
242
243#[derive(Clone, Copy, Debug, PartialEq, Eq)]
245pub enum MutationMode {
246 Single,
248 Future,
250}
251
252impl MutationMode {
253 pub(crate) fn as_str(self) -> &'static str {
254 match self {
255 MutationMode::Single => "single",
256 MutationMode::Future => "future",
257 }
258 }
259}
260
261#[derive(Clone, Debug, Default)]
263pub struct CalendarEventsQuery {
264 pub after: Option<String>,
266 pub before: Option<String>,
268 pub include_overlapping: Option<bool>,
270 pub limit: Option<u32>,
272 pub page_token: Option<String>,
274 pub consistency: Option<Consistency>,
276}
277
278impl CalendarEventsQuery {
279 pub(crate) fn query(&self) -> Vec<(&'static str, String)> {
280 QueryBuilder::new()
281 .opt("after", self.after.as_ref())
282 .opt("before", self.before.as_ref())
283 .opt("include_overlapping", self.include_overlapping.as_ref())
284 .opt("limit", self.limit.as_ref())
285 .opt("page_token", self.page_token.as_ref())
286 .opt(
287 "consistency",
288 self.consistency.map(Consistency::as_str).as_ref(),
289 )
290 .build()
291 }
292}
293
294#[derive(Clone, Debug, Default, Serialize)]
297pub struct CreateCalendarEvent {
298 #[serde(skip_serializing_if = "Option::is_none")]
300 pub client_id: Option<String>,
301 pub title: String,
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub description: Option<String>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub location: Option<String>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub metadata: Option<serde_json::Value>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub status: Option<EventStatus>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub all_day: Option<bool>,
318 pub start: String,
320 pub end: String,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub timezone: Option<String>,
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub duration_mode: Option<DurationMode>,
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub recurrence: Option<Recurrence>,
331 #[serde(skip_serializing_if = "Vec::is_empty")]
333 pub attendees: Vec<CalendarAttendee>,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub send_invites: Option<bool>,
337}
338
339#[derive(Clone, Debug, Default, Serialize)]
344pub struct UpdateCalendarEvent {
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub title: Option<String>,
348 #[serde(skip_serializing_if = "Option::is_none")]
350 pub description: Option<String>,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub location: Option<String>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub metadata: Option<serde_json::Value>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub status: Option<EventStatus>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub all_day: Option<bool>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub start: Option<String>,
366 #[serde(skip_serializing_if = "Option::is_none")]
368 pub end: Option<String>,
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub timezone: Option<String>,
372 #[serde(skip_serializing_if = "Option::is_none")]
374 pub duration_mode: Option<DurationMode>,
375 #[serde(skip_serializing_if = "Option::is_none")]
377 pub recurrence: Option<Recurrence>,
378 #[serde(skip_serializing_if = "Vec::is_empty")]
380 pub attendees: Vec<CalendarAttendee>,
381 #[serde(skip_serializing_if = "Option::is_none")]
383 pub send_invites: Option<bool>,
384}
385
386#[derive(Clone, Debug, Default, Serialize)]
388pub struct RespondToCalendarEvent {
389 pub status: String,
391 #[serde(skip_serializing_if = "Option::is_none")]
393 pub comment: Option<String>,
394 #[serde(skip_serializing_if = "Option::is_none")]
396 pub send_reply: Option<bool>,
397}
398
399#[derive(Clone, Debug, Deserialize)]
401pub struct CalendarEventList {
402 pub count: u64,
404 #[serde(default)]
406 pub events: Vec<CalendarEvent>,
407 #[serde(default)]
409 pub next_page_token: Option<String>,
410}
411
412#[derive(Clone, Debug, Deserialize)]
415pub struct CalendarEventMutation {
416 pub event: CalendarEvent,
418 #[serde(default)]
420 pub operation_id: Option<String>,
421}
422
423#[derive(Clone, Debug, Deserialize)]
426pub struct DeleteCalendarEventResult {
427 #[serde(default)]
429 pub deletion_id: Option<String>,
430 #[serde(default)]
432 pub event: Option<CalendarEvent>,
433}