Add more helpers on Jid to convert to Bare/FullJid

Maxime “pep” Buquet created

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>

Change summary

src/lib.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)

Detailed changes

src/lib.rs 🔗

@@ -14,7 +14,7 @@
 //!
 //! For usage, check the documentation on the `Jid` struct.
 
-use std::convert::Into;
+use std::convert::{Into, TryFrom};
 use std::error::Error as StdError;
 use std::fmt;
 use std::str::FromStr;
@@ -121,6 +121,26 @@ impl Jid {
     }
 }
 
+impl From<Jid> for BareJid {
+    fn from(jid: Jid) -> BareJid {
+        match jid {
+            Jid::Full(full) => full.into(),
+            Jid::Bare(bare) => bare,
+        }
+    }
+}
+
+impl TryFrom<Jid> for FullJid {
+    type Error = JidParseError;
+
+    fn try_from(jid: Jid) -> Result<Self, Self::Error> {
+        match jid {
+            Jid::Full(full) => Ok(full),
+            Jid::Bare(_) => Err(JidParseError::NoResource),
+        }
+    }
+}
+
 /// A struct representing a full Jabber ID.
 ///
 /// A full Jabber ID is composed of 3 components, of which one is optional:
@@ -684,6 +704,29 @@ mod tests {
         );
     }
 
+    #[test]
+    fn jid_to_full_bare() {
+        let full = FullJid::new("a", "b.c", "d");
+        let bare = BareJid::new("a", "b.c");
+
+        assert_eq!(
+            FullJid::try_from(Jid::Full(full.clone())),
+            Ok(full.clone()),
+        );
+        assert_eq!(
+            FullJid::try_from(Jid::Bare(bare.clone())),
+            Err(JidParseError::NoResource),
+        );
+        assert_eq!(
+            BareJid::from(Jid::Full(full.clone())),
+            bare.clone(),
+        );
+        assert_eq!(
+            BareJid::from(Jid::Bare(bare.clone())),
+            bare,
+        );
+    }
+
     #[test]
     fn serialise() {
         assert_eq!(