//! Common types and enums used across calendar components use chrono::{DateTime, Duration, Utc}; use serde::{Deserialize, Serialize}; // ==================== ENUMS AND COMMON TYPES ==================== #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum EventStatus { Tentative, Confirmed, Cancelled, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum EventClass { Public, Private, Confidential, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum TimeTransparency { Opaque, // OPAQUE - time is not available Transparent, // TRANSPARENT - time is available } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum TodoStatus { NeedsAction, Completed, InProcess, Cancelled, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum AttendeeRole { Chair, ReqParticipant, OptParticipant, NonParticipant, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum ParticipationStatus { NeedsAction, Accepted, Declined, Tentative, Delegated, Completed, InProcess, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum AlarmAction { Audio, Display, Email, Procedure, } // ==================== STRUCTURED TYPES ==================== #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct CalendarUser { pub cal_address: String, // Calendar user address (usually email) pub common_name: Option, // CN parameter - display name pub dir_entry_ref: Option, // DIR parameter - directory entry pub sent_by: Option, // SENT-BY parameter pub language: Option, // LANGUAGE parameter } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Attendee { pub cal_address: String, // Calendar user address pub common_name: Option, // CN parameter pub role: Option, // ROLE parameter pub part_stat: Option, // PARTSTAT parameter pub rsvp: Option, // RSVP parameter pub cu_type: Option, // CUTYPE parameter (INDIVIDUAL, GROUP, RESOURCE, ROOM, UNKNOWN) pub member: Vec, // MEMBER parameter pub delegated_to: Vec, // DELEGATED-TO parameter pub delegated_from: Vec, // DELEGATED-FROM parameter pub sent_by: Option, // SENT-BY parameter pub dir_entry_ref: Option, // DIR parameter pub language: Option, // LANGUAGE parameter } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct VAlarm { pub action: AlarmAction, // Action (ACTION) - REQUIRED pub trigger: AlarmTrigger, // Trigger (TRIGGER) - REQUIRED pub duration: Option, // Duration (DURATION) pub repeat: Option, // Repeat count (REPEAT) pub description: Option, // Description for DISPLAY/EMAIL pub summary: Option, // Summary for EMAIL pub attendees: Vec, // Attendees for EMAIL pub attach: Vec, // Attachments for AUDIO/EMAIL } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum AlarmTrigger { DateTime(DateTime), // Absolute trigger time Duration(Duration), // Duration relative to start/end } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Attachment { pub format_type: Option, // FMTTYPE parameter (MIME type) pub encoding: Option, // ENCODING parameter pub value: Option, // VALUE parameter (BINARY or URI) pub uri: Option, // URI reference pub binary_data: Option>, // Binary data (when ENCODING=BASE64) } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct GeographicPosition { pub latitude: f64, // Latitude in decimal degrees pub longitude: f64, // Longitude in decimal degrees } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct VTimeZone { pub tzid: String, // Time zone ID (TZID) - REQUIRED pub last_modified: Option>, // Last modified (LAST-MODIFIED) pub tzurl: Option, // Time zone URL (TZURL) pub standard_components: Vec, // STANDARD components pub daylight_components: Vec, // DAYLIGHT components } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct TimeZoneComponent { pub dtstart: DateTime, // Start of this time zone definition pub tzoffset_to: String, // UTC offset for this component pub tzoffset_from: String, // UTC offset before this component pub rrule: Option, // Recurrence rule pub rdate: Vec>, // Recurrence dates pub tzname: Vec, // Time zone names pub comment: Vec, // Comments } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct VJournal { // Required properties pub dtstamp: DateTime, // Date-time stamp (DTSTAMP) - REQUIRED pub uid: String, // Unique identifier (UID) - REQUIRED // Optional properties pub dtstart: Option>, // Start date-time (DTSTART) pub summary: Option, // Summary/title (SUMMARY) pub description: Option, // Description (DESCRIPTION) // Classification and status pub class: Option, // Classification (CLASS) pub status: Option, // Status (STATUS) // People and organization pub organizer: Option, // Organizer (ORGANIZER) pub attendees: Vec, // Attendees (ATTENDEE) // Categorization pub categories: Vec, // Categories (CATEGORIES) // Versioning and modification pub sequence: Option, // Sequence number (SEQUENCE) pub created: Option>, // Creation time (CREATED) pub last_modified: Option>, // Last modified (LAST-MODIFIED) // Recurrence pub rrule: Option, // Recurrence rule (RRULE) pub rdate: Vec>, // Recurrence dates (RDATE) pub exdate: Vec>, // Exception dates (EXDATE) pub recurrence_id: Option>, // Recurrence ID (RECURRENCE-ID) // Attachments pub attachments: Vec, // Attachments (ATTACH) } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct VFreeBusy { // Required properties pub dtstamp: DateTime, // Date-time stamp (DTSTAMP) - REQUIRED pub uid: String, // Unique identifier (UID) - REQUIRED // Optional date-time properties pub dtstart: Option>, // Start date-time (DTSTART) pub dtend: Option>, // End date-time (DTEND) // People pub organizer: Option, // Organizer (ORGANIZER) pub attendees: Vec, // Attendees (ATTENDEE) // Free/busy time pub freebusy: Vec, // Free/busy time periods pub url: Option, // URL (URL) pub comment: Vec, // Comments (COMMENT) pub contact: Option, // Contact information (CONTACT) } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct FreeBusyTime { pub fb_type: FreeBusyType, // Free/busy type pub periods: Vec, // Time periods } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum FreeBusyType { Free, Busy, BusyUnavailable, BusyTentative, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct Period { pub start: DateTime, // Period start pub end: Option>, // Period end pub duration: Option, // Period duration (alternative to end) }