automata/ical

RFC 5545 iCalendar parser and emitter built on top of automata/rrule. Handles the VCALENDAR envelope — VEVENT / VTODO / VJOURNAL / VFREEBUSY / VTIMEZONE / VALARM blocks, §3.1 line folding (CRLF/LF tolerant input, CRLF output, 75-octet UTF-8 boundary on emit), §3.2 quoted parameter values, §3.3.11 TEXT escaping (\\, \,, \;, \n/\N), and §3.4 content-line layout.

RRULE values are preserved as automata/rrule.RawRRule so callers can pipe them through rrule.validateInvalidRRule wraps the syntactic rrule/parser.ParseError. Unknown component kinds round-trip through UnknownComponent rather than being dropped.

Types

pub type IcalError {
  UnexpectedEnd(line: Int)
  MismatchedBlock(begin: String, end: String, line: Int)
  MalformedProperty(line: Int, raw: String)
  MalformedParameter(line: Int, raw: String)
  MissingVersion
  MissingProductId
  MissingComponentProperty(component: String, name: String)
  InvalidDateTime(name: String, raw: String)
  InvalidEscape(raw: String)
  InvalidInteger(name: String, raw: String)
  InvalidRRule(raw: String, error: parser.ParseError)
  DuplicateRRule(component_uid: String)
  EmptyInputError
}

Constructors

  • UnexpectedEnd(line: Int)
  • MismatchedBlock(begin: String, end: String, line: Int)
  • MalformedProperty(line: Int, raw: String)
  • MalformedParameter(line: Int, raw: String)
  • MissingVersion
  • MissingProductId
  • MissingComponentProperty(component: String, name: String)
  • InvalidDateTime(name: String, raw: String)
  • InvalidEscape(raw: String)
  • InvalidInteger(name: String, raw: String)
  • InvalidRRule(raw: String, error: parser.ParseError)
  • DuplicateRRule(component_uid: String)
  • EmptyInputError

Values

