expense_tracker/
path.rs

1use std::env::home_dir;
2use std::path::{Path, PathBuf};
3
4pub fn validate_file_path(arg_path: &Option<PathBuf>) -> Result<(), &'static str> {
5    if let Some(path) = arg_path {
6        if !path.exists() {
7            return Err("File not found!");
8        } else if !path.is_file() {
9            return Err("Not a file");
10        }
11    }
12
13    Ok(())
14}
15
16pub fn construct_file_path(path: &str) -> Result<PathBuf, &'static str> {
17    let input_path = Path::new(&path);
18
19    if input_path.is_relative() {
20        if input_path.starts_with("~/") {
21            let input_path_string = match input_path.to_str() {
22                Some(path) => &path[2..],
23                None => return Err("Invalid characters in path"),
24            };
25            let path_from_home_dir = Path::new(input_path_string);
26
27            if let Some(mut hdir) = home_dir() {
28                hdir.push(path_from_home_dir);
29                return Ok(hdir);
30            } else {
31                return Err("Error constructing home directory");
32            }
33        } else {
34            return Ok(input_path.to_path_buf());
35        }
36    }
37
38    Ok(input_path.to_path_buf())
39}
40
41// use std::fs::DirBuilder;
42// use std::process::exit;
43// pub fn _initiate_config_file() {
44//     let config_dir = match home_dir() {
45//         Some(home_dir) => {
46//             let config_dir: std::path::PathBuf = home_dir.join(Path::new("expense-tracker/"));
47//             if !config_dir.exists() {
48//                 DirBuilder::new()
49//                     .recursive(false)
50//                     .create(config_dir.as_path())
51//                     .unwrap_or_else(|err| {
52//                         eprintln!(
53//                             "Error creating directory at {}\nError: {}",
54//                             config_dir.display(),
55//                             err
56//                         );
57//                         exit(1)
58//                     });
59//             };
60//             config_dir
61//         }
62//         None => {
63//             eprint!("Home directory might have "); // TODO
64//             exit(1);
65//         }
66//     };
67
68//     let db_file = config_dir.join(Path::new("expense_db.psv"));
69
70//     if db_file.exists() {};
71
72//     // let y = Path::new(home_dir);
73
74//     // println!("{}", x.display());
75// }
76
77#[cfg(test)]
78mod tests {
79    use rstest::{fixture, rstest};
80    use std::env;
81
82    use super::*;
83
84    // #[should_panic]
85    #[fixture]
86    fn home_path() -> String {
87        #[cfg(target_os = "windows")]
88        let path = env::var("USERPROFILE").unwrap();
89
90        #[cfg(target_os = "linux")]
91        let path = env::var("HOME").unwrap();
92
93        #[cfg(target_os = "macos")]
94        let path = env::var("HOME").unwrap();
95
96        path
97    }
98
99    #[fixture]
100    fn current_file_name() -> Option<PathBuf> {
101        let arrgs: Vec<String> = env::args().collect();
102        Some(PathBuf::from(arrgs[0].to_owned()))
103    }
104
105    #[rstest]
106    fn test_construct_file_path(home_path: String) {
107        assert_eq!(
108            construct_file_path("filename.psv"),
109            Ok(PathBuf::from("filename.psv"))
110        );
111
112        assert_eq!(
113            construct_file_path("./filename.psv"),
114            Ok(PathBuf::from("./filename.psv"))
115        );
116
117        assert_eq!(
118            construct_file_path("~/filename.psv"),
119            Ok(PathBuf::from(home_path).join("filename.psv"))
120        );
121    }
122
123    // Testing validate_file_pat
124    #[rstest]
125    fn test_validate_file_path_valid(current_file_name: Option<PathBuf>) {
126        assert!(validate_file_path(&current_file_name).is_ok());
127    }
128
129    #[rstest]
130    fn test_validate_file_path_invalid_file(current_file_name: Option<PathBuf>) {
131        assert!(
132            validate_file_path(&Some(
133                current_file_name
134                    .unwrap()
135                    .as_path()
136                    .parent()
137                    .unwrap()
138                    .join("no_exists.txt")
139                    .to_path_buf()
140            ))
141            .is_err()
142        );
143    }
144
145    #[rstest]
146    fn test_validate_file_path_invalid_dir(current_file_name: Option<PathBuf>) {
147        assert!(
148            validate_file_path(&Some(
149                current_file_name
150                    .unwrap()
151                    .as_path()
152                    .parent()
153                    .unwrap()
154                    .to_path_buf()
155            ))
156            .is_err()
157        );
158    }
159}