diff --git a/src/iq.rs b/src/iq.rs index afdb463f..87477c3e 100644 --- a/src/iq.rs +++ b/src/iq.rs @@ -7,9 +7,12 @@ use error::Error; use ns; +use disco; + /// Lists every known payload of a ``. #[derive(Debug, Clone)] pub enum IqPayload { + Disco(disco::Disco), } #[derive(Debug, Clone)] @@ -67,36 +70,45 @@ pub fn parse_iq(root: &Element) -> Result { } if type_ == "error" { if elem.is("error", ns::JABBER_CLIENT) { - payload = Some(elem); + payload = Some(IqPayloadType::XML(elem.clone())); } else if root.children().collect::>().len() != 2 { return Err(Error::ParseError("Wrong number of children in iq element.")); } } else { - payload = Some(elem); + let parsed_payload = if let Ok(disco) = disco::parse_disco(elem) { + Some(IqPayload::Disco(disco)) + } else { + None + }; + + payload = match parsed_payload { + Some(payload) => Some(IqPayloadType::Parsed(payload)), + None => Some(IqPayloadType::XML(elem.clone())), + }; } } let type_ = if type_ == "get" { if let Some(payload) = payload.clone() { - IqType::Get(IqPayloadType::XML(payload.clone())) + IqType::Get(payload.clone()) } else { return Err(Error::ParseError("Wrong number of children in iq element.")); } } else if type_ == "set" { if let Some(payload) = payload.clone() { - IqType::Set(IqPayloadType::XML(payload.clone())) + IqType::Set(payload.clone()) } else { return Err(Error::ParseError("Wrong number of children in iq element.")); } } else if type_ == "result" { if let Some(payload) = payload.clone() { - IqType::Result(Some(IqPayloadType::XML(payload.clone()))) + IqType::Result(Some(payload.clone())) } else { IqType::Result(None) } } else if type_ == "error" { if let Some(payload) = payload.clone() { - IqType::Error(IqPayloadType::XML(payload.clone())) + IqType::Error(payload.clone()) } else { return Err(Error::ParseError("Wrong number of children in iq element.")); } @@ -112,6 +124,12 @@ pub fn parse_iq(root: &Element) -> Result { }) } +pub fn serialise_payload(payload: &IqPayload) -> Element { + match *payload { + IqPayload::Disco(ref disco) => disco::serialise_disco(disco), + } +} + pub fn serialise(iq: &Iq) -> Element { let mut stanza = Element::builder("iq") .ns(ns::JABBER_CLIENT) @@ -122,9 +140,12 @@ pub fn serialise(iq: &Iq) -> Element { .build(); let elem = match iq.payload.clone() { IqType::Get(IqPayloadType::XML(elem)) => elem, + IqType::Get(IqPayloadType::Parsed(payload)) => serialise_payload(&payload), IqType::Set(IqPayloadType::XML(elem)) => elem, + IqType::Set(IqPayloadType::Parsed(payload)) => serialise_payload(&payload), IqType::Result(None) => return stanza, IqType::Result(Some(IqPayloadType::XML(elem))) => elem, + IqType::Result(Some(IqPayloadType::Parsed(payload))) => serialise_payload(&payload), IqType::Error(IqPayloadType::XML(elem)) => elem, _ => panic!(), }; @@ -137,6 +158,7 @@ mod tests { use minidom::Element; use error::Error; use iq; + use disco; #[test] fn test_require_type() { @@ -152,10 +174,10 @@ mod tests { #[test] fn test_get() { let elem: Element = " - + ".parse().unwrap(); let iq = iq::parse_iq(&elem).unwrap(); - let query: Element = "".parse().unwrap(); + let query: Element = "".parse().unwrap(); assert_eq!(iq.from, None); assert_eq!(iq.to, None); assert_eq!(iq.id, None); @@ -254,4 +276,14 @@ mod tests { let elem2 = iq::serialise(&iq2); assert_eq!(elem, elem2); } + + #[test] + fn test_disco() { + let elem: Element = "".parse().unwrap(); + let iq = iq::parse_iq(&elem).unwrap(); + assert!(match iq.payload { + iq::IqType::Get(iq::IqPayloadType::Parsed(iq::IqPayload::Disco(disco::Disco { .. }))) => true, + _ => false, + }); + } }