Add ask attribute from RFC3921.

O01eg created

Fixes #1

Change summary

src/roster.rs | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)

Detailed changes

src/roster.rs 🔗

@@ -36,6 +36,14 @@ generate_attribute!(
     }, Default = None
 );
 
+generate_attribute!(
+    /// The sub-state of subscription with a contact.
+    Ask, "ask", {
+        /// Pending sub-state of the 'none' subscription state
+        Subscribe => "subscribe",
+    }
+);
+
 generate_element!(
     /// Contact from the user’s contact list.
     #[derive(PartialEq)]
@@ -48,7 +56,10 @@ generate_element!(
         name: Option<String> = "name" => optional_empty,
 
         /// Subscription status of this contact.
-        subscription: Subscription = "subscription" => default
+        subscription: Subscription = "subscription" => default,
+
+        ///
+        ask: Option<Ask> = "ask" => optional_empty
     ],
 
     children: [
@@ -144,23 +155,42 @@ mod tests {
   <item jid='benvolio@example.net'
         name='Benvolio'
         subscription='both'/>
+  <item jid='contact@example.org'
+        subscription='none'
+        ask='subscribe'
+        name='MyContact'>
+      <group>MyBuddies</group>
+  </item>
 </query>
 "#
         .parse()
         .unwrap();
         let roster = Roster::try_from(elem).unwrap();
         assert_eq!(roster.ver, Some(String::from("ver11")));
-        assert_eq!(roster.items.len(), 3);
+        assert_eq!(roster.items.len(), 4);
         assert_eq!(
             roster.items[0].jid,
             Jid::from_str("romeo@example.net").unwrap()
         );
         assert_eq!(roster.items[0].name, Some(String::from("Romeo")));
         assert_eq!(roster.items[0].subscription, Subscription::Both);
+        assert_eq!(roster.items[0].ask, None);
         assert_eq!(
             roster.items[0].groups,
             vec!(Group::from_str("Friends").unwrap())
         );
+
+        assert_eq!(
+            roster.items[3].jid,
+            Jid::from_str("contact@example.org").unwrap()
+        );
+        assert_eq!(roster.items[3].name, Some(String::from("MyContact")));
+        assert_eq!(roster.items[3].subscription, Subscription::None);
+        assert_eq!(roster.items[3].ask, Some(Ask::Subscribe));
+        assert_eq!(
+            roster.items[3].groups,
+            vec!(Group::from_str("MyBuddies").unwrap())
+        );
     }
 
     #[test]