diff --git a/src/sm.rs b/src/sm.rs index 1fb2b946..e93aa24f 100644 --- a/src/sm.rs +++ b/src/sm.rs @@ -4,35 +4,44 @@ // 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/. -#![allow(missing_docs)] - use stanza_error::DefinedCondition; generate_element!( + /// Acknowledgement of the currently received stanzas. A, "a", SM, attributes: [ + /// The last handled stanza. h: u32 = "h" => required, ] ); impl A { + /// Generates a new `` element. pub fn new(h: u32) -> A { A { h } } } -generate_attribute!(ResumeAttr, "resume", bool); +generate_attribute!( + /// Whether to allow resumption of a previous stream. + ResumeAttr, "resume", bool +); generate_element!( + /// Client request for enabling stream management. Enable, "enable", SM, attributes: [ + /// The preferred resumption time in seconds by the client. // TODO: should be the infinite integer set ≥ 1. max: Option = "max" => optional, + + /// Whether the client wants to be allowed to resume the stream. resume: ResumeAttr = "resume" => default, ] ); impl Enable { + /// Generates a new `` element. pub fn new() -> Self { Enable { max: None, @@ -40,56 +49,86 @@ impl Enable { } } + /// Sets the preferred resumption time in seconds. pub fn with_max(mut self, max: u32) -> Self { self.max = Some(max); self } + /// Asks for resumption to be possible. pub fn with_resume(mut self) -> Self { self.resume = ResumeAttr::True; self } } +generate_id!( + /// A random identifier used for stream resumption. + StreamId +); + generate_element!( + /// Server response once stream management is enabled. Enabled, "enabled", SM, attributes: [ - id: Option = "id" => optional, + /// A random identifier used for stream resumption. + id: Option = "id" => optional, + + /// The preferred IP, domain, IP:port or domain:port location for + /// resumption. location: Option = "location" => optional, + + /// The preferred resumption time in seconds by the server. // TODO: should be the infinite integer set ≥ 1. max: Option = "max" => optional, + + /// Whether stream resumption is allowed. resume: ResumeAttr = "resume" => default, ] ); generate_element!( + /// A stream management error happened. Failed, "failed", SM, attributes: [ + /// The last handled stanza. h: Option = "h" => optional, ], children: [ + /// The error returned. // XXX: implement the * handling. error: Option = ("*", XMPP_STANZAS) => DefinedCondition ] ); generate_empty_element!( + /// Requests the currently received stanzas by the other party. R, "r", SM ); generate_element!( + /// Requests a stream resumption. Resume, "resume", SM, attributes: [ + /// The last handled stanza. h: u32 = "h" => required, - previd: String = "previd" => required, + + /// The previous id given by the server on + /// [enabled](struct.Enabled.html). + previd: StreamId = "previd" => required, ] ); generate_element!( + /// The response by the server for a successfully resumed stream. Resumed, "resumed", SM, attributes: [ + /// The last handled stanza. h: u32 = "h" => required, - previd: String = "previd" => required, + + /// The previous id given by the server on + /// [enabled](struct.Enabled.html). + previd: StreamId = "previd" => required, ] ); @@ -117,4 +156,30 @@ mod tests { let elem: Element = "".parse().unwrap(); StreamManagement::try_from(elem).unwrap(); } + + #[test] + fn resume() { + let elem: Element = "".parse().unwrap(); + let enable = Enable::try_from(elem).unwrap(); + assert_eq!(enable.max, None); + assert_eq!(enable.resume, ResumeAttr::True); + + let elem: Element = "".parse().unwrap(); + let enabled = Enabled::try_from(elem).unwrap(); + let previd = enabled.id.unwrap(); + assert_eq!(enabled.resume, ResumeAttr::True); + assert_eq!(previd, StreamId(String::from("coucou"))); + assert_eq!(enabled.max, Some(600)); + assert_eq!(enabled.location, None); + + let elem: Element = "".parse().unwrap(); + let resume = Resume::try_from(elem).unwrap(); + assert_eq!(resume.h, 5); + assert_eq!(resume.previd, previd); + + let elem: Element = "".parse().unwrap(); + let resumed = Resumed::try_from(elem).unwrap(); + assert_eq!(resumed.h, 5); + assert_eq!(resumed.previd, previd); + } }