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#[cfg(test)]
78mod tests {
79 use rstest::{fixture, rstest};
80 use std::env;
81
82 use super::*;
83
84 #[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 #[rstest]
125 fn test_validate_file_path_valid(current_file_name: Option<PathBuf>) {
126 assert!(validate_file_path(¤t_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}