docker_puzzles/
fs_handler.rs

1use std::error::Error;
2use std::fs;
3use std::path::{Path, PathBuf};
4use walkdir::WalkDir;
5
6pub fn collect_files(path: &str, file_name: &str) -> Result<Vec<PathBuf>, Box<dyn Error>> {
7    let mut file_paths = Vec::new();
8    for entry in WalkDir::new(path) {
9        let entry_path = entry?.into_path();
10        if let Some(actual_file_name) = entry_path.file_name() {
11            if actual_file_name.to_str().unwrap() == file_name {
12                file_paths.push(entry_path.clone());
13            }
14        }
15    }
16    Ok(file_paths)
17}
18
19pub fn read_file(path: &Path) -> Result<String, Box<dyn Error>> {
20    Ok(fs::read_to_string(path)?)
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn it_collects_all_files() {
29        let file_paths = collect_files("./assets", "Puzzlefile").unwrap();
30        assert_eq!(2, file_paths.len());
31        assert_eq!(
32            "./assets/a/Puzzlefile",
33            file_paths.get(0).unwrap().to_str().unwrap()
34        );
35        assert_eq!(
36            "./assets/b/Puzzlefile",
37            file_paths.get(1).unwrap().to_str().unwrap()
38        );
39    }
40
41    #[test]
42    fn it_returns_error_when_called_on_missing_directory() {
43        let error = collect_files("./non-existent-dir", "Puzzlefile").expect_err("Error expected");
44        assert_eq!(
45            "IO error for operation on ./non-existent-dir: No such file or directory (os error 2)",
46            error.to_string()
47        );
48    }
49
50    #[test]
51    fn it_reads_a_file() {
52        let contents = read_file(&Path::new("./assets/Puzzles.yml")).unwrap();
53        assert_eq!(
54            "echos:\n    RUN echo \'a\' \\\n        && echo \'b\'\n",
55            contents
56        );
57    }
58
59    #[test]
60    fn it_returns_error_when_called_on_missing_file() {
61        let error = read_file(&Path::new("./non-existent-file")).expect_err("Error expected");
62        assert_eq!("No such file or directory (os error 2)", error.to_string());
63    }
64}