aboutsummaryrefslogtreecommitdiff
path: root/src/dav/caltypes.rs
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-03-08 08:17:03 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-03-08 08:17:03 +0100
commit1a43ce5ac7033c148f64a033f2b1d335e95e11d5 (patch)
tree60b234604170fe207248458a9c4cdd3f4b7c36f2 /src/dav/caltypes.rs
parentbb9cb386b65834c44cae86bd100f800883022062 (diff)
downloadaerogramme-1a43ce5ac7033c148f64a033f2b1d335e95e11d5.tar.gz
aerogramme-1a43ce5ac7033c148f64a033f2b1d335e95e11d5.zip
WIP refactor
Diffstat (limited to 'src/dav/caltypes.rs')
-rw-r--r--src/dav/caltypes.rs1440
1 files changed, 0 insertions, 1440 deletions
diff --git a/src/dav/caltypes.rs b/src/dav/caltypes.rs
deleted file mode 100644
index befecef..0000000
--- a/src/dav/caltypes.rs
+++ /dev/null
@@ -1,1440 +0,0 @@
-#![allow(dead_code)]
-
-use chrono::{DateTime,Utc};
-use super::types as dav;
-use super::xml;
-
-//@FIXME ACL (rfc3744) is missing, required
-//@FIXME Versioning (rfc3253) is missing, required
-//@FIXME WebDAV sync (rfc6578) is missing, optional
-// For reference, SabreDAV guide gives high-level & real-world overview:
-// https://sabre.io/dav/building-a-caldav-client/
-// For reference, non-official extensions documented by SabreDAV:
-// https://github.com/apple/ccs-calendarserver/tree/master/doc/Extensions
-
-
-// ----- Root elements -----
-
-// --- (MKCALENDAR PART) ---
-
-/// If a request body is included, it MUST be a CALDAV:mkcalendar XML
-/// element. Instruction processing MUST occur in the order
-/// instructions are received (i.e., from top to bottom).
-/// Instructions MUST either all be executed or none executed. Thus,
-/// if any error occurs during processing, all executed instructions
-/// MUST be undone and a proper error result returned. Instruction
-/// processing details can be found in the definition of the DAV:set
-/// instruction in Section 12.13.2 of [RFC2518].
-///
-/// <!ELEMENT mkcalendar (DAV:set)>
-#[derive(Debug, PartialEq)]
-pub struct MkCalendar<E: dav::Extension>(pub dav::Set<E>);
-
-
-/// If a response body for a successful request is included, it MUST
-/// be a CALDAV:mkcalendar-response XML element.
-///
-/// <!ELEMENT mkcalendar-response ANY>
-///
-/// ----
-///
-/// ANY is not satisfying, so looking at RFC5689
-/// https://www.rfc-editor.org/rfc/rfc5689.html#section-5.2
-///
-/// Definition:
-///
-/// <!ELEMENT mkcol-response (propstat+)>
-#[derive(Debug, PartialEq)]
-pub struct MkCalendarResponse<E: dav::Extension, N: xml::Node<N>>(pub Vec<dav::PropStat<E,N>>);
-
-// --- (REPORT PART) ---
-
-/// Name: calendar-query
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Defines a report for querying calendar object resources.
-///
-/// Description: See Section 7.8.
-///
-/// Definition:
-///
-/// <!ELEMENT calendar-query ((DAV:allprop |
-/// DAV:propname |
-/// DAV:prop)?, filter, timezone?)>
-#[derive(Debug, PartialEq)]
-pub struct CalendarQuery<E: dav::Extension> {
- pub selector: Option<CalendarSelector<E>>,
- pub filter: Filter,
- pub timezone: Option<TimeZone>,
-}
-
-/// Name: calendar-multiget
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: CalDAV report used to retrieve specific calendar object
-/// resources.
-///
-/// Description: See Section 7.9.
-///
-/// Definition:
-///
-/// <!ELEMENT calendar-multiget ((DAV:allprop |
-/// DAV:propname |
-/// DAV:prop)?, DAV:href+)>
-#[derive(Debug, PartialEq)]
-pub struct CalendarMultiget<E: dav::Extension> {
- pub selector: Option<CalendarSelector<E>>,
- pub href: Vec<dav::Href>,
-}
-
-/// Name: free-busy-query
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: CalDAV report used to generate a VFREEBUSY to determine
-/// busy time over a specific time range.
-///
-/// Description: See Section 7.10.
-///
-/// Definition:
-/// <!ELEMENT free-busy-query (time-range)>
-#[derive(Debug, PartialEq)]
-pub struct FreeBusyQuery(pub TimeRange);
-
-// ----- Hooks -----
-#[derive(Debug, PartialEq)]
-pub enum ResourceType {
- Calendar,
-}
-
-/// Check the matching Property object for documentation
-#[derive(Debug, PartialEq)]
-pub enum PropertyRequest {
- CalendarDescription,
- CalendarTimezone,
- SupportedCalendarComponentSet,
- SupportedCalendarData,
- MaxResourceSize,
- MinDateTime,
- MaxDateTime,
- MaxInstances,
- MaxAttendeesPerInstance,
- SupportedCollationSet,
- CalendarData(CalendarDataRequest),
-}
-
-#[derive(Debug, PartialEq)]
-pub enum Property {
- /// Name: calendar-description
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a human-readable description of the calendar
- /// collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MAY be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]). An xml:lang attribute indicating the human
- /// language of the description SHOULD be set for this property by
- /// clients or through server provisioning. Servers MUST return any
- /// xml:lang attribute if set for the property.
- ///
- /// Description: If present, the property contains a description of the
- /// calendar collection that is suitable for presentation to a user.
- /// If not present, the client should assume no description for the
- /// calendar collection.
- ///
- /// Definition:
- ///
- /// <!ELEMENT calendar-description (#PCDATA)>
- /// PCDATA value: string
- ///
- /// Example:
- ///
- /// <C:calendar-description xml:lang="fr-CA"
- /// xmlns:C="urn:ietf:params:xml:ns:caldav"
- /// >Calendrier de Mathilde Desruisseaux</C:calendar-description>
- CalendarDescription {
- lang: Option<String>,
- text: String,
- },
-
- /// 5.2.2. CALDAV:calendar-timezone Property
- ///
- /// Name: calendar-timezone
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Specifies a time zone on a calendar collection.
- ///
- /// Conformance: This property SHOULD be defined on all calendar
- /// collections. If defined, it SHOULD NOT be returned by a PROPFIND
- /// DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:calendar-timezone property is used to
- /// specify the time zone the server should rely on to resolve "date"
- /// values and "date with local time" values (i.e., floating time) to
- /// "date with UTC time" values. The server will require this
- /// information to determine if a calendar component scheduled with
- /// "date" values or "date with local time" values overlaps a CALDAV:
- /// time-range specified in a CALDAV:calendar-query REPORT. The
- /// server will also require this information to compute the proper
- /// FREEBUSY time period as "date with UTC time" in the VFREEBUSY
- /// component returned in a response to a CALDAV:free-busy-query
- /// REPORT request that takes into account calendar components
- /// scheduled with "date" values or "date with local time" values. In
- /// the absence of this property, the server MAY rely on the time zone
- /// of their choice.
- ///
- /// Note: The iCalendar data embedded within the CALDAV:calendar-
- /// timezone XML element MUST follow the standard XML character data
- /// encoding rules, including use of &lt;, &gt;, &amp; etc. entity
- /// encoding or the use of a <![CDATA[ ... ]]> construct. In the
- /// later case, the iCalendar data cannot contain the character
- /// sequence "]]>", which is the end delimiter for the CDATA section.
- ///
- /// Definition:
- ///
- /// <!ELEMENT calendar-timezone (#PCDATA)>
- /// PCDATA value: an iCalendar object with exactly one VTIMEZONE component.
- ///
- /// Example:
- ///
- /// <C:calendar-timezone
- /// xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR
- /// PRODID:-//Example Corp.//CalDAV Client//EN
- /// VERSION:2.0
- /// BEGIN:VTIMEZONE
- /// TZID:US-Eastern
- /// LAST-MODIFIED:19870101T000000Z
- /// BEGIN:STANDARD
- /// DTSTART:19671029T020000
- /// RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
- /// TZOFFSETFROM:-0400
- /// TZOFFSETTO:-0500
- /// TZNAME:Eastern Standard Time (US &amp; Canada)
- /// END:STANDARD
- /// BEGIN:DAYLIGHT
- /// DTSTART:19870405T020000
- /// RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
- /// TZOFFSETFROM:-0500
- /// TZOFFSETTO:-0400
- /// TZNAME:Eastern Daylight Time (US &amp; Canada)
- /// END:DAYLIGHT
- /// END:VTIMEZONE
- /// END:VCALENDAR
- /// </C:calendar-timezone>
- //@FIXME we might want to put a buffer here or an iCal parsed object
- CalendarTimezone(String),
-
- /// Name: supported-calendar-component-set
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Specifies the calendar component types (e.g., VEVENT,
- /// VTODO, etc.) that calendar object resources can contain in the
- /// calendar collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:supported-calendar-component-set property is
- /// used to specify restrictions on the calendar component types that
- /// calendar object resources may contain in a calendar collection.
- /// Any attempt by the client to store calendar object resources with
- /// component types not listed in this property, if it exists, MUST
- /// result in an error, with the CALDAV:supported-calendar-component
- /// precondition (Section 5.3.2.1) being violated. Since this
- /// property is protected, it cannot be changed by clients using a
- /// PROPPATCH request. However, clients can initialize the value of
- /// this property when creating a new calendar collection with
- /// MKCALENDAR. The empty-element tag <C:comp name="VTIMEZONE"/> MUST
- /// only be specified if support for calendar object resources that
- /// only contain VTIMEZONE components is provided or desired. Support
- /// for VTIMEZONE components in calendar object resources that contain
- /// VEVENT or VTODO components is always assumed. In the absence of
- /// this property, the server MUST accept all component types, and the
- /// client can assume that all component types are accepted.
- ///
- /// Definition:
- ///
- /// <!ELEMENT supported-calendar-component-set (comp+)>
- ///
- /// Example:
- ///
- /// <C:supported-calendar-component-set
- /// xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// <C:comp name="VEVENT"/>
- /// <C:comp name="VTODO"/>
- /// </C:supported-calendar-component-set>
- SupportedCalendarComponentSet(Vec<CompSupport>),
-
- /// Name: supported-calendar-data
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Specifies what media types are allowed for calendar object
- /// resources in a calendar collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:supported-calendar-data property is used to
- /// specify the media type supported for the calendar object resources
- /// contained in a given calendar collection (e.g., iCalendar version
- /// 2.0). Any attempt by the client to store calendar object
- /// resources with a media type not listed in this property MUST
- /// result in an error, with the CALDAV:supported-calendar-data
- /// precondition (Section 5.3.2.1) being violated. In the absence of
- /// this property, the server MUST only accept data with the media
- /// type "text/calendar" and iCalendar version 2.0, and clients can
- /// assume that the server will only accept this data.
- ///
- /// Definition:
- ///
- /// <!ELEMENT supported-calendar-data (calendar-data+)>
- ///
- /// Example:
- ///
- /// <C:supported-calendar-data
- /// xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// <C:calendar-data content-type="text/calendar" version="2.0"/>
- /// </C:supported-calendar-data>
- ///
- /// -----
- ///
- /// <!ELEMENT calendar-data EMPTY>
- ///
- /// when nested in the CALDAV:supported-calendar-data property
- /// to specify a supported media type for calendar object
- /// resources;
- SupportedCalendarData(Vec<CalendarDataEmpty>),
-
- /// Name: max-resource-size
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a numeric value indicating the maximum size of a
- /// resource in octets that the server is willing to accept when a
- /// calendar object resource is stored in a calendar collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:max-resource-size is used to specify a
- /// numeric value that represents the maximum size in octets that the
- /// server is willing to accept when a calendar object resource is
- /// stored in a calendar collection. Any attempt to store a calendar
- /// object resource exceeding this size MUST result in an error, with
- /// the CALDAV:max-resource-size precondition (Section 5.3.2.1) being
- /// violated. In the absence of this property, the client can assume
- /// that the server will allow storing a resource of any reasonable
- /// size.
- ///
- /// Definition:
- ///
- /// <!ELEMENT max-resource-size (#PCDATA)>
- /// PCDATA value: a numeric value (positive integer)
- ///
- /// Example:
- ///
- /// <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// 102400
- /// </C:max-resource-size>
- MaxResourceSize(u64),
-
- /// CALDAV:min-date-time Property
- ///
- /// Name: min-date-time
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a DATE-TIME value indicating the earliest date and
- /// time (in UTC) that the server is willing to accept for any DATE or
- /// DATE-TIME value in a calendar object resource stored in a calendar
- /// collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:min-date-time is used to specify an
- /// iCalendar DATE-TIME value in UTC that indicates the earliest
- /// inclusive date that the server is willing to accept for any
- /// explicit DATE or DATE-TIME value in a calendar object resource
- /// stored in a calendar collection. Any attempt to store a calendar
- /// object resource using a DATE or DATE-TIME value earlier than this
- /// value MUST result in an error, with the CALDAV:min-date-time
- /// precondition (Section 5.3.2.1) being violated. Note that servers
- /// MUST accept recurring components that specify instances beyond
- /// this limit, provided none of those instances have been overridden.
- /// In that case, the server MAY simply ignore those instances outside
- /// of the acceptable range when processing reports on the calendar
- /// object resource. In the absence of this property, the client can
- /// assume any valid iCalendar date may be used at least up to the
- /// CALDAV:max-date-time value, if that is defined.
- ///
- /// Definition:
- ///
- /// <!ELEMENT min-date-time (#PCDATA)>
- /// PCDATA value: an iCalendar format DATE-TIME value in UTC
- ///
- /// Example:
- ///
- /// <C:min-date-time xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// 19000101T000000Z
- /// </C:min-date-time>
- MinDateTime(DateTime<Utc>),
-
- /// CALDAV:max-date-time Property
- ///
- /// Name: max-date-time
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a DATE-TIME value indicating the latest date and
- /// time (in UTC) that the server is willing to accept for any DATE or
- /// DATE-TIME value in a calendar object resource stored in a calendar
- /// collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:max-date-time is used to specify an
- /// iCalendar DATE-TIME value in UTC that indicates the inclusive
- /// latest date that the server is willing to accept for any date or
- /// time value in a calendar object resource stored in a calendar
- /// collection. Any attempt to store a calendar object resource using
- /// a DATE or DATE-TIME value later than this value MUST result in an
- /// error, with the CALDAV:max-date-time precondition
- /// (Section 5.3.2.1) being violated. Note that servers MUST accept
- /// recurring components that specify instances beyond this limit,
- /// provided none of those instances have been overridden. In that
- /// case, the server MAY simply ignore those instances outside of the
- /// acceptable range when processing reports on the calendar object
- /// resource. In the absence of this property, the client can assume
- /// any valid iCalendar date may be used at least down to the CALDAV:
- /// min-date-time value, if that is defined.
- ///
- /// Definition:
- ///
- /// <!ELEMENT max-date-time (#PCDATA)>
- /// PCDATA value: an iCalendar format DATE-TIME value in UTC
- ///
- /// Example:
- ///
- /// <C:max-date-time xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// 20491231T235959Z
- /// </C:max-date-time>
- MaxDateTime(DateTime<Utc>),
-
- /// CALDAV:max-instances Property
- ///
- /// Name: max-instances
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a numeric value indicating the maximum number of
- /// recurrence instances that a calendar object resource stored in a
- /// calendar collection can generate.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:max-instances is used to specify a numeric
- /// value that indicates the maximum number of recurrence instances
- /// that a calendar object resource stored in a calendar collection
- /// can generate. Any attempt to store a calendar object resource
- /// with a recurrence pattern that generates more instances than this
- /// value MUST result in an error, with the CALDAV:max-instances
- /// precondition (Section 5.3.2.1) being violated. In the absence of
- /// this property, the client can assume that the server has no limits
- /// on the number of recurrence instances it can handle or expand.
- ///
- /// Definition:
- ///
- /// <!ELEMENT max-instances (#PCDATA)>
- /// PCDATA value: a numeric value (integer greater than zero)
- ///
- /// Example:
- ///
- /// <C:max-instances xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// 100
- /// </C:max-instances>
- MaxInstances(u64),
-
- /// CALDAV:max-attendees-per-instance Property
- ///
- /// Name: max-attendees-per-instance
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Provides a numeric value indicating the maximum number of
- /// ATTENDEE properties in any instance of a calendar object resource
- /// stored in a calendar collection.
- ///
- /// Conformance: This property MAY be defined on any calendar
- /// collection. If defined, it MUST be protected and SHOULD NOT be
- /// returned by a PROPFIND DAV:allprop request (as defined in Section
- /// 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:max-attendees-per-instance is used to
- /// specify a numeric value that indicates the maximum number of
- /// iCalendar ATTENDEE properties on any one instance of a calendar
- /// object resource stored in a calendar collection. Any attempt to
- /// store a calendar object resource with more ATTENDEE properties per
- /// instance than this value MUST result in an error, with the CALDAV:
- /// max-attendees-per-instance precondition (Section 5.3.2.1) being
- /// violated. In the absence of this property, the client can assume
- /// that the server can handle any number of ATTENDEE properties in a
- /// calendar component.
- ///
- /// Definition:
- ///
- /// <!ELEMENT max-attendees-per-instance (#PCDATA)>
- /// PCDATA value: a numeric value (integer greater than zero)
- ///
- /// Example:
- ///
- /// <C:max-attendees-per-instance
- /// xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// 25
- /// </C:max-attendees-per-instance>
- MaxAttendeesPerInstance(u64),
-
- /// Name: supported-collation-set
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Identifies the set of collations supported by the server
- /// for text matching operations.
- ///
- /// Conformance: This property MUST be defined on any resource that
- /// supports a report that does text matching. If defined, it MUST be
- /// protected and SHOULD NOT be returned by a PROPFIND DAV:allprop
- /// request (as defined in Section 12.14.1 of [RFC2518]).
- ///
- /// Description: The CALDAV:supported-collation-set property contains
- /// zero or more CALDAV:supported-collation elements, which specify
- /// the collection identifiers of the collations supported by the
- /// server.
- ///
- /// Definition:
- ///
- /// <!ELEMENT supported-collation-set (supported-collation*)>
- /// <!ELEMENT supported-collation (#PCDATA)>
- ///
- /// Example:
- ///
- /// <C:supported-collation-set
- /// xmlns:C="urn:ietf:params:xml:ns:caldav">
- /// <C:supported-collation>i;ascii-casemap</C:supported-collation>
- /// <C:supported-collation>i;octet</C:supported-collation>
- /// </C:supported-collation-set>
- SupportedCollationSet(Vec<SupportedCollation>),
-
- /// Name: calendar-data
- ///
- /// Namespace: urn:ietf:params:xml:ns:caldav
- ///
- /// Purpose: Specified one of the following:
- ///
- /// 1. A supported media type for calendar object resources when
- /// nested in the CALDAV:supported-calendar-data property;
- ///
- /// 2. The parts of a calendar object resource should be returned by
- /// a calendaring report;
- ///
- /// 3. The content of a calendar object resource in a response to a
- /// calendaring report.
- ///
- /// Description: When nested in the CALDAV:supported-calendar-data
- /// property, the CALDAV:calendar-data XML element specifies a media
- /// type supported by the CalDAV server for calendar object resources.
- ///
- /// When used in a calendaring REPORT request, the CALDAV:calendar-
- /// data XML element specifies which parts of calendar object
- /// resources need to be returned in the response. If the CALDAV:
- /// calendar-data XML element doesn't contain any CALDAV:comp element,
- /// calendar object resources will be returned in their entirety.
- ///
- /// Finally, when used in a calendaring REPORT response, the CALDAV:
- /// calendar-data XML element specifies the content of a calendar
- /// object resource. Given that XML parsers normalize the two-
- /// character sequence CRLF (US-ASCII decimal 13 and US-ASCII decimal
- /// 10) to a single LF character (US-ASCII decimal 10), the CR
- /// character (US-ASCII decimal 13) MAY be omitted in calendar object
- /// resources specified in the CALDAV:calendar-data XML element.
- /// Furthermore, calendar object resources specified in the CALDAV:
- /// calendar-data XML element MAY be invalid per their media type
- /// specification if the CALDAV:calendar-data XML element part of the
- /// calendaring REPORT request did not specify required properties
- /// (e.g., UID, DTSTAMP, etc.), or specified a CALDAV:prop XML element
- /// with the "novalue" attribute set to "yes".
- ///
- /// Note: The CALDAV:calendar-data XML element is specified in requests
- /// and responses inside the DAV:prop XML element as if it were a
- /// WebDAV property. However, the CALDAV:calendar-data XML element is
- /// not a WebDAV property and, as such, is not returned in PROPFIND
- /// responses, nor used in PROPPATCH requests.
- ///
- /// Note: The iCalendar data embedded within the CALDAV:calendar-data
- /// XML element MUST follow the standard XML character data encoding
- /// rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
- /// the use of a <![CDATA[ ... ]]> construct. In the later case, the
- /// iCalendar data cannot contain the character sequence "]]>", which
- /// is the end delimiter for the CDATA section.
- CalendarData(CalendarDataPayload),
-}
-
-#[derive(Debug, PartialEq)]
-pub enum Violation {
- /// (DAV:resource-must-be-null): A resource MUST NOT exist at the
- /// Request-URI;
- ResourceMustBeNull,
-
- /// (CALDAV:calendar-collection-location-ok): The Request-URI MUST
- /// identify a location where a calendar collection can be created;
- CalendarCollectionLocationOk,
-
- /// (CALDAV:valid-calendar-data): The time zone specified in CALDAV:
- /// calendar-timezone property MUST be a valid iCalendar object
- /// containing a single valid VTIMEZONE component.
- ValidCalendarData,
-
- ///@FIXME should not be here but in RFC3744
- /// !!! ERRATA 1002 !!!
- /// (DAV:need-privileges): The DAV:bind privilege MUST be granted to
- /// the current user on the parent collection of the Request-URI.
- NeedPrivileges,
-
- /// (CALDAV:initialize-calendar-collection): A new calendar collection
- /// exists at the Request-URI. The DAV:resourcetype of the calendar
- /// collection MUST contain both DAV:collection and CALDAV:calendar
- /// XML elements.
- InitializeCalendarCollection,
-
- /// (CALDAV:supported-calendar-data): The resource submitted in the
- /// PUT request, or targeted by a COPY or MOVE request, MUST be a
- /// supported media type (i.e., iCalendar) for calendar object
- /// resources;
- SupportedCalendarData,
-
- /// (CALDAV:valid-calendar-object-resource): The resource submitted in
- /// the PUT request, or targeted by a COPY or MOVE request, MUST obey
- /// all restrictions specified in Section 4.1 (e.g., calendar object
- /// resources MUST NOT contain more than one type of calendar
- /// component, calendar object resources MUST NOT specify the
- /// iCalendar METHOD property, etc.);
- ValidCalendarObjectResource,
-
- /// (CALDAV:supported-calendar-component): The resource submitted in
- /// the PUT request, or targeted by a COPY or MOVE request, MUST
- /// contain a type of calendar component that is supported in the
- /// targeted calendar collection;
- SupportedCalendarComponent,
-
- /// (CALDAV:no-uid-conflict): The resource submitted in the PUT
- /// request, or targeted by a COPY or MOVE request, MUST NOT specify
- /// an iCalendar UID property value already in use in the targeted
- /// calendar collection or overwrite an existing calendar object
- /// resource with one that has a different UID property value.
- /// Servers SHOULD report the URL of the resource that is already
- /// making use of the same UID property value in the DAV:href element;
- ///
- /// <!ELEMENT no-uid-conflict (DAV:href)>
- NoUidConflict(dav::Href),
-
- /// (CALDAV:max-resource-size): The resource submitted in the PUT
- /// request, or targeted by a COPY or MOVE request, MUST have an octet
- /// size less than or equal to the value of the CALDAV:max-resource-
- /// size property value (Section 5.2.5) on the calendar collection
- /// where the resource will be stored;
- MaxResourceSize,
-
- /// (CALDAV:min-date-time): The resource submitted in the PUT request,
- /// or targeted by a COPY or MOVE request, MUST have all of its
- /// iCalendar DATE or DATE-TIME property values (for each recurring
- /// instance) greater than or equal to the value of the CALDAV:min-
- /// date-time property value (Section 5.2.6) on the calendar
- /// collection where the resource will be stored;
- MinDateTime,
-
- /// (CALDAV:max-date-time): The resource submitted in the PUT request,
- /// or targeted by a COPY or MOVE request, MUST have all of its
- /// iCalendar DATE or DATE-TIME property values (for each recurring
- /// instance) less than the value of the CALDAV:max-date-time property
- /// value (Section 5.2.7) on the calendar collection where the
- /// resource will be stored;
- MaxDateTime,
-
- /// (CALDAV:max-instances): The resource submitted in the PUT request,
- /// or targeted by a COPY or MOVE request, MUST generate a number of
- /// recurring instances less than or equal to the value of the CALDAV:
- /// max-instances property value (Section 5.2.8) on the calendar
- /// collection where the resource will be stored;
- MaxInstances,
-
- /// (CALDAV:max-attendees-per-instance): The resource submitted in the
- /// PUT request, or targeted by a COPY or MOVE request, MUST have a
- /// number of ATTENDEE properties on any one instance less than or
- /// equal to the value of the CALDAV:max-attendees-per-instance
- /// property value (Section 5.2.9) on the calendar collection where
- /// the resource will be stored;
- MaxAttendeesPerInstance,
-
- /// (CALDAV:valid-filter): The CALDAV:filter XML element (see
- /// Section 9.7) specified in the REPORT request MUST be valid. For
- /// instance, a CALDAV:filter cannot nest a <C:comp name="VEVENT">
- /// element in a <C:comp name="VTODO"> element, and a CALDAV:filter
- /// cannot nest a <C:time-range start="..." end="..."> element in a
- /// <C:prop name="SUMMARY"> element.
- ValidFilter,
-
- /// (CALDAV:supported-filter): The CALDAV:comp-filter (see
- /// Section 9.7.1), CALDAV:prop-filter (see Section 9.7.2), and
- /// CALDAV:param-filter (see Section 9.7.3) XML elements used in the
- /// CALDAV:filter XML element (see Section 9.7) in the REPORT request
- /// only make reference to components, properties, and parameters for
- /// which queries are supported by the server, i.e., if the CALDAV:
- /// filter element attempts to reference an unsupported component,
- /// property, or parameter, this precondition is violated. Servers
- /// SHOULD report the CALDAV:comp-filter, CALDAV:prop-filter, or
- /// CALDAV:param-filter for which it does not provide support.
- ///
- /// <!ELEMENT supported-filter (comp-filter*,
- /// prop-filter*,
- /// param-filter*)>
- SupportedFilter {
- comp: Vec<CompFilter>,
- prop: Vec<PropFilter>,
- param: Vec<ParamFilter>,
- },
-
- /// (DAV:number-of-matches-within-limits): The number of matching
- /// calendar object resources must fall within server-specific,
- /// predefined limits. For example, this condition might be triggered
- /// if a search specification would cause the return of an extremely
- /// large number of responses.
- NumberOfMatchesWithinLimits,
-}
-
-// -------- Inner XML elements ---------
-
-/// Some of the reports defined in this section do text matches of
-/// character strings provided by the client and are compared to stored
-/// calendar data. Since iCalendar data is, by default, encoded in the
-/// UTF-8 charset and may include characters outside the US-ASCII charset
-/// range in some property and parameter values, there is a need to
-/// ensure that text matching follows well-defined rules.
-///
-/// To deal with this, this specification makes use of the IANA Collation
-/// Registry defined in [RFC4790] to specify collations that may be used
-/// to carry out the text comparison operations with a well-defined rule.
-///
-/// The comparisons used in CalDAV are all "substring" matches, as per
-/// [RFC4790], Section 4.2. Collations supported by the server MUST
-/// support "substring" match operations.
-///
-/// CalDAV servers are REQUIRED to support the "i;ascii-casemap" and
-/// "i;octet" collations, as described in [RFC4790], and MAY support
-/// other collations.
-///
-/// Servers MUST advertise the set of collations that they support via
-/// the CALDAV:supported-collation-set property defined on any resource
-/// that supports reports that use collations.
-///
-/// Clients MUST only use collations from the list advertised by the
-/// server.
-///
-/// In the absence of a collation explicitly specified by the client, or
-/// if the client specifies the "default" collation identifier (as
-/// defined in [RFC4790], Section 3.1), the server MUST default to using
-/// "i;ascii-casemap" as the collation.
-///
-/// Wildcards (as defined in [RFC4790], Section 3.2) MUST NOT be used in
-/// the collation identifier.
-///
-/// If the client chooses a collation not supported by the server, the
-/// server MUST respond with a CALDAV:supported-collation precondition
-/// error response.
-#[derive(Debug, PartialEq)]
-pub struct SupportedCollation(pub Collation);
-
-/// <!ELEMENT calendar-data (#PCDATA)>
-/// PCDATA value: iCalendar object
-///
-/// when nested in the DAV:prop XML element in a calendaring
-/// REPORT response to specify the content of a returned
-/// calendar object resource.
-#[derive(Debug, PartialEq)]
-pub struct CalendarDataPayload {
- pub mime: Option<CalendarDataSupport>,
- pub payload: String,
-}
-
-/// <!ELEMENT calendar-data (comp?,
-/// (expand | limit-recurrence-set)?,
-/// limit-freebusy-set?)>
-///
-/// when nested in the DAV:prop XML element in a calendaring
-/// REPORT request to specify which parts of calendar object
-/// resources should be returned in the response;
-#[derive(Debug, PartialEq)]
-pub struct CalendarDataRequest {
- pub mime: Option<CalendarDataSupport>,
- pub comp: Option<Comp>,
- pub recurrence: Option<RecurrenceModifier>,
- pub limit_freebusy_set: Option<LimitFreebusySet>,
-}
-
-/// calendar-data specialization for Property
-///
-/// <!ELEMENT calendar-data EMPTY>
-///
-/// when nested in the CALDAV:supported-calendar-data property
-/// to specify a supported media type for calendar object
-/// resources;
-#[derive(Debug, PartialEq)]
-pub struct CalendarDataEmpty(pub Option<CalendarDataSupport>);
-
-/// <!ATTLIST calendar-data content-type CDATA "text/calendar"
-/// version CDATA "2.0">
-/// content-type value: a MIME media type
-/// version value: a version string
-/// attributes can be used on all three variants of the
-/// CALDAV:calendar-data XML element.
-#[derive(Debug, PartialEq)]
-pub struct CalendarDataSupport {
- pub content_type: String,
- pub version: String,
-}
-
-/// Name: comp
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Defines which component types to return.
-///
-/// Description: The name value is a calendar component name (e.g.,
-/// VEVENT).
-///
-/// Definition:
-///
-/// <!ELEMENT comp ((allprop | prop*), (allcomp | comp*))>
-/// <!ATTLIST comp name CDATA #REQUIRED>
-/// name value: a calendar component name
-///
-/// Note: The CALDAV:prop and CALDAV:allprop elements have the same name
-/// as the DAV:prop and DAV:allprop elements defined in [RFC2518].
-/// However, the CALDAV:prop and CALDAV:allprop elements are defined
-/// in the "urn:ietf:params:xml:ns:caldav" namespace instead of the
-/// "DAV:" namespace.
-#[derive(Debug, PartialEq)]
-pub struct Comp {
- pub name: Component,
- pub additional_rules: Option<CompInner>,
-}
-
-#[derive(Debug, PartialEq)]
-pub struct CompInner {
- pub prop_kind: PropKind,
- pub comp_kind: CompKind,
-}
-
-/// For SupportedCalendarComponentSet
-///
-/// Definition:
-///
-/// <!ELEMENT supported-calendar-component-set (comp+)>
-///
-/// Example:
-///
-/// <C:supported-calendar-component-set
-/// xmlns:C="urn:ietf:params:xml:ns:caldav">
-/// <C:comp name="VEVENT"/>
-/// <C:comp name="VTODO"/>
-/// </C:supported-calendar-component-set>
-#[derive(Debug, PartialEq)]
-pub struct CompSupport(pub Component);
-
-/// Name: allcomp
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies that all components shall be returned.
-///
-/// Description: The CALDAV:allcomp XML element can be used when the
-/// client wants all types of components returned by a calendaring
-/// REPORT request.
-///
-/// Definition:
-///
-/// <!ELEMENT allcomp EMPTY>
-#[derive(Debug, PartialEq)]
-pub enum CompKind {
- AllComp,
- Comp(Vec<Comp>),
-}
-
-/// Name: allprop
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies that all properties shall be returned.
-///
-/// Description: The CALDAV:allprop XML element can be used when the
-/// client wants all properties of components returned by a
-/// calendaring REPORT request.
-///
-/// Definition:
-///
-/// <!ELEMENT allprop EMPTY>
-///
-/// Note: The CALDAV:allprop element has the same name as the DAV:
-/// allprop element defined in [RFC2518]. However, the CALDAV:allprop
-/// element is defined in the "urn:ietf:params:xml:ns:caldav"
-/// namespace instead of the "DAV:" namespace.
-#[derive(Debug, PartialEq)]
-pub enum PropKind {
- AllProp,
- Prop(Vec<CalProp>),
-}
-
-/// Name: prop
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Defines which properties to return in the response.
-///
-/// Description: The "name" attribute specifies the name of the calendar
-/// property to return (e.g., ATTENDEE). The "novalue" attribute can
-/// be used by clients to request that the actual value of the
-/// property not be returned (if the "novalue" attribute is set to
-/// "yes"). In that case, the server will return just the iCalendar
-/// property name and any iCalendar parameters and a trailing ":"
-/// without the subsequent value data.
-///
-/// Definition:
-/// <!ELEMENT prop EMPTY>
-/// <!ATTLIST prop name CDATA #REQUIRED novalue (yes | no) "no">
-/// name value: a calendar property name
-/// novalue value: "yes" or "no"
-///
-/// Note: The CALDAV:prop element has the same name as the DAV:prop
-/// element defined in [RFC2518]. However, the CALDAV:prop element is
-/// defined in the "urn:ietf:params:xml:ns:caldav" namespace instead
-/// of the "DAV:" namespace.
-#[derive(Debug, PartialEq)]
-pub struct CalProp {
- pub name: ComponentProperty,
- pub novalue: Option<bool>,
-}
-
-#[derive(Debug, PartialEq)]
-pub enum RecurrenceModifier {
- Expand(Expand),
- LimitRecurrenceSet(LimitRecurrenceSet),
-}
-
-/// Name: expand
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Forces the server to expand recurring components into
-/// individual recurrence instances.
-///
-/// Description: The CALDAV:expand XML element specifies that for a
-/// given calendaring REPORT request, the server MUST expand the
-/// recurrence set into calendar components that define exactly one
-/// recurrence instance, and MUST return only those whose scheduled
-/// time intersect a specified time range.
-///
-/// The "start" attribute specifies the inclusive start of the time
-/// range, and the "end" attribute specifies the non-inclusive end of
-/// the time range. Both attributes are specified as date with UTC
-/// time value. The value of the "end" attribute MUST be greater than
-/// the value of the "start" attribute.
-///
-/// The server MUST use the same logic as defined for CALDAV:time-
-/// range to determine if a recurrence instance intersects the
-/// specified time range.
-///
-/// Recurring components, other than the initial instance, MUST
-/// include a RECURRENCE-ID property indicating which instance they
-/// refer to.
-///
-/// The returned calendar components MUST NOT use recurrence
-/// properties (i.e., EXDATE, EXRULE, RDATE, and RRULE) and MUST NOT
-/// have reference to or include VTIMEZONE components. Date and local
-/// time with reference to time zone information MUST be converted
-/// into date with UTC time.
-///
-/// Definition:
-///
-/// <!ELEMENT expand EMPTY>
-/// <!ATTLIST expand start CDATA #REQUIRED
-/// end CDATA #REQUIRED>
-/// start value: an iCalendar "date with UTC time"
-/// end value: an iCalendar "date with UTC time"
-#[derive(Debug, PartialEq)]
-pub struct Expand(pub DateTime<Utc>, pub DateTime<Utc>);
-
-/// CALDAV:limit-recurrence-set XML Element
-///
-/// Name: limit-recurrence-set
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies a time range to limit the set of "overridden
-/// components" returned by the server.
-///
-/// Description: The CALDAV:limit-recurrence-set XML element specifies
-/// that for a given calendaring REPORT request, the server MUST
-/// return, in addition to the "master component", only the
-/// "overridden components" that impact a specified time range. An
-/// overridden component impacts a time range if its current start and
-/// end times overlap the time range, or if the original start and end
-/// times -- the ones that would have been used if the instance were
-/// not overridden -- overlap the time range.
-///
-/// The "start" attribute specifies the inclusive start of the time
-/// range, and the "end" attribute specifies the non-inclusive end of
-/// the time range. Both attributes are specified as date with UTC
-/// time value. The value of the "end" attribute MUST be greater than
-/// the value of the "start" attribute.
-///
-/// The server MUST use the same logic as defined for CALDAV:time-
-/// range to determine if the current or original scheduled time of an
-/// "overridden" recurrence instance intersects the specified time
-/// range.
-///
-/// Overridden components that have a RANGE parameter on their
-/// RECURRENCE-ID property may specify one or more instances in the
-/// recurrence set, and some of those instances may fall within the
-/// specified time range or may have originally fallen within the
-/// specified time range prior to being overridden. If that is the
-/// case, the overridden component MUST be included in the results, as
-/// it has a direct impact on the interpretation of instances within
-/// the specified time range.
-///
-/// Definition:
-///
-/// <!ELEMENT limit-recurrence-set EMPTY>
-/// <!ATTLIST limit-recurrence-set start CDATA #REQUIRED
-/// end CDATA #REQUIRED>
-/// start value: an iCalendar "date with UTC time"
-/// end value: an iCalendar "date with UTC time"
-#[derive(Debug, PartialEq)]
-pub struct LimitRecurrenceSet(pub DateTime<Utc>, pub DateTime<Utc>);
-
-/// Name: limit-freebusy-set
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies a time range to limit the set of FREEBUSY values
-/// returned by the server.
-///
-/// Description: The CALDAV:limit-freebusy-set XML element specifies
-/// that for a given calendaring REPORT request, the server MUST only
-/// return the FREEBUSY property values of a VFREEBUSY component that
-/// intersects a specified time range.
-///
-/// The "start" attribute specifies the inclusive start of the time
-/// range, and the "end" attribute specifies the non-inclusive end of
-/// the time range. Both attributes are specified as "date with UTC
-/// time" value. The value of the "end" attribute MUST be greater
-/// than the value of the "start" attribute.
-///
-/// The server MUST use the same logic as defined for CALDAV:time-
-/// range to determine if a FREEBUSY property value intersects the
-/// specified time range.
-///
-/// Definition:
-/// <!ELEMENT limit-freebusy-set EMPTY>
-/// <!ATTLIST limit-freebusy-set start CDATA #REQUIRED
-/// end CDATA #REQUIRED>
-/// start value: an iCalendar "date with UTC time"
-/// end value: an iCalendar "date with UTC time"
-#[derive(Debug, PartialEq)]
-pub struct LimitFreebusySet(pub DateTime<Utc>, pub DateTime<Utc>);
-
-/// Used by CalendarQuery & CalendarMultiget
-#[derive(Debug, PartialEq)]
-pub enum CalendarSelector<E: dav::Extension> {
- AllProp,
- PropName,
- Prop(dav::PropName<E>),
-}
-
-/// Name: comp-filter
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies search criteria on calendar components.
-///
-/// Description: The CALDAV:comp-filter XML element specifies a query
-/// targeted at the calendar object (i.e., VCALENDAR) or at a specific
-/// calendar component type (e.g., VEVENT). The scope of the
-/// CALDAV:comp-filter XML element is the calendar object when used as
-/// a child of the CALDAV:filter XML element. The scope of the
-/// CALDAV:comp-filter XML element is the enclosing calendar component
-/// when used as a child of another CALDAV:comp-filter XML element. A
-/// CALDAV:comp-filter is said to match if:
-///
-/// * The CALDAV:comp-filter XML element is empty and the calendar
-/// object or calendar component type specified by the "name"
-/// attribute exists in the current scope;
-///
-/// or:
-///
-/// * The CALDAV:comp-filter XML element contains a CALDAV:is-not-
-/// defined XML element and the calendar object or calendar
-/// component type specified by the "name" attribute does not exist
-/// in the current scope;
-///
-/// or:
-///
-/// * The CALDAV:comp-filter XML element contains a CALDAV:time-range
-/// XML element and at least one recurrence instance in the
-/// targeted calendar component is scheduled to overlap the
-/// specified time range, and all specified CALDAV:prop-filter and
-/// CALDAV:comp-filter child XML elements also match the targeted
-/// calendar component;
-///
-/// or:
-///
-/// * The CALDAV:comp-filter XML element only contains CALDAV:prop-
-/// filter and CALDAV:comp-filter child XML elements that all match
-/// the targeted calendar component.
-///
-/// Definition:
-/// <!ELEMENT comp-filter (is-not-defined | (time-range?,
-/// prop-filter*, comp-filter*))>
-///
-/// <!ATTLIST comp-filter name CDATA #REQUIRED>
-/// name value: a calendar object or calendar component
-/// type (e.g., VEVENT)
-#[derive(Debug, PartialEq)]
-pub struct CompFilter {
- pub name: Component,
- // Option 1 = None, Option 2, 3, 4 = Some
- pub additional_rules: Option<CompFilterRules>,
-}
-#[derive(Debug, PartialEq)]
-pub enum CompFilterRules {
- // Option 2
- IsNotDefined,
- // Options 3 & 4
- Matches(CompFilterMatch),
-}
-#[derive(Debug, PartialEq)]
-pub struct CompFilterMatch {
- pub time_range: Option<TimeRange>,
- pub prop_filter: Vec<PropFilter>,
- pub comp_filter: Vec<CompFilter>,
-}
-
-/// Name: prop-filter
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies search criteria on calendar properties.
-///
-/// Description: The CALDAV:prop-filter XML element specifies a query
-/// targeted at a specific calendar property (e.g., CATEGORIES) in the
-/// scope of the enclosing calendar component. A calendar property is
-/// said to match a CALDAV:prop-filter if:
-///
-/// * The CALDAV:prop-filter XML element is empty and a property of
-/// the type specified by the "name" attribute exists in the
-/// enclosing calendar component;
-///
-/// or:
-///
-/// * The CALDAV:prop-filter XML element contains a CALDAV:is-not-
-/// defined XML element and no property of the type specified by
-/// the "name" attribute exists in the enclosing calendar
-/// component;
-///
-/// or:
-///
-/// * The CALDAV:prop-filter XML element contains a CALDAV:time-range
-/// XML element and the property value overlaps the specified time
-/// range, and all specified CALDAV:param-filter child XML elements
-/// also match the targeted property;
-///
-/// or:
-///
-/// * The CALDAV:prop-filter XML element contains a CALDAV:text-match
-/// XML element and the property value matches it, and all
-/// specified CALDAV:param-filter child XML elements also match the
-/// targeted property;
-///
-/// Definition:
-///
-/// <!ELEMENT prop-filter (is-not-defined |
-/// ((time-range | text-match)?,
-/// param-filter*))>
-///
-/// <!ATTLIST prop-filter name CDATA #REQUIRED>
-/// name value: a calendar property name (e.g., ATTENDEE)
-#[derive(Debug, PartialEq)]
-pub struct PropFilter {
- pub name: Component,
- // None = Option 1, Some() = Option 2, 3 & 4
- pub additional_rules: Option<PropFilterRules>,
-}
-#[derive(Debug, PartialEq)]
-pub enum PropFilterRules {
- // Option 2
- IsNotDefined,
- // Options 3 & 4
- Match(PropFilterMatch),
-}
-#[derive(Debug, PartialEq)]
-pub struct PropFilterMatch {
- pub time_range: Option<TimeRange>,
- pub time_or_text: Option<TimeOrText>,
- pub param_filter: Vec<ParamFilter>,
-}
-#[derive(Debug, PartialEq)]
-pub enum TimeOrText {
- Time(TimeRange),
- Text(TextMatch),
-}
-
-/// Name: text-match
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies a substring match on a property or parameter
-/// value.
-///
-/// Description: The CALDAV:text-match XML element specifies text used
-/// for a substring match against the property or parameter value
-/// specified in a calendaring REPORT request.
-///
-/// The "collation" attribute is used to select the collation that the
-/// server MUST use for character string matching. In the absence of
-/// this attribute, the server MUST use the "i;ascii-casemap"
-/// collation.
-///
-/// The "negate-condition" attribute is used to indicate that this
-/// test returns a match if the text matches when the attribute value
-/// is set to "no", or return a match if the text does not match, if
-/// the attribute value is set to "yes". For example, this can be
-/// used to match components with a STATUS property not set to
-/// CANCELLED.
-///
-/// Definition:
-/// <!ELEMENT text-match (#PCDATA)>
-/// PCDATA value: string
-/// <!ATTLIST text-match collation CDATA "i;ascii-casemap"
-/// negate-condition (yes | no) "no">
-#[derive(Debug, PartialEq)]
-pub struct TextMatch {
- pub collation: Option<Collation>,
- pub negate_condition: Option<bool>,
- pub text: String,
-}
-
-/// Name: param-filter
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Limits the search to specific parameter values.
-///
-/// Description: The CALDAV:param-filter XML element specifies a query
-/// targeted at a specific calendar property parameter (e.g.,
-/// PARTSTAT) in the scope of the calendar property on which it is
-/// defined. A calendar property parameter is said to match a CALDAV:
-/// param-filter if:
-///
-/// * The CALDAV:param-filter XML element is empty and a parameter of
-/// the type specified by the "name" attribute exists on the
-/// calendar property being examined;
-///
-/// or:
-///
-/// * The CALDAV:param-filter XML element contains a CALDAV:is-not-
-/// defined XML element and no parameter of the type specified by
-/// the "name" attribute exists on the calendar property being
-/// examined;
-///
-/// Definition:
-///
-/// <!ELEMENT param-filter (is-not-defined | text-match?)>
-///
-/// <!ATTLIST param-filter name CDATA #REQUIRED>
-/// name value: a property parameter name (e.g., PARTSTAT)
-#[derive(Debug, PartialEq)]
-pub struct ParamFilter {
- pub name: PropertyParameter,
- pub additional_rules: Option<ParamFilterMatch>,
-}
-#[derive(Debug, PartialEq)]
-pub enum ParamFilterMatch {
- IsNotDefined,
- Match(TextMatch),
-}
-
-/// CALDAV:is-not-defined XML Element
-///
-/// Name: is-not-defined
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies that a match should occur if the enclosing
-/// component, property, or parameter does not exist.
-///
-/// Description: The CALDAV:is-not-defined XML element specifies that a
-/// match occurs if the enclosing component, property, or parameter
-/// value specified in a calendaring REPORT request does not exist in
-/// the calendar data being tested.
-///
-/// Definition:
-/// <!ELEMENT is-not-defined EMPTY>
-/* CURRENTLY INLINED */
-
-
-
-/// Name: timezone
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies the time zone component to use when determining
-/// the results of a report.
-///
-/// Description: The CALDAV:timezone XML element specifies that for a
-/// given calendaring REPORT request, the server MUST rely on the
-/// specified VTIMEZONE component instead of the CALDAV:calendar-
-/// timezone property of the calendar collection, in which the
-/// calendar object resource is contained to resolve "date" values and
-/// "date with local time" values (i.e., floating time) to "date with
-/// UTC time" values. The server will require this information to
-/// determine if a calendar component scheduled with "date" values or
-/// "date with local time" values intersects a CALDAV:time-range
-/// specified in a CALDAV:calendar-query REPORT.
-///
-/// Note: The iCalendar data embedded within the CALDAV:timezone XML
-/// element MUST follow the standard XML character data encoding
-/// rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
-/// the use of a <![CDATA[ ... ]]> construct. In the later case, the
-///
-/// iCalendar data cannot contain the character sequence "]]>", which
-/// is the end delimiter for the CDATA section.
-///
-/// Definition:
-///
-/// <!ELEMENT timezone (#PCDATA)>
-/// PCDATA value: an iCalendar object with exactly one VTIMEZONE
-#[derive(Debug, PartialEq)]
-pub struct TimeZone(pub String);
-
-/// Name: filter
-///
-/// Namespace: urn:ietf:params:xml:ns:caldav
-///
-/// Purpose: Specifies a filter to limit the set of calendar components
-/// returned by the server.
-///
-/// Description: The CALDAV:filter XML element specifies the search
-/// filter used to limit the calendar components returned by a
-/// calendaring REPORT request.
-///
-/// Definition:
-/// <!ELEMENT filter (comp-filter)>
-#[derive(Debug, PartialEq)]
-pub struct Filter(pub CompFilter);
-
-/// Name: time-range
-///
-/// Definition:
-///
-/// <!ELEMENT time-range EMPTY>
-/// <!ATTLIST time-range start CDATA #IMPLIED
-/// end CDATA #IMPLIED>
-/// start value: an iCalendar "date with UTC time"
-/// end value: an iCalendar "date with UTC time"
-#[derive(Debug, PartialEq)]
-pub enum TimeRange {
- OnlyStart(DateTime<Utc>),
- OnlyEnd(DateTime<Utc>),
- FullRange(DateTime<Utc>, DateTime<Utc>),
-}
-
-// ----------------------- ENUM ATTRIBUTES ---------------------
-
-/// Known components
-#[derive(Debug, PartialEq)]
-pub enum Component {
- VCalendar,
- VJournal,
- VFreeBusy,
- VEvent,
- VTodo,
- VAlarm,
- VTimeZone,
- Unknown(String),
-}
-impl Component {
- pub fn as_str<'a>(&'a self) -> &'a str {
- match self {
- Self::VCalendar => "VCALENDAR",
- Self::VJournal => "VJOURNAL",
- Self::VFreeBusy => "VFREEBUSY",
- Self::VEvent => "VEVENT",
- Self::VTodo => "VTODO",
- Self::VAlarm => "VALARM",
- Self::VTimeZone => "VTIMEZONE",
- Self::Unknown(c) => c,
- }
- }
-}
-
-/// name="VERSION", name="SUMMARY", etc.
-/// Can be set on different objects: VCalendar, VEvent, etc.
-/// Might be replaced by an enum later
-#[derive(Debug, PartialEq)]
-pub struct ComponentProperty(pub String);
-
-/// like PARSTAT
-#[derive(Debug, PartialEq)]
-pub struct PropertyParameter(pub String);
-impl PropertyParameter {
- pub fn as_str<'a>(&'a self) -> &'a str {
- self.0.as_str()
- }
-}
-
-#[derive(Default,Debug,PartialEq)]
-pub enum Collation {
- #[default]
- AsciiCaseMap,
- Octet,
- Unknown(String),
-}
-impl Collation {
- pub fn as_str<'a>(&'a self) -> &'a str {
- match self {
- Self::AsciiCaseMap => "i;ascii-casemap",
- Self::Octet => "i;octet",
- Self::Unknown(c) => c.as_str(),
- }
- }
-}