use crate::Trigger; use rustical_xml::{XmlDeserialize, XmlRootTag, XmlSerialize}; #[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)] #[xml(ns = "crate::namespace::NS_DAVPUSH")] pub struct WebPushSubscription { #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub push_resource: String, #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] // DAVx5 4.4.9 does not seem to use it yet pub content_encoding: Option, #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub subscription_public_key: SubscriptionPublicKey, #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub auth_secret: String, } #[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)] pub struct SubscriptionPublicKey { #[xml(ty = "attr", rename = "type")] pub ty: String, #[xml(ty = "text")] pub key: String, } #[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)] pub struct SubscriptionElement { #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub web_push_subscription: WebPushSubscription, } #[derive(XmlDeserialize, XmlSerialize, Clone, Debug, PartialEq, Eq)] pub struct TriggerElement(#[xml(ty = "untagged", flatten)] Vec); #[derive(XmlDeserialize, XmlRootTag, Clone, Debug, PartialEq, Eq)] #[xml(root = "push-register")] #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub struct PushRegister { #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub subscription: SubscriptionElement, #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub expires: Option, #[xml(ns = "rustical_dav::namespace::NS_DAVPUSH")] pub trigger: Option, } #[cfg(test)] mod tests { use crate::{ContentUpdate, PropertyUpdate}; use super::*; use rustical_dav::header::Depth; use rustical_xml::XmlDocument; #[test] fn test_xml_push_register() { let push_register = PushRegister::parse_str( r#" https://up.example.net/yohd4yai5Phiz1wi aes128gcm BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4 BTBZMqHH6r4Tts7J_aSIgg infinity 0 Wed, 20 Dec 2023 10:03:31 GMT "#, ) .unwrap(); assert_eq!( push_register, PushRegister { subscription: SubscriptionElement { web_push_subscription: WebPushSubscription { push_resource: "https://up.example.net/yohd4yai5Phiz1wi".to_owned(), content_encoding: Some("aes128gcm".to_owned()), subscription_public_key: SubscriptionPublicKey { ty: "p256dh".to_owned(), key: "BCVxsr7N_eNgVRqvHtD0zTZsEc6-VV-JvLexhqUzORcxaOzi6-AYWXvTBHm4bjyPjs7Vd8pZGH6SRpkNtoIAiw4".to_owned() }, auth_secret: "BTBZMqHH6r4Tts7J_aSIgg".to_owned() } }, expires: Some("Wed, 20 Dec 2023 10:03:31 GMT".to_owned()), trigger: Some(TriggerElement(vec![ Trigger::ContentUpdate(ContentUpdate(Depth::Infinity)), Trigger::PropertyUpdate(PropertyUpdate(Depth::Zero)), ])) } ); } }