mod belt;
mod blake2;
mod blake3;
mod sha256;
mod sha3;
mod streebog;
pub use belt::BeltHashHasher;
pub use blake2::{Blake2b512Hasher, Blake2s256Hasher};
pub use blake3::Blake3Hasher;
pub use sha3::{Sha3_256Hasher, Sha3_512Hasher};
pub use sha256::Sha256Hasher;
pub use streebog::{Streebog256Hasher, Streebog512Hasher};
use sha2::Digest;
use crate::contract::{Hasher, Identified};
use crate::error::Result;
pub trait NamedDigest {
type Core: Digest;
}
impl<D: NamedDigest + Identified + Send + Sync> Hasher for D {
fn digest(&self, data: &[u8]) -> Result<Vec<u8>> {
Ok(D::Core::digest(data).to_vec())
}
}
macro_rules! hasher {
($name:ident, $identifier:literal, $doc:literal $(,)?) => {
#[doc = $doc]
#[derive(Debug, Default, Clone, Copy)]
pub struct $name;
impl $name {
pub const IDENTIFIER: &'static str = $identifier;
pub fn new() -> Self {
Self
}
}
impl $crate::contract::Identified for $name {
fn identifier(&self) -> &str {
Self::IDENTIFIER
}
}
};
}
pub(crate) use hasher;