pub fn add_alarm(
  event: validator.Event,
  alarm: validator.Alarm,
) -> validator.Event
pub fn add_alarm_attendee(
  alarm: validator.Alarm,
  value: String,
) -> validator.Alarm
pub fn add_attendee(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn add_category(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn add_freebusy_attendee(
  fb: validator.FreeBusy,
  value: String,
) -> validator.FreeBusy
pub fn add_freebusy_period(
  fb: validator.FreeBusy,
  value: String,
) -> validator.FreeBusy
pub fn add_journal_category(
  j: validator.Journal,
  value: String,
) -> validator.Journal
pub fn add_todo_category(
  t: validator.Todo,
  value: String,
) -> validator.Todo
pub fn alarm_action(a: validator.Alarm) -> String
pub fn alarm_attendees(a: validator.Alarm) -> List(String)
pub fn alarm_description(
  a: validator.Alarm,
) -> option.Option(String)
pub fn alarm_duration(
  a: validator.Alarm,
) -> option.Option(String)
pub fn alarm_repeat(a: validator.Alarm) -> option.Option(Int)
pub fn alarm_summary(a: validator.Alarm) -> option.Option(String)
pub fn alarm_trigger(a: validator.Alarm) -> String
pub fn alarm_x_properties(
  a: validator.Alarm,
) -> dict.Dict(String, String)
pub fn calendar_x_properties(
  cal: validator.Calendar,
) -> dict.Dict(String, String)
pub fn calscale(cal: validator.Calendar) -> option.Option(String)
pub fn encode(cal: validator.Calendar) -> String

Render a Calendar back to the RFC 5545 wire format. Output uses CRLF line terminators and folds at 75 UTF-8 octets.

pub fn event_alarms(
  event: validator.Event,
) -> List(validator.Alarm)
pub fn event_attendees(event: validator.Event) -> List(String)
pub fn event_categories(event: validator.Event) -> List(String)
pub fn event_description(
  event: validator.Event,
) -> option.Option(String)
pub fn event_dtend_tzid(
  event: validator.Event,
) -> option.Option(String)
pub fn event_dtstamp(event: validator.Event) -> ast.DateTime
pub fn event_dtstart_tzid(
  event: validator.Event,
) -> option.Option(String)
pub fn event_duration(
  event: validator.Event,
) -> option.Option(String)
pub fn event_exdates(
  event: validator.Event,
) -> List(ast.DateTime)
pub fn event_last_modified(
  event: validator.Event,
) -> option.Option(ast.DateTime)
pub fn event_location(
  event: validator.Event,
) -> option.Option(String)
pub fn event_organizer(
  event: validator.Event,
) -> option.Option(String)
pub fn event_rdates(event: validator.Event) -> List(ast.DateTime)
pub fn event_sequence(event: validator.Event) -> Int
pub fn event_status(
  event: validator.Event,
) -> option.Option(String)
pub fn event_summary(
  event: validator.Event,
) -> option.Option(String)
pub fn event_transparency(
  event: validator.Event,
) -> option.Option(String)
pub fn event_uid(event: validator.Event) -> String
pub fn event_url(event: validator.Event) -> option.Option(String)
pub fn event_x_properties(
  event: validator.Event,
) -> dict.Dict(String, String)
pub fn freebusy(
  cal: validator.Calendar,
) -> List(validator.FreeBusy)
pub fn freebusy_attendees(fb: validator.FreeBusy) -> List(String)
pub fn freebusy_organizer(
  fb: validator.FreeBusy,
) -> option.Option(String)
pub fn freebusy_periods(fb: validator.FreeBusy) -> List(String)
pub fn freebusy_uid(fb: validator.FreeBusy) -> String
pub fn freebusy_x_properties(
  fb: validator.FreeBusy,
) -> dict.Dict(String, String)
pub fn journal_categories(j: validator.Journal) -> List(String)
pub fn journal_description(
  j: validator.Journal,
) -> option.Option(String)
pub fn journal_status(
  j: validator.Journal,
) -> option.Option(String)
pub fn journal_summary(
  j: validator.Journal,
) -> option.Option(String)
pub fn journal_uid(j: validator.Journal) -> String
pub fn journal_x_properties(
  j: validator.Journal,
) -> dict.Dict(String, String)
pub fn journals(
  cal: validator.Calendar,
) -> List(validator.Journal)
pub fn method(cal: validator.Calendar) -> option.Option(String)
pub fn new_alarm(
  action action: String,
  trigger trigger: String,
) -> validator.Alarm
pub fn new_calendar(
  version version: String,
  prod_id prod_id: String,
) -> validator.Calendar
pub fn new_event(
  uid uid: String,
  dtstamp dtstamp: ast.DateTime,
) -> validator.Event
pub fn new_freebusy(
  uid uid: String,
  dtstamp dtstamp: ast.DateTime,
) -> validator.FreeBusy
pub fn new_journal(
  uid uid: String,
  dtstamp dtstamp: ast.DateTime,
) -> validator.Journal
pub fn new_timezone(tzid tzid: String) -> validator.Timezone
pub fn new_timezone_rule(
  dtstart dtstart: ast.DateTime,
  offset_from offset_from: String,
  offset_to offset_to: String,
) -> validator.TimezoneRule
pub fn new_todo(
  uid uid: String,
  dtstamp dtstamp: ast.DateTime,
) -> validator.Todo
pub fn parse(
  input: String,
) -> Result(validator.Calendar, IcalError)

Parse an iCalendar document into a validated Calendar. Errors from the lexer, parser, and validator are mapped into the unified IcalError type so callers only need one pattern-match.

pub fn product_id(cal: validator.Calendar) -> String
pub fn timezone_daylight(
  tz: validator.Timezone,
) -> List(validator.TimezoneRule)
pub fn timezone_standard(
  tz: validator.Timezone,
) -> List(validator.TimezoneRule)
pub fn timezone_tzid(tz: validator.Timezone) -> String
pub fn timezone_tzurl(
  tz: validator.Timezone,
) -> option.Option(String)
pub fn timezone_x_properties(
  tz: validator.Timezone,
) -> dict.Dict(String, String)
pub fn timezones(
  cal: validator.Calendar,
) -> List(validator.Timezone)
pub fn todo_alarms(t: validator.Todo) -> List(validator.Alarm)
pub fn todo_categories(t: validator.Todo) -> List(String)
pub fn todo_description(
  t: validator.Todo,
) -> option.Option(String)
pub fn todo_exdates(t: validator.Todo) -> List(ast.DateTime)
pub fn todo_percent_complete(
  t: validator.Todo,
) -> option.Option(Int)
pub fn todo_priority(t: validator.Todo) -> option.Option(Int)
pub fn todo_rdates(t: validator.Todo) -> List(ast.DateTime)
pub fn todo_status(t: validator.Todo) -> option.Option(String)
pub fn todo_summary(t: validator.Todo) -> option.Option(String)
pub fn todo_uid(t: validator.Todo) -> String
pub fn todo_x_properties(
  t: validator.Todo,
) -> dict.Dict(String, String)
pub fn version(cal: validator.Calendar) -> String
pub fn with_alarm_description(
  alarm: validator.Alarm,
  value: String,
) -> validator.Alarm
pub fn with_alarm_duration(
  alarm: validator.Alarm,
  value: String,
) -> validator.Alarm
pub fn with_alarm_repeat(
  alarm: validator.Alarm,
  value: Int,
) -> validator.Alarm
pub fn with_alarm_summary(
  alarm: validator.Alarm,
  value: String,
) -> validator.Alarm
pub fn with_alarm_x_property(
  alarm: validator.Alarm,
  name: String,
  value: String,
) -> validator.Alarm
pub fn with_calendar_x_property(
  cal: validator.Calendar,
  name: String,
  value: String,
) -> validator.Calendar
pub fn with_calscale(
  cal: validator.Calendar,
  scale: String,
) -> validator.Calendar
pub fn with_created(
  event: validator.Event,
  dt: ast.DateTime,
) -> validator.Event
pub fn with_description(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_dtend_tzid(
  event: validator.Event,
  tzid: String,
) -> validator.Event
pub fn with_dtstart(
  event: validator.Event,
  dt: ast.DateTime,
) -> validator.Event
pub fn with_dtstart_tzid(
  event: validator.Event,
  tzid: String,
) -> validator.Event
pub fn with_duration(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_event_x_property(
  event: validator.Event,
  name: String,
  value: String,
) -> validator.Event
pub fn with_freebusy_organizer(
  fb: validator.FreeBusy,
  value: String,
) -> validator.FreeBusy
pub fn with_freebusy_x_property(
  fb: validator.FreeBusy,
  name: String,
  value: String,
) -> validator.FreeBusy
pub fn with_journal_description(
  j: validator.Journal,
  value: String,
) -> validator.Journal
pub fn with_journal_status(
  j: validator.Journal,
  value: String,
) -> validator.Journal
pub fn with_journal_summary(
  j: validator.Journal,
  value: String,
) -> validator.Journal
pub fn with_journal_x_property(
  j: validator.Journal,
  name: String,
  value: String,
) -> validator.Journal
pub fn with_last_modified(
  event: validator.Event,
  dt: ast.DateTime,
) -> validator.Event
pub fn with_location(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_method(
  cal: validator.Calendar,
  method: String,
) -> validator.Calendar
pub fn with_organizer(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_rrule(
  event: validator.Event,
  rule: ast.RawRRule,
) -> validator.Event
pub fn with_sequence(
  event: validator.Event,
  value: Int,
) -> validator.Event
pub fn with_status(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_summary(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_timezone_rule_name(
  rule: validator.TimezoneRule,
  value: String,
) -> validator.TimezoneRule
pub fn with_timezone_url(
  tz: validator.Timezone,
  value: String,
) -> validator.Timezone
pub fn with_timezone_x_property(
  tz: validator.Timezone,
  name: String,
  value: String,
) -> validator.Timezone
pub fn with_todo_completed(
  t: validator.Todo,
  dt: ast.DateTime,
) -> validator.Todo
pub fn with_todo_description(
  t: validator.Todo,
  value: String,
) -> validator.Todo
pub fn with_todo_percent_complete(
  t: validator.Todo,
  value: Int,
) -> validator.Todo
pub fn with_todo_priority(
  t: validator.Todo,
  value: Int,
) -> validator.Todo
pub fn with_todo_rrule(
  t: validator.Todo,
  rule: ast.RawRRule,
) -> validator.Todo
pub fn with_todo_status(
  t: validator.Todo,
  value: String,
) -> validator.Todo
pub fn with_todo_summary(
  t: validator.Todo,
  value: String,
) -> validator.Todo
pub fn with_todo_x_property(
  t: validator.Todo,
  name: String,
  value: String,
) -> validator.Todo
pub fn with_transparency(
  event: validator.Event,
  value: String,
) -> validator.Event
pub fn with_url(
  event: validator.Event,
  value: String,
) -> validator.Event
Search Document