Seperate determination of user config file path from reading it. This simplifys the logic inside load as the config file which should be read is determined in an extra funtion. Additionaly removed the read metadata value, because it was not used anyways.
Y6EBNUOTVJTMMQJNFZZ65LHHHR43YBUS4SHZOZB6Y7CLYNDA2HMQC
4RV7T4SRYIQLBW3EZFWBO5G65QAVG2GHPI4KMDDZERCX65KQWSPQC
JTELS6L36GEOOST2SUNCJIK5TBJDNLQWCF4IRF7QSHMMVCXSSESAC
H72JG6HLA7U3XFOUMWF6F3NFSWK5B6ZM6J5ZTILRSXBA7IM6H75AC
SXEYMYF7P4RZMZ46WPL4IZUTSQ2ATBWYZX7QNVMS3SGOYXYOHAGQC
CB7UPUQFOUH6M32KXQZL25EV4IH3XSK56RG3OYNRZBBFEABSNCXQC
EEBKW7VTILH6AGGV57ZIJ3DJGYHDSYBWGU3C7Q4WWAKSVNUGIYMQC
BZSC7VMYSFRXDHDDAMCDR6X67FN5VWIBOSE76BQLX7OCVOJFUA3AC
A3RM526Y7LUXNYW4TL56YKQ5GVOK2R5D7JJVTSQ6TT5MEXIR6YAAC
IUGP6ZGBFLDRAKJOHFQNG67LZBDXUJ4QM25GOY3QT6GER3NVTHXQC
CCLLB7OIFNFYJZTG3UCI7536TOCWSCSXR67VELSB466R24WLJSDAC
FVQYZQFL7WHSC3UUPJ4IWTP7SKTDQ4K6K5HY4EDK3JKXG3CQNZEAC
SLJ3OHD4F6GJGZ3SV2D7DMR3PXYHPSI64X77KZ3RJ24EGEX6ZNQAC
I24UEJQLCH2SOXA4UHIYWTRDCHSOPU7AFTRUOTX7HZIAV4AZKYEQC
TFPETWTVADLG2DL7WERHJPGMJVOY4WOKCRWB3NZ3YOOQ4CVAUHBAC
U6TQX5Z2NF6GX3SRLUBQGCZ7WAXNYMWWZ2YMADUSG4EWVKNV2BIAC
GLRGFBCWZYQEP6BG2IXYMXVZ5ETPWKNA2YJSIRHBCAAOAHJYT2YQC
5BB266P6HPUGYEVR7QNNOA62EFPYPUYJ3UMLE5J3LLYMSUWXANIQC
}
}
/// Get path to the user config file
///
/// additionaly as fallback evaluate $HOME/.pijulconfig
fn user_config_file_path() -> Option<PathBuf> {
let mut config_dir = global_config_dir()?;
config_dir.push(CONFIG_FILE_NAME);
if config_dir.exists() {
return Some(config_dir);
}
// Read from `$HOME/.pijulconfig`
let mut config_dir = dirs_next::home_dir()?;
config_dir.push(GLOBAL_CONFIG_DIR);
config_dir.push(CONFIG_FILE_NAME);
if config_dir.exists() {
return Some(config_dir);
pub fn load() -> Result<(Global, u64), anyhow::Error> {
if let Some(mut dir) = global_config_dir() {
dir.push("config.toml");
let (s, meta) = std::fs::read(&dir)
.and_then(|x| Ok((x, std::fs::metadata(&dir)?)))
.or_else(|e| {
// Read from `$HOME/.config/pijul` dir
if let Some(mut dir) = dirs_next::home_dir() {
dir.push(".config");
dir.push(CONFIG_DIR);
dir.push("config.toml");
std::fs::read(&dir).and_then(|x| Ok((x, std::fs::metadata(&dir)?)))
} else {
Err(e.into())
}
})
.or_else(|e| {
// Read from `$HOME/.pijulconfig`
if let Some(mut dir) = dirs_next::home_dir() {
dir.push(GLOBAL_CONFIG_DIR);
std::fs::read(&dir).and_then(|x| Ok((x, std::fs::metadata(&dir)?)))
} else {
Err(e.into())
}
})?;
debug!("s = {:?}", s);
if let Ok(t) = toml::from_slice(&s) {
let ts = meta
.modified()?
.duration_since(std::time::SystemTime::UNIX_EPOCH)
.unwrap()
.as_secs();
Ok((t, ts))
} else {
bail!("Could not read configuration file at {:?}", dir)
}
pub fn load() -> Result<Global, anyhow::Error> {
let config_file = user_config_file_path();
let config_content = if let Some(config_file) = &config_file {
std::fs::read(&config_file)?
};
debug!("s = {:?}", config_content);
let toml_parsed: Result<Global, _> = toml::from_slice(&config_content);
match toml_parsed {
Ok(global) => Ok(global),
Err(e) => {
let mut stderr = std::io::stderr();
writeln!(
stderr,
"Error during reading the configuration file at {}",
config_file.as_ref().unwrap().display()
)?;
writeln!(stderr, "Toml parsing error: {}", e)?;
bail!("Could not read configuration file at {:?}", &config_file)
}