wolfpack 0.3.1

A package manager and a build tool that supports major package formats (deb, RPM, ipk, pkg, MSIX).
Documentation
use crate::hash::Hasher;
use crate::hash::HashingReader;
use crate::hash::Md5Hash;
use crate::hash::Sha1;
use crate::hash::Sha1Hash;
use crate::hash::Sha256;
use crate::hash::Sha256Hash;
use crate::hash::Sha512;
use crate::hash::Sha512Hash;

pub struct MultiHasher {
    md5: md5::Context,
    sha1: Sha1,
    sha256: Sha256,
    sha512: Sha512,
}

#[derive(PartialEq, Eq, Debug)]
pub struct MultiHash {
    pub md5: Md5Hash,
    pub sha1: Sha1Hash,
    pub sha256: Sha256Hash,
    pub sha512: Sha512Hash,
}

impl Hasher for MultiHasher {
    type Output = MultiHash;

    fn new() -> Self {
        Self {
            md5: md5::Context::new(),
            sha1: sha1::Digest::new(),
            sha256: sha2::Digest::new(),
            sha512: sha2::Digest::new(),
        }
    }

    fn update(&mut self, data: &[u8]) {
        self.md5.consume(data);
        sha1::Digest::update(&mut self.sha1, data);
        sha2::Digest::update(&mut self.sha256, data);
        sha2::Digest::update(&mut self.sha512, data);
    }

    fn finalize(self) -> Self::Output {
        MultiHash {
            md5: Md5Hash::new(self.md5.finalize().into()),
            sha1: Sha1Hash::new(sha1::Digest::finalize(self.sha1).into()),
            sha256: Sha256Hash::new(sha2::Digest::finalize(self.sha256).into()),
            sha512: Sha512Hash::new(sha2::Digest::finalize(self.sha512).into()),
        }
    }
}

pub type MultiHashReader<R> = HashingReader<R, MultiHasher>;

#[cfg(test)]
mod tests {
    use super::*;
    use crate::hash::tests::*;

    #[test]
    fn multi_hash() {
        same_as_computing_hash_of_the_whole_file::<MultiHasher>();
        display_parse::<Sha1Hash>();
    }
}