use crate::{
common::{CalendarScale, Data, PartialDateTime},
Entry, Parser, Token,
};
pub mod dates;
pub mod parser;
pub mod timezone;
pub mod utils;
pub mod writer;
#[cfg(feature = "rkyv")]
pub mod rkyv_timezone;
#[cfg(feature = "rkyv")]
pub mod rkyv_types;
#[cfg(feature = "rkyv")]
pub mod rkyv_utils;
#[cfg(feature = "rkyv")]
pub mod rkyv_writer;
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendar {
pub components: Vec<ICalendarComponent>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendarComponent {
pub component_type: ICalendarComponentType,
pub entries: Vec<ICalendarEntry>,
pub component_ids: Vec<u16>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendarEntry {
pub name: ICalendarProperty,
pub params: Vec<ICalendarParameter>,
pub values: Vec<ICalendarValue>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarValue {
Binary(Vec<u8>),
Boolean(bool),
Uri(Uri),
PartialDateTime(Box<PartialDateTime>),
Duration(ICalendarDuration),
RecurrenceRule(Box<ICalendarRecurrenceRule>),
Period(ICalendarPeriod),
Float(f64),
Integer(i64),
Text(String),
CalendarScale(CalendarScale),
Method(ICalendarMethod),
Classification(ICalendarClassification),
Status(ICalendarStatus),
Transparency(ICalendarTransparency),
Action(ICalendarAction),
BusyType(ICalendarFreeBusyType),
ParticipantType(ICalendarParticipantType),
ResourceType(ICalendarResourceType),
Proximity(ICalendarProximityValue),
}
impl Eq for ICalendarValue {}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendarRecurrenceRule {
pub freq: ICalendarFrequency,
pub until: Option<PartialDateTime>,
pub count: Option<u32>,
pub interval: Option<u16>,
pub bysecond: Vec<u8>,
pub byminute: Vec<u8>,
pub byhour: Vec<u8>,
pub byday: Vec<ICalendarDay>,
pub bymonthday: Vec<i8>,
pub byyearday: Vec<i16>,
pub byweekno: Vec<i8>,
pub bymonth: Vec<u8>,
pub bysetpos: Vec<i32>,
pub wkst: Option<ICalendarWeekday>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendarDay {
pub ordwk: Option<i16>,
pub weekday: ICalendarWeekday,
}
impl TryFrom<&[u8]> for ICalendarDay {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
let mut iter = value.iter().enumerate();
let mut is_negative = false;
let mut has_ordwk = false;
let mut ordwk: i16 = 0;
loop {
let (pos, ch) = iter.next().ok_or(())?;
match ch {
b'0'..=b'9' => {
ordwk = ordwk.saturating_mul(10).saturating_add((ch - b'0') as i16);
has_ordwk = true;
}
b'-' if pos == 0 => {
is_negative = true;
}
b'+' if pos == 0 => {}
b'A'..=b'Z' | b'a'..=b'z' => {
return ICalendarWeekday::try_from(value.get(pos..).unwrap_or_default()).map(
|weekday| ICalendarDay {
ordwk: has_ordwk.then_some(if is_negative { -ordwk } else { ordwk }),
weekday,
},
);
}
_ => return Err(()),
}
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarFrequency {
Yearly = 0,
Monthly = 1,
Weekly = 2,
#[default]
Daily = 3,
Hourly = 4,
Minutely = 5,
Secondly = 6,
}
impl TryFrom<&[u8]> for ICalendarFrequency {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
hashify::tiny_map_ignore_case!(value,
b"SECONDLY" => ICalendarFrequency::Secondly,
b"MINUTELY" => ICalendarFrequency::Minutely,
b"HOURLY" => ICalendarFrequency::Hourly,
b"DAILY" => ICalendarFrequency::Daily,
b"WEEKLY" => ICalendarFrequency::Weekly,
b"MONTHLY" => ICalendarFrequency::Monthly,
b"YEARLY" => ICalendarFrequency::Yearly,
)
.ok_or(())
}
}
impl ICalendarFrequency {
pub fn as_str(&self) -> &str {
match self {
ICalendarFrequency::Secondly => "SECONDLY",
ICalendarFrequency::Minutely => "MINUTELY",
ICalendarFrequency::Hourly => "HOURLY",
ICalendarFrequency::Daily => "DAILY",
ICalendarFrequency::Weekly => "WEEKLY",
ICalendarFrequency::Monthly => "MONTHLY",
ICalendarFrequency::Yearly => "YEARLY",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarWeekday {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
}
impl TryFrom<&[u8]> for ICalendarWeekday {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
hashify::tiny_map_ignore_case!(value,
b"SU" => ICalendarWeekday::Sunday,
b"MO" => ICalendarWeekday::Monday,
b"TU" => ICalendarWeekday::Tuesday,
b"WE" => ICalendarWeekday::Wednesday,
b"TH" => ICalendarWeekday::Thursday,
b"FR" => ICalendarWeekday::Friday,
b"SA" => ICalendarWeekday::Saturday,
)
.ok_or(())
}
}
impl From<ICalendarWeekday> for chrono::Weekday {
fn from(value: ICalendarWeekday) -> Self {
match value {
ICalendarWeekday::Sunday => chrono::Weekday::Sun,
ICalendarWeekday::Monday => chrono::Weekday::Mon,
ICalendarWeekday::Tuesday => chrono::Weekday::Tue,
ICalendarWeekday::Wednesday => chrono::Weekday::Wed,
ICalendarWeekday::Thursday => chrono::Weekday::Thu,
ICalendarWeekday::Friday => chrono::Weekday::Fri,
ICalendarWeekday::Saturday => chrono::Weekday::Sat,
}
}
}
impl ICalendarWeekday {
pub fn as_str(&self) -> &str {
match self {
ICalendarWeekday::Sunday => "SU",
ICalendarWeekday::Monday => "MO",
ICalendarWeekday::Tuesday => "TU",
ICalendarWeekday::Wednesday => "WE",
ICalendarWeekday::Thursday => "TH",
ICalendarWeekday::Friday => "FR",
ICalendarWeekday::Saturday => "SA",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarPeriod {
Range {
start: PartialDateTime,
end: PartialDateTime,
},
Duration {
start: PartialDateTime,
duration: ICalendarDuration,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarAction {
Audio, Display, Email, Procedure, Other(String),
}
impl From<Token<'_>> for ICalendarAction {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"AUDIO" => ICalendarAction::Audio,
"DISPLAY" => ICalendarAction::Display,
"EMAIL" => ICalendarAction::Email,
"PROCEDURE" => ICalendarAction::Procedure,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarAction {
pub fn as_str(&self) -> &str {
match self {
ICalendarAction::Audio => "AUDIO",
ICalendarAction::Display => "DISPLAY",
ICalendarAction::Email => "EMAIL",
ICalendarAction::Procedure => "PROCEDURE",
ICalendarAction::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarUserTypes {
Individual, Group, Resource, Room, Unknown, Other(String),
}
impl From<Token<'_>> for ICalendarUserTypes {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"INDIVIDUAL" => ICalendarUserTypes::Individual,
"GROUP" => ICalendarUserTypes::Group,
"RESOURCE" => ICalendarUserTypes::Resource,
"ROOM" => ICalendarUserTypes::Room,
"UNKNOWN" => ICalendarUserTypes::Unknown,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarUserTypes {
pub fn as_str(&self) -> &str {
match self {
ICalendarUserTypes::Individual => "INDIVIDUAL",
ICalendarUserTypes::Group => "GROUP",
ICalendarUserTypes::Resource => "RESOURCE",
ICalendarUserTypes::Room => "ROOM",
ICalendarUserTypes::Unknown => "UNKNOWN",
ICalendarUserTypes::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarClassification {
Public, Private, Confidential, Other(String),
}
impl From<Token<'_>> for ICalendarClassification {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"PUBLIC" => ICalendarClassification::Public,
"PRIVATE" => ICalendarClassification::Private,
"CONFIDENTIAL" => ICalendarClassification::Confidential,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarClassification {
pub fn as_str(&self) -> &str {
match self {
ICalendarClassification::Public => "PUBLIC",
ICalendarClassification::Private => "PRIVATE",
ICalendarClassification::Confidential => "CONFIDENTIAL",
ICalendarClassification::Other(value) => value,
}
}
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarComponentType {
#[default]
VCalendar, VEvent, VTodo, VJournal, VFreebusy, VTimezone, VAlarm, Standard, Daylight, VAvailability, Available, Participant, VLocation, VResource, Other(String),
}
impl TryFrom<&[u8]> for ICalendarComponentType {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
hashify::tiny_map_ignore_case!(value,
"VCALENDAR" => ICalendarComponentType::VCalendar,
"VEVENT" => ICalendarComponentType::VEvent,
"VTODO" => ICalendarComponentType::VTodo,
"VJOURNAL" => ICalendarComponentType::VJournal,
"VFREEBUSY" => ICalendarComponentType::VFreebusy,
"VTIMEZONE" => ICalendarComponentType::VTimezone,
"VALARM" => ICalendarComponentType::VAlarm,
"STANDARD" => ICalendarComponentType::Standard,
"DAYLIGHT" => ICalendarComponentType::Daylight,
"VAVAILABILITY" => ICalendarComponentType::VAvailability,
"AVAILABLE" => ICalendarComponentType::Available,
"PARTICIPANT" => ICalendarComponentType::Participant,
"VLOCATION" => ICalendarComponentType::VLocation,
"VRESOURCE" => ICalendarComponentType::VResource,
)
.ok_or(())
}
}
impl ICalendarComponentType {
pub fn as_str(&self) -> &str {
match self {
ICalendarComponentType::VCalendar => "VCALENDAR",
ICalendarComponentType::VEvent => "VEVENT",
ICalendarComponentType::VTodo => "VTODO",
ICalendarComponentType::VJournal => "VJOURNAL",
ICalendarComponentType::VFreebusy => "VFREEBUSY",
ICalendarComponentType::VTimezone => "VTIMEZONE",
ICalendarComponentType::VAlarm => "VALARM",
ICalendarComponentType::Standard => "STANDARD",
ICalendarComponentType::Daylight => "DAYLIGHT",
ICalendarComponentType::VAvailability => "VAVAILABILITY",
ICalendarComponentType::Available => "AVAILABLE",
ICalendarComponentType::Participant => "PARTICIPANT",
ICalendarComponentType::VLocation => "VLOCATION",
ICalendarComponentType::VResource => "VRESOURCE",
ICalendarComponentType::Other(name) => name.as_str(),
}
}
pub fn has_time_ranges(&self) -> bool {
matches!(
self,
ICalendarComponentType::VEvent
| ICalendarComponentType::VTodo
| ICalendarComponentType::VJournal
| ICalendarComponentType::VFreebusy
)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarDisplayType {
Badge, Graphic, Fullsize, Thumbnail, Other(String),
}
impl From<Token<'_>> for ICalendarDisplayType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"BADGE" => ICalendarDisplayType::Badge,
"GRAPHIC" => ICalendarDisplayType::Graphic,
"FULLSIZE" => ICalendarDisplayType::Fullsize,
"THUMBNAIL" => ICalendarDisplayType::Thumbnail,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarDisplayType {
pub fn as_str(&self) -> &str {
match self {
ICalendarDisplayType::Badge => "BADGE",
ICalendarDisplayType::Graphic => "GRAPHIC",
ICalendarDisplayType::Fullsize => "FULLSIZE",
ICalendarDisplayType::Thumbnail => "THUMBNAIL",
ICalendarDisplayType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarFeatureType {
Audio, Chat, Feed, Moderator, Phone, Screen, Video, Other(String),
}
impl From<Token<'_>> for ICalendarFeatureType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"AUDIO" => ICalendarFeatureType::Audio,
"CHAT" => ICalendarFeatureType::Chat,
"FEED" => ICalendarFeatureType::Feed,
"MODERATOR" => ICalendarFeatureType::Moderator,
"PHONE" => ICalendarFeatureType::Phone,
"SCREEN" => ICalendarFeatureType::Screen,
"VIDEO" => ICalendarFeatureType::Video,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarFeatureType {
pub fn as_str(&self) -> &str {
match self {
ICalendarFeatureType::Audio => "AUDIO",
ICalendarFeatureType::Chat => "CHAT",
ICalendarFeatureType::Feed => "FEED",
ICalendarFeatureType::Moderator => "MODERATOR",
ICalendarFeatureType::Phone => "PHONE",
ICalendarFeatureType::Screen => "SCREEN",
ICalendarFeatureType::Video => "VIDEO",
ICalendarFeatureType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarFreeBusyType {
Free, Busy, BusyUnavailable, BusyTentative, Other(String),
}
impl From<Token<'_>> for ICalendarFreeBusyType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"FREE" => ICalendarFreeBusyType::Free,
"BUSY" => ICalendarFreeBusyType::Busy,
"BUSY-UNAVAILABLE" => ICalendarFreeBusyType::BusyUnavailable,
"BUSY-TENTATIVE" => ICalendarFreeBusyType::BusyTentative,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarFreeBusyType {
pub fn as_str(&self) -> &str {
match self {
ICalendarFreeBusyType::Free => "FREE",
ICalendarFreeBusyType::Busy => "BUSY",
ICalendarFreeBusyType::BusyUnavailable => "BUSY-UNAVAILABLE",
ICalendarFreeBusyType::BusyTentative => "BUSY-TENTATIVE",
ICalendarFreeBusyType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarMethod {
Publish, Request, Reply, Add, Cancel, Refresh, Counter, Declinecounter, Other(String),
}
impl From<Token<'_>> for ICalendarMethod {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"PUBLISH" => ICalendarMethod::Publish,
"REQUEST" => ICalendarMethod::Request,
"REPLY" => ICalendarMethod::Reply,
"ADD" => ICalendarMethod::Add,
"CANCEL" => ICalendarMethod::Cancel,
"REFRESH" => ICalendarMethod::Refresh,
"COUNTER" => ICalendarMethod::Counter,
"DECLINECOUNTER" => ICalendarMethod::Declinecounter,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarMethod {
pub fn as_str(&self) -> &str {
match self {
ICalendarMethod::Publish => "PUBLISH",
ICalendarMethod::Request => "REQUEST",
ICalendarMethod::Reply => "REPLY",
ICalendarMethod::Add => "ADD",
ICalendarMethod::Cancel => "CANCEL",
ICalendarMethod::Refresh => "REFRESH",
ICalendarMethod::Counter => "COUNTER",
ICalendarMethod::Declinecounter => "DECLINECOUNTER",
ICalendarMethod::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarParameter {
Altrep(Uri), Cn(String), Cutype(ICalendarUserTypes), DelegatedFrom(Vec<Uri>), DelegatedTo(Vec<Uri>), Dir(Uri), Fmttype(String), Fbtype(ICalendarFreeBusyType), Language(String), Member(Vec<Uri>), Partstat(ICalendarParticipationStatus), Range, Related(Related), Reltype(ICalendarRelationshipType), Role(ICalendarParticipationRole), Rsvp(bool), ScheduleAgent(ICalendarScheduleAgentValue), ScheduleForceSend(ICalendarScheduleForceSendValue), ScheduleStatus(String), SentBy(Uri), Tzid(String), Value(ICalendarValueType), Display(Vec<ICalendarDisplayType>), Email(String), Feature(Vec<ICalendarFeatureType>), Label(String), Size(u64), Filename(String), ManagedId(String), Order(u64), Schema(Uri), Derived(bool), Gap(ICalendarDuration), Linkrel(Uri), Other(Vec<String>),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarParameterName {
Altrep, Cn, Cutype, DelegatedFrom, DelegatedTo, Dir, Fmttype, Fbtype, Language, Member, Partstat, Range, Related, Reltype, Role, Rsvp, ScheduleAgent, ScheduleForceSend, ScheduleStatus, SentBy, Tzid, Value, Display, Email, Feature, Label, Size, Filename, ManagedId, Order, Schema, Derived, Gap, Linkrel, Other(String),
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub struct ICalendarDuration {
pub neg: bool,
pub weeks: u32,
pub days: u32,
pub hours: u32,
pub minutes: u32,
pub seconds: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum Uri {
Data(Data),
Location(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum Related {
Start,
End,
}
impl TryFrom<&[u8]> for Related {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
hashify::tiny_map_ignore_case!(value,
"START" => Related::Start,
"END" => Related::End,
)
.ok_or(())
}
}
impl Related {
pub fn as_str(&self) -> &str {
match self {
Related::Start => "START",
Related::End => "END",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarParticipantType {
Active, Inactive, Sponsor, Contact, BookingContact, EmergencyContact, PublicityContact, PlannerContact, Performer, Speaker, Other(String),
}
impl From<Token<'_>> for ICalendarParticipantType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"ACTIVE" => ICalendarParticipantType::Active,
"INACTIVE" => ICalendarParticipantType::Inactive,
"SPONSOR" => ICalendarParticipantType::Sponsor,
"CONTACT" => ICalendarParticipantType::Contact,
"BOOKING-CONTACT" => ICalendarParticipantType::BookingContact,
"EMERGENCY-CONTACT" => ICalendarParticipantType::EmergencyContact,
"PUBLICITY-CONTACT" => ICalendarParticipantType::PublicityContact,
"PLANNER-CONTACT" => ICalendarParticipantType::PlannerContact,
"PERFORMER" => ICalendarParticipantType::Performer,
"SPEAKER" => ICalendarParticipantType::Speaker,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarParticipantType {
pub fn as_str(&self) -> &str {
match self {
ICalendarParticipantType::Active => "ACTIVE",
ICalendarParticipantType::Inactive => "INACTIVE",
ICalendarParticipantType::Sponsor => "SPONSOR",
ICalendarParticipantType::Contact => "CONTACT",
ICalendarParticipantType::BookingContact => "BOOKING-CONTACT",
ICalendarParticipantType::EmergencyContact => "EMERGENCY-CONTACT",
ICalendarParticipantType::PublicityContact => "PUBLICITY-CONTACT",
ICalendarParticipantType::PlannerContact => "PLANNER-CONTACT",
ICalendarParticipantType::Performer => "PERFORMER",
ICalendarParticipantType::Speaker => "SPEAKER",
ICalendarParticipantType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarParticipationRole {
Chair, ReqParticipant, OptParticipant, NonParticipant, Other(String),
}
impl From<Token<'_>> for ICalendarParticipationRole {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"CHAIR" => ICalendarParticipationRole::Chair,
"REQ-PARTICIPANT" => ICalendarParticipationRole::ReqParticipant,
"OPT-PARTICIPANT" => ICalendarParticipationRole::OptParticipant,
"NON-PARTICIPANT" => ICalendarParticipationRole::NonParticipant,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarParticipationRole {
pub fn as_str(&self) -> &str {
match self {
ICalendarParticipationRole::Chair => "CHAIR",
ICalendarParticipationRole::ReqParticipant => "REQ-PARTICIPANT",
ICalendarParticipationRole::OptParticipant => "OPT-PARTICIPANT",
ICalendarParticipationRole::NonParticipant => "NON-PARTICIPANT",
ICalendarParticipationRole::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarStatus {
Tentative, Confirmed, Cancelled, NeedsAction, Completed, InProcess, Draft, Final, Other(String),
}
impl From<Token<'_>> for ICalendarStatus {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"TENTATIVE" => ICalendarStatus::Tentative,
"CONFIRMED" => ICalendarStatus::Confirmed,
"CANCELLED" => ICalendarStatus::Cancelled,
"NEEDS-ACTION" => ICalendarStatus::NeedsAction,
"COMPLETED" => ICalendarStatus::Completed,
"IN-PROCESS" => ICalendarStatus::InProcess,
"DRAFT" => ICalendarStatus::Draft,
"FINAL" => ICalendarStatus::Final,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarStatus {
pub fn as_str(&self) -> &str {
match self {
ICalendarStatus::Tentative => "TENTATIVE",
ICalendarStatus::Confirmed => "CONFIRMED",
ICalendarStatus::Cancelled => "CANCELLED",
ICalendarStatus::NeedsAction => "NEEDS-ACTION",
ICalendarStatus::Completed => "COMPLETED",
ICalendarStatus::InProcess => "IN-PROCESS",
ICalendarStatus::Draft => "DRAFT",
ICalendarStatus::Final => "FINAL",
ICalendarStatus::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarParticipationStatus {
NeedsAction, Accepted, Declined, Tentative, Delegated, Completed, InProcess, Other(String),
}
impl From<Token<'_>> for ICalendarParticipationStatus {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"NEEDS-ACTION" => ICalendarParticipationStatus::NeedsAction,
"ACCEPTED" => ICalendarParticipationStatus::Accepted,
"DECLINED" => ICalendarParticipationStatus::Declined,
"TENTATIVE" => ICalendarParticipationStatus::Tentative,
"DELEGATED" => ICalendarParticipationStatus::Delegated,
"COMPLETED" => ICalendarParticipationStatus::Completed,
"IN-PROCESS" => ICalendarParticipationStatus::InProcess,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarParticipationStatus {
pub fn as_str(&self) -> &str {
match self {
ICalendarParticipationStatus::NeedsAction => "NEEDS-ACTION",
ICalendarParticipationStatus::Accepted => "ACCEPTED",
ICalendarParticipationStatus::Declined => "DECLINED",
ICalendarParticipationStatus::Tentative => "TENTATIVE",
ICalendarParticipationStatus::Delegated => "DELEGATED",
ICalendarParticipationStatus::Completed => "COMPLETED",
ICalendarParticipationStatus::InProcess => "IN-PROCESS",
ICalendarParticipationStatus::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarProperty {
Calscale, Method, Prodid, Version, Attach, Categories, Class, Comment, Description, Geo, Location, PercentComplete, Priority, Resources, Status, Summary, Completed, Dtend, Due, Dtstart, Duration, Freebusy, Transp, Tzid, Tzname, Tzoffsetfrom, Tzoffsetto, Tzurl, Attendee, Contact, Organizer, RecurrenceId, RelatedTo, Url, Uid, Exdate, Exrule, Rdate, Rrule, Action, Repeat, Trigger, Created, Dtstamp, LastModified, Sequence, RequestStatus, Xml, Tzuntil, TzidAliasOf, Busytype, Name, RefreshInterval, Source, Color, Image, Conference, CalendarAddress, LocationType, ParticipantType, ResourceType, StructuredData, StyledDescription, Acknowledged, Proximity, Concept, Link, Refid, Begin,
End,
Other(String),
}
impl TryFrom<&[u8]> for ICalendarProperty {
type Error = ();
fn try_from(value: &[u8]) -> Result<Self, ()> {
hashify::tiny_map_ignore_case!(value,
"CALSCALE" => ICalendarProperty::Calscale,
"METHOD" => ICalendarProperty::Method,
"PRODID" => ICalendarProperty::Prodid,
"VERSION" => ICalendarProperty::Version,
"ATTACH" => ICalendarProperty::Attach,
"CATEGORIES" => ICalendarProperty::Categories,
"CLASS" => ICalendarProperty::Class,
"COMMENT" => ICalendarProperty::Comment,
"DESCRIPTION" => ICalendarProperty::Description,
"GEO" => ICalendarProperty::Geo,
"LOCATION" => ICalendarProperty::Location,
"PERCENT-COMPLETE" => ICalendarProperty::PercentComplete,
"PRIORITY" => ICalendarProperty::Priority,
"RESOURCES" => ICalendarProperty::Resources,
"STATUS" => ICalendarProperty::Status,
"SUMMARY" => ICalendarProperty::Summary,
"COMPLETED" => ICalendarProperty::Completed,
"DTEND" => ICalendarProperty::Dtend,
"DUE" => ICalendarProperty::Due,
"DTSTART" => ICalendarProperty::Dtstart,
"DURATION" => ICalendarProperty::Duration,
"FREEBUSY" => ICalendarProperty::Freebusy,
"TRANSP" => ICalendarProperty::Transp,
"TZID" => ICalendarProperty::Tzid,
"TZNAME" => ICalendarProperty::Tzname,
"TZOFFSETFROM" => ICalendarProperty::Tzoffsetfrom,
"TZOFFSETTO" => ICalendarProperty::Tzoffsetto,
"TZURL" => ICalendarProperty::Tzurl,
"ATTENDEE" => ICalendarProperty::Attendee,
"CONTACT" => ICalendarProperty::Contact,
"ORGANIZER" => ICalendarProperty::Organizer,
"RECURRENCE-ID" => ICalendarProperty::RecurrenceId,
"RELATED-TO" => ICalendarProperty::RelatedTo,
"URL" => ICalendarProperty::Url,
"UID" => ICalendarProperty::Uid,
"EXDATE" => ICalendarProperty::Exdate,
"EXRULE" => ICalendarProperty::Exrule,
"RDATE" => ICalendarProperty::Rdate,
"RRULE" => ICalendarProperty::Rrule,
"ACTION" => ICalendarProperty::Action,
"REPEAT" => ICalendarProperty::Repeat,
"TRIGGER" => ICalendarProperty::Trigger,
"CREATED" => ICalendarProperty::Created,
"DTSTAMP" => ICalendarProperty::Dtstamp,
"LAST-MODIFIED" => ICalendarProperty::LastModified,
"SEQUENCE" => ICalendarProperty::Sequence,
"REQUEST-STATUS" => ICalendarProperty::RequestStatus,
"XML" => ICalendarProperty::Xml,
"TZUNTIL" => ICalendarProperty::Tzuntil,
"TZID-ALIAS-OF" => ICalendarProperty::TzidAliasOf,
"BUSYTYPE" => ICalendarProperty::Busytype,
"NAME" => ICalendarProperty::Name,
"REFRESH-INTERVAL" => ICalendarProperty::RefreshInterval,
"SOURCE" => ICalendarProperty::Source,
"COLOR" => ICalendarProperty::Color,
"IMAGE" => ICalendarProperty::Image,
"CONFERENCE" => ICalendarProperty::Conference,
"CALENDAR-ADDRESS" => ICalendarProperty::CalendarAddress,
"LOCATION-TYPE" => ICalendarProperty::LocationType,
"PARTICIPANT-TYPE" => ICalendarProperty::ParticipantType,
"RESOURCE-TYPE" => ICalendarProperty::ResourceType,
"STRUCTURED-DATA" => ICalendarProperty::StructuredData,
"STYLED-DESCRIPTION" => ICalendarProperty::StyledDescription,
"ACKNOWLEDGED" => ICalendarProperty::Acknowledged,
"PROXIMITY" => ICalendarProperty::Proximity,
"CONCEPT" => ICalendarProperty::Concept,
"LINK" => ICalendarProperty::Link,
"REFID" => ICalendarProperty::Refid,
"BEGIN" => ICalendarProperty::Begin,
"END" => ICalendarProperty::End,
)
.ok_or(())
}
}
impl ICalendarProperty {
pub fn as_str(&self) -> &str {
match self {
ICalendarProperty::Calscale => "CALSCALE",
ICalendarProperty::Method => "METHOD",
ICalendarProperty::Prodid => "PRODID",
ICalendarProperty::Version => "VERSION",
ICalendarProperty::Attach => "ATTACH",
ICalendarProperty::Categories => "CATEGORIES",
ICalendarProperty::Class => "CLASS",
ICalendarProperty::Comment => "COMMENT",
ICalendarProperty::Description => "DESCRIPTION",
ICalendarProperty::Geo => "GEO",
ICalendarProperty::Location => "LOCATION",
ICalendarProperty::PercentComplete => "PERCENT-COMPLETE",
ICalendarProperty::Priority => "PRIORITY",
ICalendarProperty::Resources => "RESOURCES",
ICalendarProperty::Status => "STATUS",
ICalendarProperty::Summary => "SUMMARY",
ICalendarProperty::Completed => "COMPLETED",
ICalendarProperty::Dtend => "DTEND",
ICalendarProperty::Due => "DUE",
ICalendarProperty::Dtstart => "DTSTART",
ICalendarProperty::Duration => "DURATION",
ICalendarProperty::Freebusy => "FREEBUSY",
ICalendarProperty::Transp => "TRANSP",
ICalendarProperty::Tzid => "TZID",
ICalendarProperty::Tzname => "TZNAME",
ICalendarProperty::Tzoffsetfrom => "TZOFFSETFROM",
ICalendarProperty::Tzoffsetto => "TZOFFSETTO",
ICalendarProperty::Tzurl => "TZURL",
ICalendarProperty::Attendee => "ATTENDEE",
ICalendarProperty::Contact => "CONTACT",
ICalendarProperty::Organizer => "ORGANIZER",
ICalendarProperty::RecurrenceId => "RECURRENCE-ID",
ICalendarProperty::RelatedTo => "RELATED-TO",
ICalendarProperty::Url => "URL",
ICalendarProperty::Uid => "UID",
ICalendarProperty::Exdate => "EXDATE",
ICalendarProperty::Exrule => "EXRULE",
ICalendarProperty::Rdate => "RDATE",
ICalendarProperty::Rrule => "RRULE",
ICalendarProperty::Action => "ACTION",
ICalendarProperty::Repeat => "REPEAT",
ICalendarProperty::Trigger => "TRIGGER",
ICalendarProperty::Created => "CREATED",
ICalendarProperty::Dtstamp => "DTSTAMP",
ICalendarProperty::LastModified => "LAST-MODIFIED",
ICalendarProperty::Sequence => "SEQUENCE",
ICalendarProperty::RequestStatus => "REQUEST-STATUS",
ICalendarProperty::Xml => "XML",
ICalendarProperty::Tzuntil => "TZUNTIL",
ICalendarProperty::TzidAliasOf => "TZID-ALIAS-OF",
ICalendarProperty::Busytype => "BUSYTYPE",
ICalendarProperty::Name => "NAME",
ICalendarProperty::RefreshInterval => "REFRESH-INTERVAL",
ICalendarProperty::Source => "SOURCE",
ICalendarProperty::Color => "COLOR",
ICalendarProperty::Image => "IMAGE",
ICalendarProperty::Conference => "CONFERENCE",
ICalendarProperty::CalendarAddress => "CALENDAR-ADDRESS",
ICalendarProperty::LocationType => "LOCATION-TYPE",
ICalendarProperty::ParticipantType => "PARTICIPANT-TYPE",
ICalendarProperty::ResourceType => "RESOURCE-TYPE",
ICalendarProperty::StructuredData => "STRUCTURED-DATA",
ICalendarProperty::StyledDescription => "STYLED-DESCRIPTION",
ICalendarProperty::Acknowledged => "ACKNOWLEDGED",
ICalendarProperty::Proximity => "PROXIMITY",
ICalendarProperty::Concept => "CONCEPT",
ICalendarProperty::Link => "LINK",
ICalendarProperty::Refid => "REFID",
ICalendarProperty::Begin => "BEGIN",
ICalendarProperty::End => "END",
ICalendarProperty::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarProximityValue {
Arrive, Depart, Connect, Disconnect, Other(String),
}
impl From<Token<'_>> for ICalendarProximityValue {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"ARRIVE" => ICalendarProximityValue::Arrive,
"DEPART" => ICalendarProximityValue::Depart,
"CONNECT" => ICalendarProximityValue::Connect,
"DISCONNECT" => ICalendarProximityValue::Disconnect,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarProximityValue {
pub fn as_str(&self) -> &str {
match self {
ICalendarProximityValue::Arrive => "ARRIVE",
ICalendarProximityValue::Depart => "DEPART",
ICalendarProximityValue::Connect => "CONNECT",
ICalendarProximityValue::Disconnect => "DISCONNECT",
ICalendarProximityValue::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarRelationshipType {
Child, Parent, Sibling, Snooze, Concept, DependsOn, Finishtofinish, Finishtostart, First, Next, Refid, Starttofinish, Starttostart, Other(String),
}
impl From<Token<'_>> for ICalendarRelationshipType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"CHILD" => ICalendarRelationshipType::Child,
"PARENT" => ICalendarRelationshipType::Parent,
"SIBLING" => ICalendarRelationshipType::Sibling,
"SNOOZE" => ICalendarRelationshipType::Snooze,
"CONCEPT" => ICalendarRelationshipType::Concept,
"DEPENDS-ON" => ICalendarRelationshipType::DependsOn,
"FINISHTOFINISH" => ICalendarRelationshipType::Finishtofinish,
"FINISHTOSTART" => ICalendarRelationshipType::Finishtostart,
"FIRST" => ICalendarRelationshipType::First,
"NEXT" => ICalendarRelationshipType::Next,
"REFID" => ICalendarRelationshipType::Refid,
"STARTTOFINISH" => ICalendarRelationshipType::Starttofinish,
"STARTTOSTART" => ICalendarRelationshipType::Starttostart,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarRelationshipType {
pub fn as_str(&self) -> &str {
match self {
ICalendarRelationshipType::Child => "CHILD",
ICalendarRelationshipType::Parent => "PARENT",
ICalendarRelationshipType::Sibling => "SIBLING",
ICalendarRelationshipType::Snooze => "SNOOZE",
ICalendarRelationshipType::Concept => "CONCEPT",
ICalendarRelationshipType::DependsOn => "DEPENDS-ON",
ICalendarRelationshipType::Finishtofinish => "FINISHTOFINISH",
ICalendarRelationshipType::Finishtostart => "FINISHTOSTART",
ICalendarRelationshipType::First => "FIRST",
ICalendarRelationshipType::Next => "NEXT",
ICalendarRelationshipType::Refid => "REFID",
ICalendarRelationshipType::Starttofinish => "STARTTOFINISH",
ICalendarRelationshipType::Starttostart => "STARTTOSTART",
ICalendarRelationshipType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarResourceType {
Projector, Room, RemoteConferenceAudio, RemoteConferenceVideo, Other(String),
}
impl From<Token<'_>> for ICalendarResourceType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"PROJECTOR" => ICalendarResourceType::Projector,
"ROOM" => ICalendarResourceType::Room,
"REMOTE-CONFERENCE-AUDIO" => ICalendarResourceType::RemoteConferenceAudio,
"REMOTE-CONFERENCE-VIDEO" => ICalendarResourceType::RemoteConferenceVideo,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarResourceType {
pub fn as_str(&self) -> &str {
match self {
ICalendarResourceType::Projector => "PROJECTOR",
ICalendarResourceType::Room => "ROOM",
ICalendarResourceType::RemoteConferenceAudio => "REMOTE-CONFERENCE-AUDIO",
ICalendarResourceType::RemoteConferenceVideo => "REMOTE-CONFERENCE-VIDEO",
ICalendarResourceType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarScheduleAgentValue {
Server, Client, None, Other(String),
}
impl From<Token<'_>> for ICalendarScheduleAgentValue {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"SERVER" => ICalendarScheduleAgentValue::Server,
"CLIENT" => ICalendarScheduleAgentValue::Client,
"NONE" => ICalendarScheduleAgentValue::None,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarScheduleAgentValue {
pub fn as_str(&self) -> &str {
match self {
ICalendarScheduleAgentValue::Server => "SERVER",
ICalendarScheduleAgentValue::Client => "CLIENT",
ICalendarScheduleAgentValue::None => "NONE",
ICalendarScheduleAgentValue::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarScheduleForceSendValue {
Request, Reply, Other(String),
}
impl From<Token<'_>> for ICalendarScheduleForceSendValue {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"REQUEST" => ICalendarScheduleForceSendValue::Request,
"REPLY" => ICalendarScheduleForceSendValue::Reply,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarScheduleForceSendValue {
pub fn as_str(&self) -> &str {
match self {
ICalendarScheduleForceSendValue::Request => "REQUEST",
ICalendarScheduleForceSendValue::Reply => "REPLY",
ICalendarScheduleForceSendValue::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarValueType {
Binary, Boolean, CalAddress, Date, DateTime, Duration, Float, Integer, Period, Recur, Text, Time, Unknown, Uri, UtcOffset, XmlReference, Uid, Other(String),
}
impl From<Token<'_>> for ICalendarValueType {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"BINARY" => ICalendarValueType::Binary,
"BOOLEAN" => ICalendarValueType::Boolean,
"CAL-ADDRESS" => ICalendarValueType::CalAddress,
"DATE" => ICalendarValueType::Date,
"DATE-TIME" => ICalendarValueType::DateTime,
"DURATION" => ICalendarValueType::Duration,
"FLOAT" => ICalendarValueType::Float,
"INTEGER" => ICalendarValueType::Integer,
"PERIOD" => ICalendarValueType::Period,
"RECUR" => ICalendarValueType::Recur,
"TEXT" => ICalendarValueType::Text,
"TIME" => ICalendarValueType::Time,
"UNKNOWN" => ICalendarValueType::Unknown,
"URI" => ICalendarValueType::Uri,
"UTC-OFFSET" => ICalendarValueType::UtcOffset,
"XML-REFERENCE" => ICalendarValueType::XmlReference,
"UID" => ICalendarValueType::Uid,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarValueType {
pub fn as_str(&self) -> &str {
match self {
ICalendarValueType::Binary => "BINARY",
ICalendarValueType::Boolean => "BOOLEAN",
ICalendarValueType::CalAddress => "CAL-ADDRESS",
ICalendarValueType::Date => "DATE",
ICalendarValueType::DateTime => "DATE-TIME",
ICalendarValueType::Duration => "DURATION",
ICalendarValueType::Float => "FLOAT",
ICalendarValueType::Integer => "INTEGER",
ICalendarValueType::Period => "PERIOD",
ICalendarValueType::Recur => "RECUR",
ICalendarValueType::Text => "TEXT",
ICalendarValueType::Time => "TIME",
ICalendarValueType::Unknown => "UNKNOWN",
ICalendarValueType::Uri => "URI",
ICalendarValueType::UtcOffset => "UTC-OFFSET",
ICalendarValueType::XmlReference => "XML-REFERENCE",
ICalendarValueType::Uid => "UID",
ICalendarValueType::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
any(test, feature = "serde"),
derive(serde::Serialize, serde::Deserialize)
)]
#[cfg_attr(any(test, feature = "serde"), serde(tag = "type", content = "data"))]
#[cfg_attr(
feature = "rkyv",
derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
)]
#[cfg_attr(feature = "rkyv", rkyv(compare(PartialEq), derive(Debug)))]
pub enum ICalendarTransparency {
Opaque,
Transparent,
Other(String),
}
impl From<Token<'_>> for ICalendarTransparency {
fn from(token: Token<'_>) -> Self {
hashify::tiny_map_ignore_case!(token.text.as_ref(),
"OPAQUE" => ICalendarTransparency::Opaque,
"TRANSPARENT" => ICalendarTransparency::Transparent,
)
.unwrap_or_else(|| Self::Other(token.into_string()))
}
}
impl ICalendarTransparency {
pub fn as_str(&self) -> &str {
match self {
ICalendarTransparency::Opaque => "OPAQUE",
ICalendarTransparency::Transparent => "TRANSPARENT",
ICalendarTransparency::Other(value) => value,
}
}
}
impl AsRef<str> for ICalendarFrequency {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarWeekday {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarAction {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarUserTypes {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarClassification {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarComponentType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarDisplayType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarFeatureType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarFreeBusyType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarMethod {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for Related {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarParticipantType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarParticipationRole {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarParticipationStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarProperty {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarProximityValue {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarRelationshipType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarResourceType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarScheduleAgentValue {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarScheduleForceSendValue {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarValueType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl AsRef<str> for ICalendarTransparency {
fn as_ref(&self) -> &str {
self.as_str()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum ValueSeparator {
None,
Comma,
Semicolon,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum ValueType {
Ical(ICalendarValueType),
CalendarScale,
Method,
Classification,
Status,
Transparency,
Action,
BusyType,
ParticipantType,
ResourceType,
Proximity,
}
impl ICalendarProperty {
pub(crate) fn default_types(&self) -> (ValueType, ValueSeparator) {
match self {
ICalendarProperty::Calscale => (ValueType::CalendarScale, ValueSeparator::None),
ICalendarProperty::Method => (ValueType::Method, ValueSeparator::None),
ICalendarProperty::Prodid => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Version => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Attach => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Categories => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::Comma,
),
ICalendarProperty::Class => (ValueType::Classification, ValueSeparator::None),
ICalendarProperty::Comment => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Description => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Geo => (
ValueType::Ical(ICalendarValueType::Float),
ValueSeparator::Semicolon,
),
ICalendarProperty::Location => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::PercentComplete => (
ValueType::Ical(ICalendarValueType::Integer),
ValueSeparator::None,
),
ICalendarProperty::Priority => (
ValueType::Ical(ICalendarValueType::Integer),
ValueSeparator::None,
),
ICalendarProperty::Resources => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::Comma,
),
ICalendarProperty::Status => (ValueType::Status, ValueSeparator::None),
ICalendarProperty::Summary => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Completed => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Dtend => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Due => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Dtstart => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Duration => (
ValueType::Ical(ICalendarValueType::Duration),
ValueSeparator::None,
),
ICalendarProperty::Freebusy => (
ValueType::Ical(ICalendarValueType::Period),
ValueSeparator::None,
),
ICalendarProperty::Transp => (ValueType::Transparency, ValueSeparator::None),
ICalendarProperty::Tzid => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Tzname => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Tzoffsetfrom => (
ValueType::Ical(ICalendarValueType::UtcOffset),
ValueSeparator::None,
),
ICalendarProperty::Tzoffsetto => (
ValueType::Ical(ICalendarValueType::UtcOffset),
ValueSeparator::None,
),
ICalendarProperty::Tzurl => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Attendee => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Contact => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Organizer => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::RecurrenceId => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::RelatedTo => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Url => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Uid => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Exdate => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::Comma,
),
ICalendarProperty::Exrule => (
ValueType::Ical(ICalendarValueType::Recur),
ValueSeparator::None,
),
ICalendarProperty::Rdate => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::Comma,
),
ICalendarProperty::Rrule => (
ValueType::Ical(ICalendarValueType::Recur),
ValueSeparator::None,
),
ICalendarProperty::Action => (ValueType::Action, ValueSeparator::None),
ICalendarProperty::Repeat => (
ValueType::Ical(ICalendarValueType::Integer),
ValueSeparator::None,
),
ICalendarProperty::Trigger => (
ValueType::Ical(ICalendarValueType::Duration),
ValueSeparator::None,
),
ICalendarProperty::Created => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Dtstamp => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::LastModified => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Sequence => (
ValueType::Ical(ICalendarValueType::Integer),
ValueSeparator::None,
),
ICalendarProperty::RequestStatus => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::Semicolon,
),
ICalendarProperty::Xml => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Tzuntil => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::TzidAliasOf => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Busytype => (ValueType::BusyType, ValueSeparator::None),
ICalendarProperty::Name => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::RefreshInterval => (
ValueType::Ical(ICalendarValueType::Duration),
ValueSeparator::None,
),
ICalendarProperty::Source => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Color => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Image => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Conference => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::CalendarAddress => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::LocationType => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::Comma,
),
ICalendarProperty::ParticipantType => {
(ValueType::ParticipantType, ValueSeparator::None)
}
ICalendarProperty::ResourceType => (ValueType::ResourceType, ValueSeparator::None),
ICalendarProperty::StructuredData => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::StyledDescription => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Acknowledged => (
ValueType::Ical(ICalendarValueType::DateTime),
ValueSeparator::None,
),
ICalendarProperty::Proximity => (ValueType::Proximity, ValueSeparator::None),
ICalendarProperty::Concept => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Link => (
ValueType::Ical(ICalendarValueType::Uri),
ValueSeparator::None,
),
ICalendarProperty::Refid => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Begin => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::End => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::None,
),
ICalendarProperty::Other(_) => (
ValueType::Ical(ICalendarValueType::Text),
ValueSeparator::Semicolon,
),
}
}
}
impl ValueType {
pub fn unwrap_ical(self) -> ICalendarValueType {
match self {
ValueType::Ical(value) => value,
_ => ICalendarValueType::Text,
}
}
}
impl ICalendar {
pub fn parse(value: impl AsRef<str>) -> Result<Self, Entry> {
let mut parser = Parser::new(value.as_ref());
match parser.entry() {
Entry::ICalendar(icalendar) => Ok(icalendar),
other => Err(other),
}
}
}