#![deny(missing_docs)]
#![deny(rustdoc::broken_intra_doc_links)]
pub mod parse;
pub mod semantics;
#[allow(clippy::module_inception)]
pub mod serialize;
pub mod vtimezone;
#[cfg(test)]
mod tests;
use chrono::{DateTime, Utc};
use compact_str::CompactString;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum Method {
Request,
Reply,
Cancel,
Update,
Counter,
Refresh,
Add,
Publish,
DeclineCounter,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub enum CalDateTime {
Floating(chrono::NaiveDateTime),
Utc(DateTime<Utc>),
Zoned {
tz_name: CompactString,
local: chrono::NaiveDateTime,
},
Date(chrono::NaiveDate),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum PartStat {
NeedsAction,
Accepted,
Declined,
Tentative,
Delegated,
Completed,
InProcess,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum Role {
Chair,
ReqParticipant,
OptParticipant,
NonParticipant,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Attendee {
pub email: String,
pub cn: Option<CompactString>,
pub partstat: PartStat,
pub role: Role,
pub rsvp: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Person {
pub email: String,
pub cn: Option<CompactString>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
pub enum EventStatus {
Confirmed,
Tentative,
Cancelled,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct VTimezone {
pub tzid: CompactString,
pub raw_subs: Vec<RawComponent>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct RawComponent {
pub name: CompactString,
pub properties: Vec<RawProperty>,
pub children: Vec<RawComponent>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct RawProperty {
pub name: CompactString,
pub params: Vec<(CompactString, CompactString)>,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ParsedInvite {
pub method: Method,
pub uid: String,
pub sequence: i32,
pub dtstamp: DateTime<Utc>,
pub dtstart: CalDateTime,
pub dtend: Option<CalDateTime>,
pub duration: Option<chrono::Duration>,
pub organizer: Option<Person>,
pub attendees: Vec<Attendee>,
pub rrule: Option<String>,
pub exdate: Vec<CalDateTime>,
pub rdate: Vec<CalDateTime>,
pub recurrence_id: Option<CalDateTime>,
pub status: Option<EventStatus>,
pub summary: String,
pub location: Option<String>,
pub description: Option<String>,
pub vtimezones: Vec<VTimezone>,
}
#[derive(Debug, PartialEq, Eq)]
pub enum IcalError {
NotUtf8,
InvalidSyntax(String),
InvalidSemantics(String),
NoEvent,
}
pub fn parse_invite(bytes: &[u8]) -> Result<ParsedInvite, IcalError> {
let text = std::str::from_utf8(bytes).map_err(|_| IcalError::NotUtf8)?;
let calendar = parse::parse_calendar(text)?;
semantics::lift(&calendar)
}