rustical_store/
calendar.rs

1use crate::synctoken::format_synctoken;
2use chrono::NaiveDateTime;
3use rustical_ical::CalendarObjectType;
4use serde::{Deserialize, Serialize};
5use std::str::FromStr;
6
7#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
8pub struct CalendarMetadata {
9    // Attributes that may be outsourced
10    pub displayname: Option<String>,
11    pub order: i64,
12    pub description: Option<String>,
13    pub color: Option<String>,
14}
15
16#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
17pub struct Calendar {
18    // Attributes that may be outsourced
19    #[serde(flatten)]
20    pub meta: CalendarMetadata,
21
22    // Common calendar attributes
23    pub principal: String,
24    pub id: String,
25    pub timezone_id: Option<String>,
26    pub deleted_at: Option<NaiveDateTime>,
27    pub synctoken: i64,
28    pub subscription_url: Option<String>,
29    pub push_topic: String,
30    pub components: Vec<CalendarObjectType>,
31}
32
33impl Calendar {
34    #[must_use]
35    pub fn format_synctoken(&self) -> String {
36        format_synctoken(self.synctoken)
37    }
38
39    #[must_use]
40    pub fn get_timezone(&self) -> Option<chrono_tz::Tz> {
41        self.timezone_id
42            .as_ref()
43            .and_then(|tzid| chrono_tz::Tz::from_str(tzid).ok())
44    }
45
46    #[must_use]
47    pub fn get_vtimezone(&self) -> Option<&'static str> {
48        self.timezone_id
49            .as_ref()
50            .and_then(|tzid| vtimezones_rs::VTIMEZONES.get(tzid).copied())
51    }
52}