diff --git a/src/lib.rs b/src/lib.rs index 900eed5..700edaa 100644 --- a/src/lib.rs +++ b/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 for BareJid { + fn from(jid: Jid) -> BareJid { + match jid { + Jid::Full(full) => full.into(), + Jid::Bare(bare) => bare, + } + } +} + +impl TryFrom for FullJid { + type Error = JidParseError; + + fn try_from(jid: Jid) -> Result { + 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!(