diskann_benchmark_runner/
files.rs1use std::path::{Path, PathBuf};
7
8use serde::{Deserialize, Serialize};
9
10use super::Checker;
11
12#[derive(Debug, Serialize, Deserialize, Clone)]
25#[serde(transparent)]
26pub struct InputFile {
27 path: PathBuf,
28}
29
30impl InputFile {
31 pub fn new<P>(path: P) -> Self
33 where
34 PathBuf: From<P>,
35 {
36 Self {
37 path: PathBuf::from(path),
38 }
39 }
40
41 pub fn resolve(&mut self, checker: &mut Checker) -> anyhow::Result<()> {
47 let checked_path = checker.find_input_file(self);
48 match checked_path {
49 Ok(p) => {
50 self.path = p;
51 Ok(())
52 }
53 Err(e) => Err(e),
54 }
55 }
56}
57
58impl std::ops::Deref for InputFile {
59 type Target = Path;
60 fn deref(&self) -> &Self::Target {
61 &self.path
62 }
63}
64
65impl std::fmt::Display for InputFile {
66 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67 write!(f, "{}", self.display())
68 }
69}
70
71#[cfg(test)]
76mod tests {
77 use std::fs::{create_dir, File};
78
79 use super::*;
80
81 #[test]
82 fn test_input_file() {
83 let file = InputFile::new("hello/world");
84 let file_deref: &Path = &file;
85 assert_eq!(file_deref.to_str().unwrap(), "hello/world");
86 }
87
88 #[test]
89 fn test_serialization() {
90 let st: &str = "\"path/to/directory\"";
91 let file: InputFile = serde_json::from_str(st).unwrap();
92 assert_eq!(file.to_str().unwrap(), st.trim_matches('\"'));
93
94 assert_eq!(&*serde_json::to_string(&file).unwrap(), st);
95 }
96
97 #[test]
98 fn test_resolve() {
99 let dir = tempfile::tempdir().unwrap();
110 let path = dir.path();
111
112 File::create(path.join("file_a.txt")).unwrap();
113 create_dir(path.join("dir0")).unwrap();
114 create_dir(path.join("dir1")).unwrap();
115 create_dir(path.join("dir1/dir0")).unwrap();
116 File::create(path.join("dir0/file_b.txt")).unwrap();
117 File::create(path.join("dir1/file_c.txt")).unwrap();
118 File::create(path.join("dir1/dir0/file_c.txt")).unwrap();
119
120 {
122 let absolute = path.join("file_a.txt");
123 let mut file = InputFile::new(absolute.clone());
124 let mut checker = Checker::new(Vec::new(), None);
125 file.resolve(&mut checker).unwrap();
126 assert_eq!(file.path, absolute);
127
128 let absolute = path.join("dir0/file_b.txt");
129 let mut file = InputFile::new(absolute.clone());
130 let mut checker = Checker::new(Vec::new(), None);
131 file.resolve(&mut checker).unwrap();
132 assert_eq!(file.path, absolute);
133 }
134
135 {
137 let absolute = path.join("dir0/file_c.txt");
138 let mut file = InputFile::new(absolute.clone());
139 let mut checker = Checker::new(Vec::new(), None);
140 let err = file.resolve(&mut checker).unwrap_err();
141 let message = err.to_string();
142 assert!(message.contains("input file with absolute path"));
143 assert!(message.contains("either does not exist or is not a file"));
144 }
145
146 {
148 let mut checker = Checker::new(
149 vec![path.join("dir1/dir0"), path.join("dir1"), path.join("dir0")],
150 None,
151 );
152
153 let mut file = InputFile::new("file_c.txt");
155 file.resolve(&mut checker).unwrap();
156 assert_eq!(file.path, path.join("dir1/dir0/file_c.txt"));
157
158 let mut file = InputFile::new("file_b.txt");
159 file.resolve(&mut checker).unwrap();
160 assert_eq!(file.path, path.join("dir0/file_b.txt"));
161
162 let mut file = InputFile::new("file_a.txt");
164 let err = file.resolve(&mut checker).unwrap_err();
165 let message = err.to_string();
166 assert!(message.contains("could not find input file"));
167 assert!(message.contains("in the search directories"));
168
169 let mut file = InputFile::new(path.join("file_c.txt"));
171 let err = file.resolve(&mut checker).unwrap_err();
172 let message = err.to_string();
173 assert!(message.starts_with("input file with absolute path"));
174 }
175 }
176}