rustical_dav_push/
extension.rs

1use crate::{ContentUpdate, PropertyUpdate, SupportedTriggers, Transports, Trigger};
2use rustical_dav::header::Depth;
3use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
4
5#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants, Debug)]
6#[xml(unit_variants_ident = "DavPushExtensionPropName")]
7pub enum DavPushExtensionProp {
8    // WebDav Push
9    #[xml(skip_deserializing)]
10    #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")]
11    Transports(Transports),
12    #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")]
13    Topic(String),
14    #[xml(skip_deserializing)]
15    #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")]
16    SupportedTriggers(SupportedTriggers),
17}
18
19pub trait DavPushExtension {
20    fn get_topic(&self) -> String;
21
22    fn supported_triggers(&self) -> SupportedTriggers {
23        SupportedTriggers(vec![
24            Trigger::ContentUpdate(ContentUpdate(Depth::One)),
25            Trigger::PropertyUpdate(PropertyUpdate(Depth::One)),
26        ])
27    }
28
29    fn get_prop(
30        &self,
31        prop: &DavPushExtensionPropName,
32    ) -> Result<DavPushExtensionProp, rustical_dav::Error> {
33        Ok(match &prop {
34            DavPushExtensionPropName::Transports => {
35                DavPushExtensionProp::Transports(Transports::default())
36            }
37            DavPushExtensionPropName::Topic => DavPushExtensionProp::Topic(self.get_topic()),
38            DavPushExtensionPropName::SupportedTriggers => {
39                DavPushExtensionProp::SupportedTriggers(self.supported_triggers())
40            }
41        })
42    }
43
44    fn set_prop(&self, _prop: DavPushExtensionProp) -> Result<(), rustical_dav::Error> {
45        Err(rustical_dav::Error::PropReadOnly)
46    }
47
48    fn remove_prop(&self, _prop: &DavPushExtensionPropName) -> Result<(), rustical_dav::Error> {
49        Err(rustical_dav::Error::PropReadOnly)
50    }
51}