use std::env::current_exe;
use super::*;
pub fn find_directory(start: &Path, name: &str) -> Result<PathBuf> {
let normed = ensure_file(start, name)?;
let mut here = normed.as_path();
while let Some(dir) = here.parent() {
let path = here.join(name);
if path.exists() {
return match path.is_dir() {
true => Ok(path),
false => Err(Error::from_raw_os_error(22)),
};
} else {
here = dir;
}
}
Err(Error::from_raw_os_error(20))
}
pub fn find_directory_or_create(start: &Path, name: &str) -> Result<PathBuf> {
match find_directory(start, name) {
Ok(o) => return Ok(o),
Err(_) => {}
}
let dir = ensure_directory(start)?.join(name);
create_dir_all(&dir)?;
Ok(dir)
}
pub fn this_directory() -> Result<PathBuf> {
match current_exe()?.canonicalize()?.parent() {
Some(s) => { Ok(s.to_path_buf()) }
None => { Err(Error::from_raw_os_error(10006)) }
}
}