diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..bb65739 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,38 @@ +use std::{env, fs, io}; + +use crate::Error; + +pub(crate) fn assure_config_dir_exists(dir: &str) -> Result { + let trdir = dir.trim(); + if trdir.is_empty() { + return Err(Error::DirectoryUnset); + } + + let expanded_config_dir = if trdir.as_bytes()[0] == b'~' { + match env::var("HOME") + .ok() + .or_else(|| env::var("UserProfile").ok()) + { + None => { + return Err(Error::HomeExpansionFailed(trdir.to_string())); + } + Some(mut user) => { + user.push_str(&trdir[1..]); + user + } + } + } else { + trdir.to_string() + }; + + if let Err(err) = fs::create_dir(&expanded_config_dir) { + if err.kind() != io::ErrorKind::AlreadyExists { + return Err(Error::DirectoryCreationFailed(( + expanded_config_dir, + Box::new(err), + ))); + } + } + + Ok(expanded_config_dir) +}