use crate::digestible::Digestible;
use byteorder::ByteOrder;
pub trait Digester {
type Target;
fn digest<B: ByteOrder>(self, data: &impl Digestible) -> Self::Target;
fn digest_native(self, data: &impl Digestible) -> Self::Target
where
Self: Sized,
{
self.digest::<byteorder::NativeEndian>(data)
}
fn digest_big_endian(self, data: &impl Digestible) -> Self::Target
where
Self: Sized,
{
self.digest::<byteorder::BigEndian>(data)
}
fn digest_little_endian(self, data: &impl Digestible) -> Self::Target
where
Self: Sized,
{
self.digest::<byteorder::LittleEndian>(data)
}
}
#[cfg(feature = "digest_0_10")]
mod digest_0_10 {
use crate::digester::Digester;
use crate::digestible::Digestible;
use byteorder::ByteOrder;
use digest_0_10::{Digest, Output};
impl<T: Digest> Digester for T {
type Target = Output<T>;
fn digest<B: ByteOrder>(mut self, data: &impl Digestible) -> Self::Target {
data.digest::<B, _>(&mut DigestConsumerInner(&mut self));
self.finalize()
}
}
struct DigestConsumerInner<'digest, T: Digest>(&'digest mut T);
impl<D: Digest> crate::DigestWriter for DigestConsumerInner<'_, D> {
#[inline]
fn write(&mut self, buf: &[u8]) {
self.0.update(buf);
}
}
}