xmpp-rs/src/hashes.rs
2017-04-23 18:36:12 +01:00

74 lines
2.2 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use minidom::Element;
use error::Error;
use ns;
#[derive(Debug, Clone, PartialEq)]
pub struct Hash {
pub algo: String,
pub hash: String,
}
pub fn parse_hash(root: &Element) -> Result<Hash, Error> {
if !root.is("hash", ns::HASHES) {
return Err(Error::ParseError("This is not a hash element."));
}
for _ in root.children() {
return Err(Error::ParseError("Unknown child in hash element."));
}
let algo = root.attr("algo").ok_or(Error::ParseError("Mandatory argument 'algo' not present in hash element."))?.to_owned();
let hash = match root.text().as_ref() {
"" => return Err(Error::ParseError("Hash element shouldnt be empty.")),
text => text.to_owned(),
};
Ok(Hash {
algo: algo,
hash: hash,
})
}
pub fn serialise(hash: &Hash) -> Element {
Element::builder("hash")
.ns(ns::HASHES)
.attr("algo", hash.algo.clone())
.append(hash.hash.clone())
.build()
}
#[cfg(test)]
mod tests {
use minidom::Element;
use error::Error;
use hashes;
#[test]
fn test_simple() {
let elem: Element = "<hash xmlns='urn:xmpp:hashes:2' algo='sha-256'>2XarmwTlNxDAMkvymloX3S5+VbylNrJt/l5QyPa+YoU=</hash>".parse().unwrap();
let hash = hashes::parse_hash(&elem).unwrap();
assert_eq!(hash.algo, "sha-256");
assert_eq!(hash.hash, "2XarmwTlNxDAMkvymloX3S5+VbylNrJt/l5QyPa+YoU=");
}
#[test]
fn test_unknown() {
let elem: Element = "<replace xmlns='urn:xmpp:message-correct:0'/>".parse().unwrap();
let error = hashes::parse_hash(&elem).unwrap_err();
let message = match error {
Error::ParseError(string) => string,
_ => panic!(),
};
assert_eq!(message, "This is not a hash element.");
}
#[test]
fn test_invalid_child() {
let elem: Element = "<hash xmlns='urn:xmpp:hashes:2'><coucou/></hash>".parse().unwrap();
let error = hashes::parse_hash(&elem).unwrap_err();
let message = match error {
Error::ParseError(string) => string,
_ => panic!(),
};
assert_eq!(message, "Unknown child in hash element.");
}
}