jingle_s5b: Make Candidate.host an IpAddr instead of a String.

Emmanuel Gil Peyrot created

Change summary

src/error.rs      | 9 +++++++++
src/jingle_s5b.rs | 9 +++++----
2 files changed, 14 insertions(+), 4 deletions(-)

Detailed changes

src/error.rs 🔗

@@ -9,6 +9,7 @@ use std::io;
 use std::num;
 use std::string;
 use std::fmt;
+use std::net;
 
 use base64;
 use minidom;
@@ -23,6 +24,7 @@ pub enum Error {
     Base64Error(base64::DecodeError),
     ParseIntError(num::ParseIntError),
     ParseStringError(string::ParseError),
+    ParseAddrError(net::AddrParseError),
     JidParseError(jid::JidParseError),
     ChronoParseError(chrono::ParseError),
 }
@@ -36,6 +38,7 @@ impl fmt::Display for Error {
             Error::Base64Error(ref e) => write!(fmt, "{}", e),
             Error::ParseIntError(ref e) => write!(fmt, "{}", e),
             Error::ParseStringError(ref e) => write!(fmt, "{}", e),
+            Error::ParseAddrError(ref e) => write!(fmt, "{}", e),
             Error::JidParseError(_) => write!(fmt, "JID parse error"),
             Error::ChronoParseError(ref e) => write!(fmt, "{}", e),
         }
@@ -72,6 +75,12 @@ impl From<string::ParseError> for Error {
     }
 }
 
+impl From<net::AddrParseError> for Error {
+    fn from(err: net::AddrParseError) -> Error {
+        Error::ParseAddrError(err)
+    }
+}
+
 impl From<jid::JidParseError> for Error {
     fn from(err: jid::JidParseError) -> Error {
         Error::JidParseError(err)

src/jingle_s5b.rs 🔗

@@ -6,6 +6,7 @@
 
 use try_from::TryFrom;
 use std::str::FromStr;
+use std::net::IpAddr;
 
 use minidom::{Element, IntoAttributeValue};
 use jid::Jid;
@@ -32,7 +33,7 @@ generate_id!(StreamId);
 
 generate_element_with_only_attributes!(Candidate, "candidate", ns::JINGLE_S5B, [
     cid: CandidateId = "cid" => required,
-    host: String = "host" => required,
+    host: IpAddr = "host" => required,
     jid: Jid = "jid" => required,
     port: Option<u16> = "port" => optional,
     priority: u32 = "priority" => required,
@@ -40,7 +41,7 @@ generate_element_with_only_attributes!(Candidate, "candidate", ns::JINGLE_S5B, [
 ]);
 
 impl Candidate {
-    pub fn new(cid: CandidateId, host: String, jid: Jid, priority: u32) -> Candidate {
+    pub fn new(cid: CandidateId, host: IpAddr, jid: Jid, priority: u32) -> Candidate {
         Candidate {
             cid,
             host,
@@ -238,14 +239,14 @@ mod tests {
 
     #[test]
     fn test_serialise_candidate() {
-        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:s5b:1' sid='coucou'><candidate cid='coucou' host='coucou' jid='coucou@coucou' priority='0'/></transport>".parse().unwrap();
+        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:s5b:1' sid='coucou'><candidate cid='coucou' host='127.0.0.1' jid='coucou@coucou' priority='0'/></transport>".parse().unwrap();
         let transport = Transport {
             sid: StreamId(String::from("coucou")),
             dstaddr: None,
             mode: Mode::Tcp,
             payload: TransportPayload::Candidates(vec!(Candidate {
                 cid: CandidateId(String::from("coucou")),
-                host: String::from("coucou"),
+                host: IpAddr::from_str("127.0.0.1").unwrap(),
                 jid: Jid::from_str("coucou@coucou").unwrap(),
                 port: None,
                 priority: 0u32,