iCalendar parser, validator, editor, merger and builder library for Rust
- Both iCalendar flavours: read and write vCalendar 1.0 and iCalendar 2.0 through one version-agnostic model.
- Nested structure, preserved: events, to-dos, journals, free/busy blocks, time zones and alarms, parsed and round-tripped whole.
- Byte-faithful editing: change one field and every other byte comes back unchanged, line endings and fold points included.
- Forgiving parser: accept any real calendar, with a recovering mode for the ones a strict reading would throw away whole.
- Strict building and validation: construct calendars checked against the standard, with an escape hatch to step outside it.
- Recurrence and time zones: expand a rule or a whole recurrence set, and resolve an offset from the calendar's own rules.
- Three-way merge: reconcile two divergent edits against their common base, every action and conflict reported.
- Small and portable: no_std compatible, with an allocation-only core that pulls in no dependencies; the parser itself is optional.
- Optional content decoding: quoted-printable text, inline base64 binary and foreign character sets, each behind its own feature.
- Optional jCal: read and write a calendar as JSON.
- Optional JSCalendar: convert a calendar to and from the object model exchanged over JMAP.
Tip
ical-rs uses cargo features to gate optional support. The default feature set is declared in Cargo.toml or on docs.rs.
| Spec | What is covered |
|---|---|
| 1.0 | vCalendar 1.0: the original versit format, including its quoted-printable and charset conventions |
| 5545 | iCalendar 2.0: the current standard, with its full component tree, property set, value types and parameters, its recurrence rules and its time zones |
| 5546 | iTIP: whose the properties of a scheduled component are, which the merge enforces |
| 6638 | CalDAV scheduling: the parameters a server reads and writes on an attendee |
| 7265 | jCal: the JSON representation of a calendar |
| 7529 | Non-Gregorian recurrence: SKIP is expanded for the Gregorian scale; another scale is carried, not expanded |
| 7953 | Availability: the availability window and the periods inside it |
| 7986 | Calendar extensions: the newer calendar-level properties |
| 8984 | JSCalendar: the JSON data model a JMAP calendar server exchanges, converted both ways |
| 9073 | Event publishing extensions: participants, locations, resources and structured data |
| 9074 | Alarm extensions: acknowledgement, proximity and the alarm relations |
| 9253 | Relationships: typed links, reference identifiers and concepts |
See documentation at docs.rs.
See complete examples at ./examples.
This project is licensed under either of:
- Chat on Matrix
- News on Mastodon or RSS
- Mail at pimalaya.org@posteo.net
Special thanks to the NLnet foundation and the European Commission that have been financially supporting the project for years:
- 2022 β 2023: NGI Assure
- 2023 β 2024: NGI Zero Entrust
- 2024 β 2026: NGI Zero Core
- 2026 β 2027: NGI Zero Commons Fund
This program is part of Pimalaya, free software funded entirely by grants and donations. If you find it useful, consider sponsoring its development:
