// Copyright (c) 2017 Emmanuel Gil Peyrot // // This Source Code Form is subject to the terms of the Mozilla Public // 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/. 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 { 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 shouldn’t 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 = "2XarmwTlNxDAMkvymloX3S5+VbylNrJt/l5QyPa+YoU=".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 = "".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 = "".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."); } }