Merge branch 'presence-show-option' into 'master'

presence: Remove Show::None and make presence.show Option<Show>

See merge request xmpp-rs/xmpp-parsers!11
This commit is contained in:
linkmauve 2019-07-13 15:27:24 +00:00
commit f3eac84992

View file

@ -19,9 +19,6 @@ pub trait PresencePayload: TryFrom<Element> + Into<Element> {}
/// Specifies the availability of an entity or resource.
#[derive(Debug, Clone, PartialEq)]
pub enum Show {
/// Not an actual show value, but an indication there is no show set.
None,
/// The entity or resource is temporarily away.
Away,
@ -36,12 +33,6 @@ pub enum Show {
Xa,
}
impl Default for Show {
fn default() -> Show {
Show::None
}
}
impl FromStr for Show {
type Err = Error;
@ -59,13 +50,9 @@ impl FromStr for Show {
impl IntoElements for Show {
fn into_elements(self, emitter: &mut ElementEmitter) {
if self == Show::None {
return;
}
emitter.append_child(
Element::builder("show")
.append(match self {
Show::None => unreachable!(),
Show::Away => Some("away"),
Show::Chat => Some("chat"),
Show::Dnd => Some("dnd"),
@ -177,7 +164,7 @@ pub struct Presence {
pub type_: Type,
/// The availability of the sender of this presence.
pub show: Show,
pub show: Option<Show>,
/// A localised list of statuses defined in this presence.
pub statuses: BTreeMap<Lang, Status>,
@ -198,7 +185,7 @@ impl Presence {
to: None,
id: None,
type_,
show: Show::None,
show: None,
statuses: BTreeMap::new(),
priority: 0i8,
payloads: vec![],
@ -228,7 +215,7 @@ impl Presence {
/// Set the availability information of this presence.
pub fn with_show(mut self, show: Show) -> Presence {
self.show = show;
self.show = Some(show);
self
}
@ -270,7 +257,7 @@ impl TryFrom<Element> for Presence {
to: get_attr!(root, "to", Option),
id: get_attr!(root, "id", Option),
type_: get_attr!(root, "type", Default),
show: Show::None,
show: None,
statuses: BTreeMap::new(),
priority: 0i8,
payloads: vec![],
@ -307,9 +294,7 @@ impl TryFrom<Element> for Presence {
presence.payloads.push(elem.clone());
}
}
if let Some(show) = show {
presence.show = show;
}
if let Some(priority) = priority {
presence.priority = priority;
}
@ -423,7 +408,21 @@ mod tests {
.unwrap();
let presence = Presence::try_from(elem).unwrap();
assert_eq!(presence.payloads.len(), 0);
assert_eq!(presence.show, Show::Chat);
assert_eq!(presence.show, Some(Show::Chat));
}
#[test]
fn test_empty_show_value() {
#[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 presence = Presence::try_from(elem).unwrap();
assert_eq!(presence.show, None);
}
#[test]