mam_prefs.rs

  1// Copyright (c) 2021 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
  2//
  3// This Source Code Form is subject to the terms of the Mozilla Public
  4// License, v. 2.0. If a copy of the MPL was not distributed with this
  5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6
  7use xso::{AsXml, FromXml};
  8
  9use crate::iq::{IqGetPayload, IqResultPayload, IqSetPayload};
 10use crate::ns;
 11use jid::Jid;
 12
 13generate_attribute!(
 14    /// Notes the default archiving preference for the user.
 15    DefaultPrefs, "default", {
 16        /// The default is to always log messages in the archive.
 17        Always => "always",
 18
 19        /// The default is to never log messages in the archive.
 20        Never => "never",
 21
 22        /// The default is to log messages in the archive only for contacts
 23        /// present in the user’s [roster](../roster/index.html).
 24        Roster => "roster",
 25    }
 26);
 27
 28/// Controls the archiving preferences of the user.
 29#[derive(FromXml, AsXml, Debug, Clone, PartialEq)]
 30#[xml(namespace = ns::MAM, name = "prefs")]
 31pub struct Prefs {
 32    /// The default preference for JIDs in neither
 33    /// [always](#structfield.always) or [never](#structfield.never) lists.
 34    #[xml(attribute = "default")]
 35    pub default_: DefaultPrefs,
 36
 37    /// The set of JIDs for which to always store messages in the archive.
 38    #[xml(extract(default, fields(extract(n = .., name = "jid", fields(text(type_ = Jid))))))]
 39    pub always: Vec<Jid>,
 40
 41    /// The set of JIDs for which to never store messages in the archive.
 42    #[xml(extract(default, fields(extract(n = .., name = "jid", fields(text(type_ = Jid))))))]
 43    pub never: Vec<Jid>,
 44}
 45
 46impl IqGetPayload for Prefs {}
 47impl IqSetPayload for Prefs {}
 48impl IqResultPayload for Prefs {}
 49
 50#[cfg(test)]
 51mod tests {
 52    use super::*;
 53    use jid::BareJid;
 54    use minidom::Element;
 55
 56    #[cfg(target_pointer_width = "32")]
 57    #[test]
 58    fn test_size() {
 59        assert_size!(DefaultPrefs, 1);
 60        assert_size!(Prefs, 28);
 61    }
 62
 63    #[cfg(target_pointer_width = "64")]
 64    #[test]
 65    fn test_size() {
 66        assert_size!(DefaultPrefs, 1);
 67        assert_size!(Prefs, 56);
 68    }
 69
 70    #[test]
 71    fn test_prefs_get() {
 72        let elem: Element = "<prefs xmlns='urn:xmpp:mam:2' default='always'/>"
 73            .parse()
 74            .unwrap();
 75        let prefs = Prefs::try_from(elem).unwrap();
 76        assert!(prefs.always.is_empty());
 77        assert!(prefs.never.is_empty());
 78
 79        let elem: Element = r#"<prefs xmlns='urn:xmpp:mam:2' default='roster'>
 80  <always/>
 81  <never/>
 82</prefs>
 83"#
 84        .parse()
 85        .unwrap();
 86        let prefs = Prefs::try_from(elem).unwrap();
 87        assert!(prefs.always.is_empty());
 88        assert!(prefs.never.is_empty());
 89    }
 90
 91    #[test]
 92    fn test_prefs_result() {
 93        let elem: Element = r#"<prefs xmlns='urn:xmpp:mam:2' default='roster'>
 94  <always>
 95    <jid>romeo@montague.lit</jid>
 96  </always>
 97  <never>
 98    <jid>montague@montague.lit</jid>
 99  </never>
100</prefs>
101"#
102        .parse()
103        .unwrap();
104        let prefs = Prefs::try_from(elem).unwrap();
105        assert_eq!(prefs.always, [BareJid::new("romeo@montague.lit").unwrap()]);
106        assert_eq!(
107            prefs.never,
108            [BareJid::new("montague@montague.lit").unwrap()]
109        );
110
111        let elem2 = Element::from(prefs.clone());
112        println!("{:?}", elem2);
113        let prefs2 = Prefs::try_from(elem2).unwrap();
114        assert_eq!(prefs.default_, prefs2.default_);
115        assert_eq!(prefs.always, prefs2.always);
116        assert_eq!(prefs.never, prefs2.never);
117    }
118}