diff --git a/Cargo.toml b/Cargo.toml index 9584f4b..0868168 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "confy" -version = "1.0.0" +version = "2.0.0" authors = ["Katharina Fey "] description = "Boilerplate-free configuration management" license = "MIT/X11 OR Apache-2.0" @@ -11,12 +11,12 @@ edition = "2024" [dependencies] ron = { version = "0.10.1", optional = true } -directories = "6" +etcetera = "0.10.0" serde = "^1.0" serde_yaml = { version = "0.9", optional = true } thiserror = "2.0" basic-toml = { version = "0.1.10", optional = true } -toml = { version = "0.8", optional = true } +toml = { version = "0.9", optional = true } [features] default = ["toml_conf"] diff --git a/examples/simple.rs b/examples/simple.rs index 1e8f9cf..8cae819 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -41,7 +41,7 @@ fn main() -> Result<(), confy::ConfyError> { name: "Test".to_string(), ..cfg }; - confy::store("confy_simple_app",None, &cfg)?; + confy::store("confy_simple_app", None, &cfg)?; println!("The updated toml file content is:"); let mut content = String::new(); std::fs::File::open(&file) @@ -53,7 +53,6 @@ fn main() -> Result<(), confy::ConfyError> { name: "Test".to_string(), ..cfg }; - std::fs::remove_dir_all(file.parent().unwrap()) - .expect("Failed to remove directory"); + std::fs::remove_dir_all(file.parent().unwrap()).expect("Failed to remove directory"); Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index a34d4f0..5de8abd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -73,9 +73,9 @@ //! //! ### Tip //! to add this crate to your project with the default, toml config do the following: `cargo add confy`, otherwise do something like: `cargo add confy --no-default-features --features yaml_conf`, for more info, see [cargo docs on features] -//! +//! //! [cargo docs on features]: https://docs.rust-lang.org/cargo/reference/resolver.html#features -//! +//! //! feature | file format | description //! ------- | ----------- | ----------- //! **default**: `toml_conf` | [toml] | considered a reasonable default, uses the standard-compliant [`toml` crate] @@ -94,8 +94,8 @@ mod utils; use utils::*; -use directories::ProjectDirs; -use serde::{de::DeserializeOwned, Serialize}; +use etcetera::{AppStrategy, AppStrategyArgs, app_strategy::choose_app_strategy}; +use serde::{Serialize, de::DeserializeOwned}; use std::fs::{self, File, OpenOptions, Permissions}; use std::io::{ErrorKind::NotFound, Write}; use std::path::{Path, PathBuf}; @@ -109,8 +109,8 @@ use toml::{ #[cfg(feature = "basic_toml_conf")] use basic_toml::{ - from_str as toml_from_str, to_string as toml_to_string_pretty, Error as TomlDeErr, - Error as TomlSerErr, + Error as TomlDeErr, Error as TomlSerErr, from_str as toml_from_str, + to_string as toml_to_string_pretty, }; #[cfg(not(any( @@ -469,23 +469,26 @@ pub fn get_configuration_file_path<'a>( config_name: impl Into>, ) -> Result { let config_name = config_name.into().unwrap_or("default-config"); - let project = ProjectDirs::from("rs", "", app_name).ok_or_else(|| { - ConfyError::BadConfigDirectory("could not determine home directory path".to_string()) + let project = choose_app_strategy(AppStrategyArgs { + top_level_domain: "rs".to_string(), + author: "".to_string(), + app_name: app_name.to_string(), + }) + .map_err(|e| { + ConfyError::BadConfigDirectory(format!("could not determine home directory path: {e}")) })?; let config_dir_str = get_configuration_directory_str(&project)?; - let path = [config_dir_str, &format!("{config_name}.{EXTENSION}")] + let path = [config_dir_str, format!("{config_name}.{EXTENSION}")] .iter() .collect(); Ok(path) } -fn get_configuration_directory_str(project: &ProjectDirs) -> Result<&str, ConfyError> { - let path = project.config_dir(); - path.to_str() - .ok_or_else(|| ConfyError::BadConfigDirectory(format!("{path:?} is not valid Unicode"))) +fn get_configuration_directory_str(project: &impl AppStrategy) -> Result { + Ok(project.config_dir().display().to_string()) } #[cfg(test)] @@ -601,10 +604,12 @@ mod tests { store_path_perms(path, &config, permissions).expect("store_path_perms failed"); - assert!(fs::metadata(path) - .expect("reading metadata failed") - .permissions() - .readonly()); + assert!( + fs::metadata(path) + .expect("reading metadata failed") + .permissions() + .readonly() + ); }) }