use std::borrow::Borrow;
fn main() -> std::io::Result<()> {
copy_config_to_home_dir();
Ok(())
}
fn copy_config_to_home_dir() {
let Ok(mut default_config_files) = std::env::current_dir() else {
eprintln!("Environment variable $PWD should be set. Couldn't find the source folder.");
return;
};
default_config_files.push("config_files/fm");
let config_folder_cow = tilde("~/.config");
let config_folder: &str = config_folder_cow.borrow();
let mut copy_options = fs_extra::dir::CopyOptions::new();
copy_options.skip_exist = true;
match fs_extra::dir::copy(default_config_files, config_folder, ©_options) {
Ok(_) => (),
Err(e) => eprintln!("{e:?}"),
}
}
fn home_dir() -> Option<std::path::PathBuf> {
std::env::var_os("HOME")
.and_then(|h| if h.is_empty() { None } else { Some(h) })
.map(std::path::PathBuf::from)
}
fn tilde(input_str: &str) -> std::borrow::Cow<'_, str> {
if let Some(input_after_tilde) = input_str.strip_prefix('~') {
if input_after_tilde.is_empty() || input_after_tilde.starts_with('/') {
if let Some(hd) = home_dir() {
let result = format!("{}{}", hd.display(), input_after_tilde);
result.into()
} else {
input_str.into()
}
} else {
input_str.into()
}
} else {
input_str.into()
}
}