diff --git a/src/hash.rs b/src/hash.rs index 295da3900..94d2af62f 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -1,14 +1,13 @@ use rustc_serialize::hex::*; use error::EthcoreError; use std::str::FromStr; +use std::fmt; macro_rules! impl_hash { ($from: ident, $size: expr) => { - #[derive(PartialEq, Debug)] - struct $from ([u8; $size]); + pub struct $from (pub [u8; $size]); impl FromStr for $from { -// type Output = $from; type Err = EthcoreError; fn from_str(s: &str) -> Result<$from, EthcoreError> { @@ -21,6 +20,30 @@ macro_rules! impl_hash { Ok(ret) } } + + impl fmt::Debug for $from { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + for i in self.0.iter() { + try!(write!(f, "{:02x}", i)); + } + Ok(()) + } + } + impl fmt::Display for $from { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + (self as &fmt::Debug).fmt(f) + } + } + impl PartialEq for $from { + fn eq(&self, other: &Self) -> bool { + for i in 0..$size { + if self.0[i] != other.0[i] { + return false; + } + } + true + } + } } } @@ -28,9 +51,13 @@ impl_hash!(Hash64, 8); impl_hash!(Hash128, 16); impl_hash!(Address, 20); impl_hash!(Hash256, 32); -//impl_hash!(Hash512, 64); +impl_hash!(Hash512, 64); +impl_hash!(Hash520, 65); +impl_hash!(Hash1024, 128); +impl_hash!(Hash2048, 256); +impl_hash!(Hash4096, 512); #[test] fn it_works() { assert_eq!(Hash64::from_str("0123456789abcdef").unwrap(), Hash64([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef])); -} +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 8a65c9873..91c4f8db6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,7 @@ extern crate rustc_serialize; +pub use std::str::FromStr; + pub mod error; pub mod hash; pub mod bytes;