diff --git a/src/settings/manager.rs b/src/settings/manager.rs index d161a825..844389e0 100644 --- a/src/settings/manager.rs +++ b/src/settings/manager.rs @@ -1,4 +1,4 @@ -use anyhow::{Error, Result}; +use anyhow::{anyhow, Error, Result}; use directories::ProjectDirs; use serde::{Deserialize, Serialize}; use std::io::prelude::*; @@ -86,6 +86,10 @@ impl Manager { config, }; + create_directories(&settings.file_name).unwrap_or_else(|error| { + error!("Failed to create parent directories for {file_name:?}. Reason: {error:#?}"); + }); + save_settings_to_file(&settings.file_name, &settings.config).unwrap_or_else(|error| { error!("Failed to save file {file_name:?}. Reason: {error:#?}"); }); @@ -121,11 +125,22 @@ fn load_settings_from_file(file_name: &str) -> SettingsStruct { .map_err(Error::msg) .and_then(|value| serde_json::from_str(&value).map_err(Error::msg)) .unwrap_or_else(|error| { - error!("Failed to load settings file {file_name:?}. Reason: {error}"); + warn!("Failed to load settings file {file_name:?}. Reason: {error}"); fallback_settings_with_backup_file(file_name) }) } +fn create_directories(file_name: &str) -> Result<()> { + let path = Path::new(&file_name); + if let Some(parent) = path.parent() { + if let Err(error) = std::fs::create_dir_all(parent) { + return Err(anyhow!("Error creating directories: {error:#?}")); + } + } + + Ok(()) +} + fn save_settings_to_file(file_name: &str, content: &SettingsStruct) -> Result<()> { let json = serde_json::to_string_pretty(content)?;