Run cargo fmt.
This commit is contained in:
parent
d517b8e32e
commit
efd7bd5f2f
51 changed files with 2276 additions and 1324 deletions
224
src/presence.rs
224
src/presence.rs
|
|
@ -5,11 +5,11 @@
|
|||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
use try_from::TryFrom;
|
||||
use std::str::FromStr;
|
||||
use std::collections::BTreeMap;
|
||||
use std::str::FromStr;
|
||||
use try_from::TryFrom;
|
||||
|
||||
use minidom::{Element, IntoElements, IntoAttributeValue, ElementEmitter};
|
||||
use minidom::{Element, ElementEmitter, IntoAttributeValue, IntoElements};
|
||||
|
||||
use jid::Jid;
|
||||
|
||||
|
|
@ -68,14 +68,15 @@ impl IntoElements for Show {
|
|||
}
|
||||
emitter.append_child(
|
||||
Element::builder("show")
|
||||
.append(match self {
|
||||
Show::None => unreachable!(),
|
||||
Show::Away => Some("away"),
|
||||
Show::Chat => Some("chat"),
|
||||
Show::Dnd => Some("dnd"),
|
||||
Show::Xa => Some("xa"),
|
||||
})
|
||||
.build())
|
||||
.append(match self {
|
||||
Show::None => unreachable!(),
|
||||
Show::Away => Some("away"),
|
||||
Show::Chat => Some("chat"),
|
||||
Show::Dnd => Some("dnd"),
|
||||
Show::Xa => Some("xa"),
|
||||
})
|
||||
.build(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -84,7 +85,7 @@ type Status = String;
|
|||
|
||||
type Priority = i8;
|
||||
|
||||
///
|
||||
///
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum Type {
|
||||
/// This value is not an acceptable 'type' attribute, it is only used
|
||||
|
|
@ -136,24 +137,31 @@ impl FromStr for Type {
|
|||
"unsubscribe" => Type::Unsubscribe,
|
||||
"unsubscribed" => Type::Unsubscribed,
|
||||
|
||||
_ => return Err(Error::ParseError("Invalid 'type' attribute on presence element.")),
|
||||
_ => {
|
||||
return Err(Error::ParseError(
|
||||
"Invalid 'type' attribute on presence element.",
|
||||
))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoAttributeValue for Type {
|
||||
fn into_attribute_value(self) -> Option<String> {
|
||||
Some(match self {
|
||||
Type::None => return None,
|
||||
Some(
|
||||
match self {
|
||||
Type::None => return None,
|
||||
|
||||
Type::Error => "error",
|
||||
Type::Probe => "probe",
|
||||
Type::Subscribe => "subscribe",
|
||||
Type::Subscribed => "subscribed",
|
||||
Type::Unavailable => "unavailable",
|
||||
Type::Unsubscribe => "unsubscribe",
|
||||
Type::Unsubscribed => "unsubscribed",
|
||||
}.to_owned())
|
||||
Type::Error => "error",
|
||||
Type::Probe => "probe",
|
||||
Type::Subscribe => "subscribe",
|
||||
Type::Subscribed => "subscribed",
|
||||
Type::Unavailable => "unavailable",
|
||||
Type::Unsubscribe => "unsubscribe",
|
||||
Type::Unsubscribed => "unsubscribed",
|
||||
}
|
||||
.to_owned(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -197,7 +205,7 @@ impl Presence {
|
|||
show: Show::None,
|
||||
statuses: BTreeMap::new(),
|
||||
priority: 0i8,
|
||||
payloads: vec!(),
|
||||
payloads: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -266,12 +274,14 @@ impl TryFrom<Element> for Presence {
|
|||
show: Show::None,
|
||||
statuses: BTreeMap::new(),
|
||||
priority: 0i8,
|
||||
payloads: vec!(),
|
||||
payloads: vec![],
|
||||
};
|
||||
for elem in root.children() {
|
||||
if elem.is("show", ns::DEFAULT_NS) {
|
||||
if show.is_some() {
|
||||
return Err(Error::ParseError("More than one show element in a presence."));
|
||||
return Err(Error::ParseError(
|
||||
"More than one show element in a presence.",
|
||||
));
|
||||
}
|
||||
check_no_attributes!(elem, "show");
|
||||
check_no_children!(elem, "show");
|
||||
|
|
@ -281,11 +291,15 @@ impl TryFrom<Element> for Presence {
|
|||
check_no_children!(elem, "status");
|
||||
let lang = get_attr!(elem, "xml:lang", default);
|
||||
if presence.statuses.insert(lang, elem.text()).is_some() {
|
||||
return Err(Error::ParseError("Status element present twice for the same xml:lang."));
|
||||
return Err(Error::ParseError(
|
||||
"Status element present twice for the same xml:lang.",
|
||||
));
|
||||
}
|
||||
} else if elem.is("priority", ns::DEFAULT_NS) {
|
||||
if priority.is_some() {
|
||||
return Err(Error::ParseError("More than one priority element in a presence."));
|
||||
return Err(Error::ParseError(
|
||||
"More than one priority element in a presence.",
|
||||
));
|
||||
}
|
||||
check_no_attributes!(elem, "priority");
|
||||
check_no_children!(elem, "priority");
|
||||
|
|
@ -307,24 +321,37 @@ impl TryFrom<Element> for Presence {
|
|||
impl From<Presence> for Element {
|
||||
fn from(presence: Presence) -> Element {
|
||||
Element::builder("presence")
|
||||
.ns(ns::DEFAULT_NS)
|
||||
.attr("from", presence.from)
|
||||
.attr("to", presence.to)
|
||||
.attr("id", presence.id)
|
||||
.attr("type", presence.type_)
|
||||
.append(presence.show)
|
||||
.append(presence.statuses.into_iter().map(|(lang, status)| {
|
||||
Element::builder("status")
|
||||
.attr("xml:lang", match lang.as_ref() {
|
||||
"" => None,
|
||||
lang => Some(lang),
|
||||
})
|
||||
.append(status)
|
||||
.build()
|
||||
}).collect::<Vec<_>>())
|
||||
.append(if presence.priority == 0 { None } else { Some(format!("{}", presence.priority)) })
|
||||
.append(presence.payloads)
|
||||
.build()
|
||||
.ns(ns::DEFAULT_NS)
|
||||
.attr("from", presence.from)
|
||||
.attr("to", presence.to)
|
||||
.attr("id", presence.id)
|
||||
.attr("type", presence.type_)
|
||||
.append(presence.show)
|
||||
.append(
|
||||
presence
|
||||
.statuses
|
||||
.into_iter()
|
||||
.map(|(lang, status)| {
|
||||
Element::builder("status")
|
||||
.attr(
|
||||
"xml:lang",
|
||||
match lang.as_ref() {
|
||||
"" => None,
|
||||
lang => Some(lang),
|
||||
},
|
||||
)
|
||||
.append(status)
|
||||
.build()
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
)
|
||||
.append(if presence.priority == 0 {
|
||||
None
|
||||
} else {
|
||||
Some(format!("{}", presence.priority))
|
||||
})
|
||||
.append(presence.payloads)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -354,7 +381,9 @@ mod tests {
|
|||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'/>".parse().unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'/>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
assert_eq!(presence.from, None);
|
||||
assert_eq!(presence.to, None);
|
||||
|
|
@ -366,9 +395,13 @@ mod tests {
|
|||
#[test]
|
||||
fn test_serialise() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client' type='unavailable'/>/>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client' type='unavailable'/>/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept' type='unavailable'/>/>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept' type='unavailable'/>/>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::new(Type::Unavailable);
|
||||
let elem2 = presence.into();
|
||||
assert!(elem.compare_to(&elem2));
|
||||
|
|
@ -377,9 +410,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_show() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show>chat</show></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show>chat</show></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><show>chat</show></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><show>chat</show></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
assert_eq!(presence.payloads.len(), 0);
|
||||
assert_eq!(presence.show, Show::Chat);
|
||||
|
|
@ -388,9 +426,13 @@ mod tests {
|
|||
#[test]
|
||||
fn test_missing_show_value() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><show/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><show/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let error = Presence::try_from(elem).unwrap_err();
|
||||
let message = match error {
|
||||
Error::ParseError(string) => string,
|
||||
|
|
@ -403,9 +445,14 @@ mod tests {
|
|||
fn test_invalid_show() {
|
||||
// "online" used to be a pretty common mistake.
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show>online</show></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><show>online</show></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><show>online</show></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><show>online</show></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let error = Presence::try_from(elem).unwrap_err();
|
||||
let message = match error {
|
||||
Error::ParseError(string) => string,
|
||||
|
|
@ -417,9 +464,13 @@ mod tests {
|
|||
#[test]
|
||||
fn test_empty_status() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><status/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><status/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
assert_eq!(presence.payloads.len(), 0);
|
||||
assert_eq!(presence.statuses.len(), 1);
|
||||
|
|
@ -429,9 +480,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_status() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status>Here!</status></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status>Here!</status></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><status>Here!</status></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><status>Here!</status></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
assert_eq!(presence.payloads.len(), 0);
|
||||
assert_eq!(presence.statuses.len(), 1);
|
||||
|
|
@ -462,15 +518,23 @@ mod tests {
|
|||
Error::ParseError(string) => string,
|
||||
_ => panic!(),
|
||||
};
|
||||
assert_eq!(message, "Status element present twice for the same xml:lang.");
|
||||
assert_eq!(
|
||||
message,
|
||||
"Status element present twice for the same xml:lang."
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_priority() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><priority>-1</priority></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><priority>-1</priority></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><priority>-1</priority></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><priority>-1</priority></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
assert_eq!(presence.payloads.len(), 0);
|
||||
assert_eq!(presence.priority, -1i8);
|
||||
|
|
@ -479,9 +543,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_invalid_priority() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><priority>128</priority></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><priority>128</priority></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><priority>128</priority></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><priority>128</priority></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let error = Presence::try_from(elem).unwrap_err();
|
||||
match error {
|
||||
Error::ParseIntError(_) => (),
|
||||
|
|
@ -492,9 +561,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_unknown_child() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><test xmlns='invalid'/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><test xmlns='invalid'/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><test xmlns='invalid'/></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><test xmlns='invalid'/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let presence = Presence::try_from(elem).unwrap();
|
||||
let payload = &presence.payloads[0];
|
||||
assert!(payload.is("test", "invalid"));
|
||||
|
|
@ -503,9 +577,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_invalid_status_child() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status><coucou/></status></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status><coucou/></status></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><status><coucou/></status></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><status><coucou/></status></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let error = Presence::try_from(elem).unwrap_err();
|
||||
let message = match error {
|
||||
Error::ParseError(string) => string,
|
||||
|
|
@ -517,9 +596,14 @@ mod tests {
|
|||
#[test]
|
||||
fn test_invalid_attribute() {
|
||||
#[cfg(not(feature = "component"))]
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status coucou=''/></presence>".parse().unwrap();
|
||||
let elem: Element = "<presence xmlns='jabber:client'><status coucou=''/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
#[cfg(feature = "component")]
|
||||
let elem: Element = "<presence xmlns='jabber:component:accept'><status coucou=''/></presence>".parse().unwrap();
|
||||
let elem: Element =
|
||||
"<presence xmlns='jabber:component:accept'><status coucou=''/></presence>"
|
||||
.parse()
|
||||
.unwrap();
|
||||
let error = Presence::try_from(elem).unwrap_err();
|
||||
let message = match error {
|
||||
Error::ParseError(string) => string,
|
||||
|
|
|
|||
Loading…
Reference in a new issue