1use std::{
2 collections::hash_map::DefaultHasher,
3 fs::File,
4 hash::{Hash, Hasher},
5 io::{Error, Read},
6 path::Path,
7};
8
9pub fn filehash(file_path: &mut String) -> Result<u64, Error> {
37 let tmp = file_path.trim();
38 let path_input = Path::new(&tmp);
39
40 let path_canonicalized = path_input.canonicalize()?;
41 let path_os_string = path_canonicalized.as_os_str();
42 let mut buffer: Vec<u8> = Vec::new();
43
44 let mut f = File::open(path_os_string)?;
45 f.read_to_end(&mut buffer)?;
46
47 let mut hasher = DefaultHasher::new();
48 buffer.hash(&mut hasher);
49 let finished_hash = hasher.finish();
50 return Ok(finished_hash);
51}
52
53#[cfg(test)]
54mod tests {
55 use super::filehash;
56
57 #[test]
58 fn it_generates_consistent_results_png() {
59 let mut mock_file1 = String::from("./mock/mock.png");
60 let mut mock_file2 = String::from("./mock/mock.png");
61 let result1 = filehash(&mut mock_file1);
62 let result2 = filehash(&mut mock_file2);
63 assert_eq!(result1.unwrap(), result2.unwrap());
64 }
65 #[test]
66 fn it_generates_consistent_results_txt() {
67 let mut mock_file1 = String::from("./mock/mock.txt");
68 let mut mock_file2 = String::from("./mock/mock.txt");
69 let result1 = filehash(&mut mock_file1);
70 let result2 = filehash(&mut mock_file2);
71 assert_eq!(result1.unwrap(), result2.unwrap());
72 }
73 #[test]
74 fn it_generates_consistent_results_json() {
75 let mut mock_file1 = String::from("./mock/mock.json");
76 let mut mock_file2 = String::from("./mock/mock.json");
77 let result1 = filehash(&mut mock_file1);
78 let result2 = filehash(&mut mock_file2);
79 assert_eq!(result1.unwrap(), result2.unwrap());
80 }
81}