docker_puzzles/
fs_handler.rs1use 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}