aboutsummaryrefslogtreecommitdiff
path: root/src/dav
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-03-02 23:01:56 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-03-02 23:01:56 +0100
commit17142bd687ac2af7c325c7c3617937c56a4ca58d (patch)
treeff686d58294e39e70d6815fb937a9de35080e9bf /src/dav
parent61ee5f153b01c8a0927f0e4547c8c655ede912ed (diff)
downloadaerogramme-17142bd687ac2af7c325c7c3617937c56a4ca58d.tar.gz
aerogramme-17142bd687ac2af7c325c7c3617937c56a4ca58d.zip
WIP encoding
Diffstat (limited to 'src/dav')
-rw-r--r--src/dav/calencoder.rs55
-rw-r--r--src/dav/caltypes.rs29
-rw-r--r--src/dav/encoder.rs8
3 files changed, 71 insertions, 21 deletions
diff --git a/src/dav/calencoder.rs b/src/dav/calencoder.rs
index 73db4fa..a701fe1 100644
--- a/src/dav/calencoder.rs
+++ b/src/dav/calencoder.rs
@@ -278,8 +278,6 @@ impl<C: CalContext> QuickWritable<C> for Violation {
Self::SupportedCalendarData => atom("supported-calendar-data").await,
Self::ValidCalendarObjectResource => atom("valid-calendar-object-resource").await,
Self::SupportedCalendarComponent => atom("supported-calendar-component").await,
- Self::ValidCalendarObjectResource => atom("valid-calendar-object-resource").await,
- Self::SupportedCalendarComponent => atom("SupportedCalendarComponent").await,
Self::NoUidConflict(href) => {
let start = ctx.create_cal_element("no-uid-conflict");
let end = start.to_end();
@@ -391,43 +389,82 @@ impl<C: CalContext> QuickWritable<C> for CalendarDataEmpty {
impl<C: CalContext> QuickWritable<C> for Comp {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ let mut start = ctx.create_cal_element("calendar-data");
+ start.push_attribute(("name", self.name.as_str()));
+ let end = start.to_end();
+ xml.write_event_async(Event::Start(start.clone())).await?;
+ self.prop_kind.write(xml, ctx.child()).await?;
+ self.comp_kind.write(xml, ctx.child()).await?;
+ xml.write_event_async(Event::End(end)).await
}
}
impl<C: CalContext> QuickWritable<C> for CompSupport {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ let mut empty = ctx.create_cal_element("comp");
+ empty.push_attribute(("name", self.0.as_str()));
+ xml.write_event_async(Event::Empty(empty)).await
}
}
impl<C: CalContext> QuickWritable<C> for CompKind {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ match self {
+ Self::AllComp => xml.write_event_async(Event::Empty(ctx.create_cal_element("allcomp"))).await,
+ Self::Comp(many_comp) => {
+ for comp in many_comp.iter() {
+ // Required: recursion in an async fn requires boxing
+ // rustc --explain E0733
+ Box::pin(comp.write(xml, ctx.child())).await?;
+ }
+ Ok(())
+ }
+ }
}
}
impl<C: CalContext> QuickWritable<C> for PropKind {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ match self {
+ Self::AllProp => xml.write_event_async(Event::Empty(ctx.create_cal_element("allprop"))).await,
+ Self::Prop(many_prop) => {
+ for prop in many_prop.iter() {
+ prop.write(xml, ctx.child()).await?;
+ }
+ Ok(())
+ }
+ }
}
}
impl<C: CalContext> QuickWritable<C> for CalProp {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ let mut empty = ctx.create_cal_element("prop");
+ empty.push_attribute(("name", self.name.0.as_str()));
+ match self.novalue {
+ None => (),
+ Some(true) => empty.push_attribute(("novalue", "yes")),
+ Some(false) => empty.push_attribute(("novalue", "no")),
+ }
+ xml.write_event_async(Event::Empty(empty)).await
}
}
impl<C: CalContext> QuickWritable<C> for RecurrenceModifier {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ match self {
+ Self::Expand(exp) => exp.write(xml, ctx).await,
+ Self::LimitRecurrenceSet(lrs) => lrs.write(xml, ctx).await,
+ }
}
}
impl<C: CalContext> QuickWritable<C> for Expand {
async fn write(&self, xml: &mut Writer<impl AsyncWrite+Unpin>, ctx: C) -> Result<(), QError> {
- unimplemented!();
+ let mut empty = ctx.create_cal_element("expand");
+ empty.push_attribute(("start", format!("{}", self.0.format(ICAL_DATETIME_FMT)).as_str()));
+ empty.push_attribute(("end", format!("{}", self.1.format(ICAL_DATETIME_FMT)).as_str()));
+ xml.write_event_async(Event::Empty(empty)).await
}
}
diff --git a/src/dav/caltypes.rs b/src/dav/caltypes.rs
index 97d75c5..5668201 100644
--- a/src/dav/caltypes.rs
+++ b/src/dav/caltypes.rs
@@ -846,9 +846,9 @@ pub struct CalendarDataSupport {
/// in the "urn:ietf:params:xml:ns:caldav" namespace instead of the
/// "DAV:" namespace.
pub struct Comp {
- name: Component,
- prop_kind: PropKind,
- comp_kind: CompKind,
+ pub name: Component,
+ pub prop_kind: PropKind,
+ pub comp_kind: CompKind,
}
/// For SupportedCalendarComponentSet
@@ -864,7 +864,7 @@ pub struct Comp {
/// <C:comp name="VEVENT"/>
/// <C:comp name="VTODO"/>
/// </C:supported-calendar-component-set>
-pub struct CompSupport(Component);
+pub struct CompSupport(pub Component);
/// Name: allcomp
///
@@ -932,8 +932,8 @@ pub enum PropKind {
/// defined in the "urn:ietf:params:xml:ns:caldav" namespace instead
/// of the "DAV:" namespace.
pub struct CalProp {
- name: ComponentProperty,
- novalue: bool,
+ pub name: ComponentProperty,
+ pub novalue: Option<bool>,
}
pub enum RecurrenceModifier {
@@ -981,7 +981,7 @@ pub enum RecurrenceModifier {
/// end CDATA #REQUIRED>
/// start value: an iCalendar "date with UTC time"
/// end value: an iCalendar "date with UTC time"
-pub struct Expand(DateTime<Utc>, DateTime<Utc>);
+pub struct Expand(pub DateTime<Utc>, pub DateTime<Utc>);
/// CALDAV:limit-recurrence-set XML Element
///
@@ -1348,11 +1348,24 @@ pub enum Component {
VAlarm,
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::Unknown(c) => c,
+ }
+ }
+}
/// name="VERSION", name="SUMMARY", etc.
/// Can be set on different objects: VCalendar, VEvent, etc.
/// Might be replaced by an enum later
-pub struct ComponentProperty(String);
+pub struct ComponentProperty(pub String);
/// like PARSTAT
pub struct PropertyParameter(String);
diff --git a/src/dav/encoder.rs b/src/dav/encoder.rs
index f842734..7778d61 100644
--- a/src/dav/encoder.rs
+++ b/src/dav/encoder.rs
@@ -37,16 +37,16 @@ impl Context for NoExtension {
}
start
}
- async fn hook_error(&self, err: &Disabled, xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
+ async fn hook_error(&self, _err: &Disabled, _xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
unreachable!();
}
- async fn hook_property(&self, prop: &Disabled, xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
+ async fn hook_property(&self, _prop: &Disabled, _xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
unreachable!();
}
- async fn hook_propertyrequest(&self, prop: &Disabled, xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
+ async fn hook_propertyrequest(&self, _prop: &Disabled, _xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
unreachable!();
}
- async fn hook_resourcetype(&self, restype: &Disabled, xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
+ async fn hook_resourcetype(&self, _restype: &Disabled, _xml: &mut Writer<impl AsyncWrite+Unpin>) -> Result<(), QError> {
unreachable!();
}
}