use crate::store::BaseData; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; pub mod rhai; /// Event status #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)] pub enum EventStatus { #[default] Draft, Published, Cancelled, } /// A calendar event object #[derive(Debug, Clone, Serialize, Deserialize, crate::DeriveObject)] pub struct Event { /// Base data pub base_data: BaseData, /// Title of the event #[index] pub title: String, /// Optional description pub description: Option, /// Start time #[index] #[serde(with = "time::serde::timestamp")] pub start_time: OffsetDateTime, /// End time #[serde(with = "time::serde::timestamp")] pub end_time: OffsetDateTime, /// Optional location #[index] pub location: Option, /// Event status #[index] pub status: EventStatus, /// Whether this is an all-day event pub all_day: bool, /// Optional category #[index] pub category: Option, } impl Event { /// Create a new event pub fn new(ns: String, title: impl ToString) -> Self { let now = OffsetDateTime::now_utc(); Self { base_data: BaseData::with_ns(ns), title: title.to_string(), description: None, start_time: now, end_time: now, location: None, status: EventStatus::default(), all_day: false, category: None, } } /// Create an event with specific ID pub fn with_id(id: String, ns: String, title: impl ToString) -> Self { let now = OffsetDateTime::now_utc(); let id_u32 = id.parse::().unwrap_or(0); Self { base_data: BaseData::with_id(id_u32, ns), title: title.to_string(), description: None, start_time: now, end_time: now, location: None, status: EventStatus::default(), all_day: false, category: None, } } /// Set the description pub fn set_description(mut self, description: impl ToString) -> Self { self.description = Some(description.to_string()); self.base_data.update_modified(); self } /// Set the start time pub fn set_start_time(mut self, start_time: OffsetDateTime) -> Self { self.start_time = start_time; self.base_data.update_modified(); self } /// Set the end time pub fn set_end_time(mut self, end_time: OffsetDateTime) -> Self { self.end_time = end_time; self.base_data.update_modified(); self } /// Set the location pub fn set_location(mut self, location: impl ToString) -> Self { self.location = Some(location.to_string()); self.base_data.update_modified(); self } /// Set the status pub fn set_status(mut self, status: EventStatus) -> Self { self.status = status; self.base_data.update_modified(); self } /// Set as all-day event pub fn set_all_day(mut self, all_day: bool) -> Self { self.all_day = all_day; self.base_data.update_modified(); self } /// Set the category pub fn set_category(mut self, category: impl ToString) -> Self { self.category = Some(category.to_string()); self.base_data.update_modified(); self } } // Object trait implementation is auto-generated by #[derive(DeriveObject)] // The derive macro generates: object_type(), base_data(), base_data_mut(), index_keys(), indexed_fields()