diff --git a/src/presence.rs b/src/presence.rs index ad6301eb..3f298333 100644 --- a/src/presence.rs +++ b/src/presence.rs @@ -40,11 +40,14 @@ impl IntoElements for Show { pub type Status = String; +pub type Priority = i8; + /// Lists every known payload of a ``. #[derive(Debug, Clone)] pub enum PresencePayload { Show(Show), Status(Status), + Priority(Priority), Delay(delay::Delay), ECaps2(ecaps2::ECaps2), } @@ -153,6 +156,13 @@ pub fn parse_presence(root: &Element) -> Result { } let payload = PresencePayload::Status(elem.text()); payloads.push(PresencePayloadType::Parsed(payload)); + } else if elem.is("priority", ns::JABBER_CLIENT) { + for _ in elem.children() { + return Err(Error::ParseError("Unknown child in priority element.")); + } + let priority = Priority::from_str(elem.text().as_ref())?; + let payload = PresencePayload::Priority(priority); + payloads.push(PresencePayloadType::Parsed(payload)); } else { let payload = if let Ok(delay) = delay::parse_delay(elem) { Some(PresencePayload::Delay(delay)) @@ -190,6 +200,12 @@ pub fn serialise_payload(payload: &PresencePayload) -> Element { .append(status.to_owned()) .build() }, + PresencePayload::Priority(ref priority) => { + Element::builder("status") + .ns(ns::JABBER_CLIENT) + .append(format!("{}", priority)) + .build() + }, PresencePayload::Delay(ref delay) => delay::serialise(delay), PresencePayload::ECaps2(ref ecaps2) => ecaps2::serialise(ecaps2), } @@ -295,6 +311,29 @@ mod tests { } } + #[test] + fn test_priority() { + let elem: Element = "-1".parse().unwrap(); + let presence = presence::parse_presence(&elem).unwrap(); + assert_eq!(presence.payloads.len(), 1); + match presence.payloads[0] { + presence::PresencePayloadType::Parsed(presence::PresencePayload::Priority(ref priority)) => { + assert_eq!(*priority, presence::Priority::from(-1i8)); + }, + _ => panic!("Failed to parse priority."), + } + } + + #[test] + fn test_invalid_priority() { + let elem: Element = "128".parse().unwrap(); + let error = presence::parse_presence(&elem).unwrap_err(); + match error { + Error::ParseIntError(_) => (), + _ => panic!(), + }; + } + #[test] fn test_unknown_child() { let elem: Element = "".parse().unwrap();