1use minidom::Element;
2
3use error::Error;
4
5use ns;
6
7#[derive(Debug, Clone)]
8pub struct Replace {
9 pub id: String,
10}
11
12pub fn parse_replace(root: &Element) -> Result<Replace, Error> {
13 if !root.is("replace", ns::MESSAGE_CORRECT) {
14 return Err(Error::ParseError("This is not a replace element."));
15 }
16 for _ in root.children() {
17 return Err(Error::ParseError("Unknown child in replace element."));
18 }
19 let id = match root.attr("id") {
20 Some(id) => id.to_owned(),
21 None => return Err(Error::ParseError("No 'id' attribute present in replace.")),
22 };
23 Ok(Replace { id: id })
24}
25
26pub fn serialise(replace: &Replace) -> Element {
27 Element::builder("replace")
28 .ns(ns::MESSAGE_CORRECT)
29 .attr("id", replace.id.clone())
30 .build()
31}
32
33#[cfg(test)]
34mod tests {
35 use minidom::Element;
36 use error::Error;
37 use message_correct;
38
39 #[test]
40 fn test_simple() {
41 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0' id='coucou'/>".parse().unwrap();
42 message_correct::parse_replace(&elem).unwrap();
43 }
44
45 #[test]
46 fn test_invalid_child() {
47 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'><coucou/></replace>".parse().unwrap();
48 let error = message_correct::parse_replace(&elem).unwrap_err();
49 let message = match error {
50 Error::ParseError(string) => string,
51 _ => panic!(),
52 };
53 assert_eq!(message, "Unknown child in replace element.");
54 }
55
56 #[test]
57 fn test_invalid_id() {
58 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
59 let error = message_correct::parse_replace(&elem).unwrap_err();
60 let message = match error {
61 Error::ParseError(string) => string,
62 _ => panic!(),
63 };
64 assert_eq!(message, "No 'id' attribute present in replace.");
65 }
66
67 #[test]
68 fn test_serialise() {
69 let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0' id='coucou'/>".parse().unwrap();
70 let replace = message_correct::Replace { id: String::from("coucou") };
71 let elem2 = message_correct::serialise(&replace);
72 assert_eq!(elem, elem2);
73 }
74}