diff --git a/Cargo.toml b/Cargo.toml index 21d75145..992d8ac8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [workspace] -resolver = "2" +resolver = "3" [workspace.package] repository = "https://github.com/rust-cli/config-rs" license = "MIT OR Apache-2.0" -edition = "2018" -rust-version = "1.76.0" # MSRV +edition = "2024" +rust-version = "1.85.0" # MSRV include = [ "build.rs", "src/**/*", diff --git a/examples/async_source/main.rs b/examples/async_source/main.rs index ff76013c..9964b730 100644 --- a/examples/async_source/main.rs +++ b/examples/async_source/main.rs @@ -2,9 +2,9 @@ use std::{error::Error, fmt::Debug}; use async_trait::async_trait; use config::{ - builder::AsyncState, AsyncSource, ConfigBuilder, ConfigError, FileFormat, Format, Map, + AsyncSource, ConfigBuilder, ConfigError, FileFormat, Format, Map, builder::AsyncState, }; -use futures::{select, FutureExt}; +use futures::{FutureExt, select}; use warp::Filter; // Example below presents sample configuration server and client. diff --git a/examples/custom_file_format/main.rs b/examples/custom_file_format/main.rs index 1d6b30f9..2650664b 100644 --- a/examples/custom_file_format/main.rs +++ b/examples/custom_file_format/main.rs @@ -52,7 +52,7 @@ impl Format for PemFile { return Err(Box::new(Error::new( ErrorKind::InvalidData, "PEM file did not contain a Private or Public key", - ))) + ))); } }; diff --git a/examples/env-list/main.rs b/examples/env-list/main.rs index 8fc7f9fa..e7968ca2 100644 --- a/examples/env-list/main.rs +++ b/examples/env-list/main.rs @@ -1,11 +1,12 @@ use config::Config; + #[derive(Debug, Default, serde::Deserialize, PartialEq, Eq)] struct AppConfig { list: Vec, } fn main() { - std::env::set_var("APP_LIST", "Hello World"); + // e.g. set `APP_LIST="Hello World" let config = Config::builder() .add_source( @@ -20,6 +21,4 @@ fn main() { let app: AppConfig = config.try_deserialize().unwrap(); assert_eq!(app.list, vec![String::from("Hello"), String::from("World")]); - - std::env::remove_var("APP_LIST"); } diff --git a/examples/watch/main.rs b/examples/watch/main.rs index 69200a10..6b2cce33 100644 --- a/examples/watch/main.rs +++ b/examples/watch/main.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; use std::path::Path; -use std::sync::mpsc::channel; use std::sync::OnceLock; use std::sync::RwLock; +use std::sync::mpsc::channel; use std::time::Duration; use config::{Config, File}; diff --git a/src/de.rs b/src/de.rs index 85fe2f18..bc46d34d 100644 --- a/src/de.rs +++ b/src/de.rs @@ -243,7 +243,7 @@ impl<'de> de::MapAccess<'de> for MapAccess { where K: de::DeserializeSeed<'de>, { - if let Some((ref key_s, _)) = self.elements.front() { + if let Some((key_s, _)) = self.elements.front() { let key_de = Value::new(None, key_s as &str); let key = de::DeserializeSeed::deserialize(seed, key_de)?; diff --git a/src/env.rs b/src/env.rs index 03ca997d..c647da30 100644 --- a/src/env.rs +++ b/src/env.rs @@ -4,11 +4,11 @@ use std::ffi::OsString; #[cfg(feature = "convert-case")] use convert_case::{Case, Casing}; +use crate::ConfigError; use crate::error::Result; use crate::map::Map; use crate::source::Source; use crate::value::{Value, ValueKind}; -use crate::ConfigError; /// An environment source collects a dictionary of environment variables values into a hierarchical /// config Value type. We have to be aware how the config tree is created from the environment diff --git a/src/file/format/corn.rs b/src/file/format/corn.rs index f188df16..0fd7e728 100644 --- a/src/file/format/corn.rs +++ b/src/file/format/corn.rs @@ -1,5 +1,5 @@ -use crate::value::{Value, ValueKind}; -use crate::{format, Map}; +use crate::value::{Value, ValueKind}; +use crate::{Map, format}; use std::error::Error; pub(crate) fn parse( diff --git a/src/file/format/mod.rs b/src/file/format/mod.rs index bb3df49d..4035c6f7 100644 --- a/src/file/format/mod.rs +++ b/src/file/format/mod.rs @@ -1,7 +1,7 @@ use std::error::Error; use crate::map::Map; -use crate::{file::FileStoredFormat, value::Value, Format}; +use crate::{Format, file::FileStoredFormat, value::Value}; #[cfg(feature = "toml")] mod toml; diff --git a/src/file/mod.rs b/src/file/mod.rs index 72e0a361..4a33cee7 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -5,11 +5,11 @@ use std::fmt::Debug; use std::path::{Path, PathBuf}; use self::source::FileSource; +use crate::Format; use crate::error::{ConfigError, Result}; use crate::map::Map; use crate::source::Source; use crate::value::Value; -use crate::Format; pub use self::format::FileFormat; pub use self::source::file::FileSourceFile; diff --git a/src/file/source/file.rs b/src/file/source/file.rs index d80c6ef6..e60fc521 100644 --- a/src/file/source/file.rs +++ b/src/file/source/file.rs @@ -4,7 +4,7 @@ use std::fs; use std::io; use std::path::PathBuf; -use crate::file::{source::FileSourceResult, FileFormat, FileSource, FileStoredFormat, Format}; +use crate::file::{FileFormat, FileSource, FileStoredFormat, Format, source::FileSourceResult}; /// Describes a file sourced from a file #[derive(Clone, Debug)] diff --git a/src/file/source/mod.rs b/src/file/source/mod.rs index 7abc7351..d79ad993 100644 --- a/src/file/source/mod.rs +++ b/src/file/source/mod.rs @@ -4,7 +4,7 @@ pub(crate) mod string; use std::error::Error; use std::fmt::Debug; -use crate::{file::FileStoredFormat, Format}; +use crate::{Format, file::FileStoredFormat}; /// Describes where the [`File`][super::File] is sourced pub trait FileSource: Debug + Clone diff --git a/src/file/source/string.rs b/src/file/source/string.rs index 89300d4a..96d2e90a 100644 --- a/src/file/source/string.rs +++ b/src/file/source/string.rs @@ -1,9 +1,9 @@ use std::error::Error; use crate::{ + Format, file::source::FileSourceResult, file::{FileSource, FileStoredFormat}, - Format, }; /// Describes a file sourced from a string diff --git a/src/ser.rs b/src/ser.rs index 211717a5..56d0b0d2 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -3,9 +3,9 @@ use std::fmt::Write as _; use serde_core::ser; +use crate::Config; use crate::error::{ConfigError, Result}; use crate::value::{Value, ValueKind}; -use crate::Config; #[derive(Default, Debug)] pub(crate) struct ConfigSerializer { @@ -276,7 +276,7 @@ impl ser::SerializeSeq for SeqSerializer<'_> { _ => { return Err(ConfigError::Message( "config-rs internal error (ser._element but last not Seq!".to_owned(), - )) + )); } }; Ok(()) diff --git a/tests/testsuite/errors.rs b/tests/testsuite/errors.rs index e8a1dbdf..9fc1e4bd 100644 --- a/tests/testsuite/errors.rs +++ b/tests/testsuite/errors.rs @@ -82,7 +82,7 @@ fn test_root_not_table() { "invalid type: boolean `false`, expected a map", format!("{cause}") ), - _ => panic!("Wrong error: {:?}", e), + _ => panic!("Wrong error: {e:?}"), } } @@ -304,7 +304,12 @@ fn test_value_deserialize_enum() { let array_v: Value = vec![100, 100].into(); let array_d = array_v.try_deserialize::(); - assert_data_eq!(array_d.unwrap_err().to_string(), str!["value of enum Diode should be represented by either string or table with exactly one key"]); + assert_data_eq!( + array_d.unwrap_err().to_string(), + str![ + "value of enum Diode should be represented by either string or table with exactly one key" + ] + ); let confused_v: Value = [ ("Brightness".to_owned(), 100.into()), @@ -315,7 +320,12 @@ fn test_value_deserialize_enum() { .collect::>() .into(); let confused_d = confused_v.try_deserialize::(); - assert_data_eq!(confused_d.unwrap_err().to_string(), str!["value of enum Diode should be represented by either string or table with exactly one key"]); + assert_data_eq!( + confused_d.unwrap_err().to_string(), + str![ + "value of enum Diode should be represented by either string or table with exactly one key" + ] + ); } #[test] @@ -359,7 +369,7 @@ fn test_deserialize_invalid_type() { { assert_eq!(path, "place.name"); } else { - panic!("Wrong error {:?}", e); + panic!("Wrong error {e:?}"); } } @@ -400,7 +410,7 @@ fn test_deserialize_invalid_type_file() { { assert_eq!(path, "place.name"); } else { - panic!("Wrong error {:?}", e); + panic!("Wrong error {e:?}"); } } diff --git a/tests/testsuite/file_corn.rs b/tests/testsuite/file_corn.rs index a7488a8c..194ac34f 100644 --- a/tests/testsuite/file_corn.rs +++ b/tests/testsuite/file_corn.rs @@ -139,7 +139,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -205,7 +208,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -253,7 +259,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -283,7 +292,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_ini.rs b/tests/testsuite/file_ini.rs index 59cf2b1b..00099f81 100644 --- a/tests/testsuite/file_ini.rs +++ b/tests/testsuite/file_ini.rs @@ -93,7 +93,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -148,7 +151,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -186,7 +192,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -214,7 +223,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_json.rs b/tests/testsuite/file_json.rs index 90a1483d..3a71681f 100644 --- a/tests/testsuite/file_json.rs +++ b/tests/testsuite/file_json.rs @@ -132,7 +132,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -199,7 +202,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -247,7 +253,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -277,7 +286,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_json5.rs b/tests/testsuite/file_json5.rs index b199c390..bcb53552 100644 --- a/tests/testsuite/file_json5.rs +++ b/tests/testsuite/file_json5.rs @@ -140,7 +140,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -207,7 +210,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -256,7 +262,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -286,7 +295,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_ron.rs b/tests/testsuite/file_ron.rs index e6376f40..fa791167 100644 --- a/tests/testsuite/file_ron.rs +++ b/tests/testsuite/file_ron.rs @@ -135,7 +135,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -202,7 +205,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -251,7 +257,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -281,7 +290,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_toml.rs b/tests/testsuite/file_toml.rs index 70835c64..7a78c08a 100644 --- a/tests/testsuite/file_toml.rs +++ b/tests/testsuite/file_toml.rs @@ -182,7 +182,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -286,7 +289,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -372,7 +378,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -400,7 +409,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( diff --git a/tests/testsuite/file_yaml.rs b/tests/testsuite/file_yaml.rs index caed24fa..19e45902 100644 --- a/tests/testsuite/file_yaml.rs +++ b/tests/testsuite/file_yaml.rs @@ -168,7 +168,10 @@ fn test_override_uppercase_value_for_struct() { FOO: String, } - std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APP_FOO", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -231,7 +234,10 @@ fn test_override_lowercase_value_for_struct() { bar: String, } - std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("config_foo", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -275,7 +281,10 @@ fn test_override_uppercase_value_for_enums() { Bar(String), } - std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + // SAFETY: pure rust + unsafe { + std::env::set_var("APPS_BAR", "I HAVE BEEN OVERRIDDEN_WITH_UPPER_CASE"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -303,7 +312,10 @@ fn test_override_lowercase_value_for_enums() { Bar(String), } - std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + // SAFETY: pure rust + unsafe { + std::env::set_var("test_bar", "I have been overridden_with_lower_case"); + } let cfg = Config::builder() .add_source(File::from_str( @@ -358,7 +370,9 @@ inner_vec: assert!(result.is_err()); assert_data_eq!( result.unwrap_err().to_string(), - str!["Cannot parse Array([Integer(1), Integer(2)]) because it is an unsupported hash key type"] + str![ + "Cannot parse Array([Integer(1), Integer(2)]) because it is an unsupported hash key type" + ] ); } diff --git a/tests/testsuite/merge.rs b/tests/testsuite/merge.rs index d2b8f935..986a5572 100644 --- a/tests/testsuite/merge.rs +++ b/tests/testsuite/merge.rs @@ -366,6 +366,8 @@ Settings { let res = cfg.try_deserialize::(); assert_data_eq!( res.unwrap_err().to_string(), - str!["invalid type: integer `42`, expected struct Profile for key `profile.int_to_non_empty`"] + str![ + "invalid type: integer `42`, expected struct Profile for key `profile.int_to_non_empty`" + ] ); } diff --git a/tests/testsuite/weird_keys.rs b/tests/testsuite/weird_keys.rs index ad2a49c6..df81e1d7 100644 --- a/tests/testsuite/weird_keys.rs +++ b/tests/testsuite/weird_keys.rs @@ -16,10 +16,10 @@ where .add_source(File::from_str(config, format)) .build(); - assert!(cfg.is_ok(), "Config could not be built: {:?}", cfg); + assert!(cfg.is_ok(), "Config could not be built: {cfg:?}"); let cfg = cfg.unwrap().try_deserialize(); - assert!(cfg.is_ok(), "Config could not be transformed: {:?}", cfg); + assert!(cfg.is_ok(), "Config could not be transformed: {cfg:?}"); let cfg: T = cfg.unwrap(); cfg }