filehash_rs/
lib.rs

1use std::{
2    collections::hash_map::DefaultHasher,
3    fs::File,
4    hash::{Hash, Hasher},
5    io::{Error, Read},
6    path::Path,
7};
8
9/// ```rust
10/// // A simple example of a program that queries the user
11/// // for a file to hash and prints the result.
12/// # use std::error::Error;
13/// # use filehash_rs::filehash;
14/// fn main() -> Result<(), Box<dyn Error>> {
15///    let mut input_string = String::new();
16///    println!("Path to the file:");
17///
18///    std::io::stdin().read_line(&mut input_string)?;
19/// #  input_string = String::from("./mock/mock.txt");
20///
21///    let result = filehash(&mut input_string);
22///
23///    match result {
24///        Ok(value) => {
25///            println!("{}", value);
26///            return Ok(());
27///        }
28///        Err(err) => {
29///            println!("Error: {}", err);
30///            return Err(Box::new(err));
31///        }
32///    }
33/// }
34/// ```
35
36pub 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}