rustical_dav_push/
extension.rs1use 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 #[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}