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