All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Please note that we had to update the MSRV for this crate from 1.56.0 to 1.59.0 for this patch release being possible, because a transitive dependency did update its MSRV.
- Backport of commit d54986c54091e4620c199d3dfadde80b82958bb3 from #362 for using float_cmp for testing floats
- Backport of #379 adding
Clone
trait derive to builder states
- Backport of #316 to be testing with temp_env. The backport was necessary to be able to backport the next change. This change shouldn't be user-visible.
- Backport of #353 to use TryInto for more permissive deserialization of integers
- Backport of commit 518a3cafa1e62ba7405709e5c508247e328e0a18 from #362 to fix tests
- Prefix-Seperator support was added #292
- Environment lists can now be parsed #255
- Setting an overwrite from an Option was added #303
- Option to keep the prefix from an environment variable was added #298
- Some small doc/CI fixes #307, #309
- MSRV was updated to 1.56.0 #304
- Dependencies were updated #289, #301
- A new ConfigBuilder interface for building configuration objects #196
- Asynchronous sources #207
- Custom ENV separators are now supported #185
- Loads of dependency updates and bugfixes of course
- Preserved map order #217
- Support for parsing numbers from the environment #137
- Support for unsigned integers #178
Format
trait for (custom) file formats #219
Environment::new()
- see #235- Large parts of the
Config
interface - see #196Config::merge()
Config::with_merged()
Config::refresh()
Config::set_default()
Config::set()
Config::set_once()
Config::deserialize()
- The
Config
type got a builder-patternwith_merged()
method #166. - A
Config::set_once()
function was added, to set an value that can be overwritten byConfig::merge
ing another configuration #172 - serde_hjson is, if enabled, pulled in without default features. This is due to a bug in serde_hjson, see #169 for more information.
- Testing is done on github actions #175
- Allow enums as configuration keys #119
- Remove lowercasing of keys (unless the key is coming from an environment variable).
- Update nom to 5.x
- Support deserializing to a struct with
#[serde(default)]
#106
- Support reading
enum
s from configuration. #85 - Improvements to error path (attempting to propagate path). #89
- Fix UB in monomorphic expansion. We weren't re-exporting dependent types. #91
- Allow Environment variable collection to ignore empty values. #78
// Empty env variables will not be collected Environment::with_prefix("APP").ignore_empty(true)
-
Breaking Change: Environment does not declare a separator by default.
// 0.8.0 Environment::with_prefix("APP") // 0.9.0 Environment::with_prefix("APP").separator("_")
-
Add support for INI. #72
-
Add support for newtype structs. #71
-
Fix bug with array set by path. #69
-
Update to nom 4. #63
- Update lazy_static and yaml_rust
- Be compatible with nom's verbose_errors feature (#50)[rust-cli#50]
- Add
derive(PartialEq)
for Value (#54)[rust-cli#54]
- Fix conflict with
serde_yaml
. #39
-
Implement
Source
forConfig
. -
Implement
serde::de::Deserializer
forConfig
.my_config.deserialize
may now be called as eitherDeserialize::deserialize(my_config)
ormy_config.try_into()
. -
Remove
ConfigResult
. The builder pattern requires either.try_into
as the final step or the initialConfig::new()
to be bound to a slot. Errors must also be handled on each call instead of at the end of the chain.let mut c = Config::new(); c .merge(File::with_name("Settings")).unwrap() .merge(Environment::with_prefix("APP")).unwrap();
let c = Config::new() .merge(File::with_name("Settings")).unwrap() .merge(Environment::with_prefix("APP")).unwrap() // LLVM should be smart enough to remove the actual clone operation // as you are cloning a temporary that is dropped at the same time .clone();
let mut s: Settings = Config::new() .merge(File::with_name("Settings")).unwrap() .merge(Environment::with_prefix("APP")).unwrap() .try_into();
-
Implement
Source
forVec<T: Source>
andVec<Box<Source>>
Config::new() .merge(vec![ File::with_name("config/default"), File::with_name(&format!("config/{}", run_mode)), ])
-
Implement
From<&Path>
andFrom<PathBuf>
forFile
-
Remove
namespace
option for File -
Add builder pattern to condense configuration
Config::new() .merge(File::with_name("Settings")) .merge(Environment::with_prefix("APP")) .unwrap()
-
Parsing errors even for non required files – @Anthony25 ( #33 )
- Added config category to Cargo.toml
config.get
has been changed to take a type parameter and to deserialize into that type using serde. Old behavior (get a value variant) can be used by passingconfig::Value
as the type parameter:my_config.get::<config::Value>("..")
. Some great help here from @impowski in #25.- Propagate parse and type errors through the deep merge (remembering filename, line, etc.)
- Remove directory traversal on
File
. This is likely temporary. I do want this behavior but I can see how it should be optional. See #35 - Add
File::with_name
to get automatic file format detection instead of manualFileFormat::*
– @JordiPolo - Case normalization #26
- Remove many possible panics #8
my_config.refresh()
will do a full re-read from the source so live configuration is possible with some work to watch the file
-
Remove global (
config::get
) API — It's now required to create a local configuration instance withconfig::Config::new()
first.If you'd like to have a global configuration instance, use
lazy_static!
as follows:use std::sync::RwLock; use config::Config; lazy_static! { static ref CONFIG: RwLock<Config> = Default::default(); }
- YAML from @tmccombs
- Nested field retrieval
- Deep merging of sources (was shallow)
config::File::from_str
to parse and merge a file from a string- Support for retrieval of maps and slices —
config::get_table
andconfig::get_array
Initial release.