dirhash/
lib.rs

1use std::io;
2use walkdir;
3use walkdir::WalkDir;
4use std::fs::File;
5use std::io::prelude::*;
6use seahash::hash as hashvec;
7
8
9fn noice_err(e: walkdir::Error) -> io::Error {
10    match e.into_io_error() {
11        Some(e) => e,
12        None => io::Error::new(io::ErrorKind::Other, "Unknown Error"),
13    }
14}
15
16pub fn hash<P: AsRef<std::path::Path>>(dir: P) -> Result<u64, io::Error> {
17    let mut buffer: Vec<u8> = vec![];
18    let mut hashes: Vec<u64> = vec![];
19    for entry in WalkDir::new(dir).into_iter() {
20        let entry = entry.map_err(noice_err)?.into_path();
21        if entry.is_file(){
22            File::open(entry)?.read_to_end(&mut buffer)?;
23            hashes.push(hashvec(&buffer));
24        }    
25    }
26    let mut final_hash: Vec<u8> = vec![];
27    hashes.sort_unstable();
28    for elem in hashes{
29        //TODO: Don't
30        //TODON'T: keep
31        let bys: [u8; 8] = unsafe{std::mem::transmute::<u64, [u8;8]>(elem)};
32        final_hash.extend(&bys)
33    }
34
35    
36    Ok(hashvec(&final_hash))
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    #[test]
43    fn it_works() {
44        assert_eq!(2 + 2, 4);
45    }
46}