config
Layered configuration system for Rust applications.
0.15.25
108M downloads/mo
#768 most downloaded on crates.io
rust-cli/config-rs
What this package is like to depend on
Last release 1 months ago
26 Jun 2026
Release timing varies
gaps range from 8 days to 4 months
Most releases are documented
notes for 49 of 57 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
57 releases · first in 2015
11 releases in the last 12 months
see the full history below
Release timeline
57 releases · Apr 2015 to Jun 2026Releases
latest 57-
0.15.2526 Jun 2026 -
0.15.2416 Jun 2026 -
0.15.2314 May 2026Release notes
Open source →Fixes
Environment::convert_case: correctly apply casing to each key segment
-
0.15.2217 Mar 2026 -
0.15.2112 Mar 2026 -
0.15.2012 Mar 2026 -
0.15.1912 Nov 2025 -
0.15.1830 Sep 2025 -
0.15.1724 Sep 2025 -
0.15.1615 Sep 2025 -
0.15.1529 Aug 2025 -
0.15.1412 Aug 2025 -
0.15.1309 Jul 2025 -
0.15.1208 Jul 2025 -
0.15.1112 Mar 2025 -
0.15.1012 Mar 2025Release notes
Open source →Features
- Deserialize YAML boolean keys as strings
Fixes
- Don't panic on non-string YAML keys
-
0.15.904 Mar 2025Release notes
Open source →Compatibility
- Upgrade to
yaml-rust20.10
Documentation
- Provided more jumping off points in the documentation
- Upgrade to
-
0.15.810 Feb 2025 -
0.15.730 Jan 2025 -
0.15.614 Jan 2025Release notes
Open source →Fixes
- Fix regression from 0.15.3 with reading a table from an empty config
-
0.15.510 Jan 2025Release notes
Open source →Fixes
- Include the
keyon all serde errors
Performance
- Don't clone when merging sources
- Include the
-
0.15.420 Dec 2024 -
0.15.319 Dec 2024 -
0.15.219 Dec 2024Release notes
Open source →Fixes
- Provide an error message on path parsing errors (regression from 0.15.0)
- Improve quality of path parsing error messages
-
0.15.119 Dec 2024Release notes
Open source →Fixes
- Don't crash on
get(arr[-1])on empty arrays - Don't crash on
set_override(arr[-1])on empty arrays
- Don't crash on
-
0.15.017 Dec 2024Release notes
Open source →Compatibility
ConfigErroris no longer exhaustiveConfigError::Parses type changedFileFormatis no longer exhaustive- Deprecated functions removed
- Case insensitivity from 0.14.0 was reverted
Fixes
- Struct fields, variants, and lookup paths with uppercase letters can be used again (regression from 0.14.0)
-
0.14.123 Oct 2024Release notes
Open source →Compatibility
- MSRV is now 1.75
Internal
- Remove dependency on
lazy_static - Update rust-ini from 0.19 to 0.20
- Switch from yaml-rust to yaml-rust2
-
0.14.001 Feb 2024Release notes
Open source →This is a maintenance release, mostly to get some dependency updates out, but also with some fixes and changes that have piled up over a rather long time.
Features
- #100 Fix #99: expose file::source::FileSource
- #318 Add Value::origin()
- #379 Add clone to builder state types
- #381 env: add a 'convert_case' field to ease dealing with kebab-case
- #402 Gate async-traits behind a feature
- #413 Attach key to type error generated from Config::get_<type>()
- #480 Hide and deprecate AsyncConfigBuilder
Fixes
- #306 fix: dot in config name
- #334 errors: clarify names of integer types
- #343 fix yaml to parse int keys
- #353 Use TryInto for more permissive deserialization for integers
- #354 Fix uppercase lowercase issues
- #374 Fix FIXME in de.rs and value.rs
- #395 Fix: Do not use deprecated function
- #429 Make the parse list key to lowercase when insert the keys
- #465 Fix nested arrays (by reworking array handling)
- #481 Fix docs warnings
Dependency updates
- #271 Update warp requirement from =0.3.1 to =0.3.2
- #316 test: Adopt test-env to fix random test failure
- #335 Update MSRV: 1.56.0 -> 1.56.1
- #350 Bump actions/checkout from 2.4.0 to 3.0.2
- #367 Update ron requirement from 0.7 to 0.8
- #373 Update notify (4.0.0 -> 5.0.0)
- #375 Update temp-env requirement from 0.2.0 to 0.3.0
- #378 Update warp requirement from =0.3.2 to =0.3.3
- #382 Bump actions/checkout from 3.0.2 to 3.1.0
- #389 Update MSRV: 1.56.1 -> 1.59.0
- #403 Bump actions/checkout from 3.1.0 to 3.2.0
- #411 Bump actions/checkout from 3.2.0 to 3.3.0
- #420 Update MSRV: 1.59.0 -> 1.60.0
- #421 Update toml requirement from 0.5 to 0.7
- #422 Update MSRV in cron workflow
- #425 Bump actions/checkout from 3.3.0 to 3.4.0
- #426 Update MSRV: 1.60.0 -> 1.64.0
- #427 Bump actions/checkout from 3.4.0 to 3.5.0
- #430 Update warp requirement from =0.3.3 to =0.3.4
- #433 Bump actions/checkout from 3.5.0 to 3.5.1
- #434 Bump actions/checkout from 3.5.1 to 3.5.2
- #436 Update warp requirement from =0.3.4 to =0.3.5
- #437 Update rust-ini requirement from 0.18 to 0.19
- #438 Update notify requirement from ^5.0.0 to ^6.0.0
- #440 Bump actions/checkout from 3.5.2 to 3.5.3
- #441 Update indexmap requirement from 1.7.0 to 2.0.0
- #451 Bump actions/checkout from 3.5.3 to 3.6.0
- #453 Bump actions/checkout from 3.6.0 to 4.0.0
- #455 MSRV: 1.64.0 -> 1.66.0
- #456 Update toml requirement from 0.7 to 0.8
- #458 Update MSRV in cron job
- #459 Bump actions/checkout from 4.0.0 to 4.1.0
- #462 Update warp requirement from =0.3.5 to =0.3.6
- #477 Bump actions/checkout from 4.1.0 to 4.1.1
- #483 Update MSRV: 1.66.0 -> 1.70.0
- #503 Bump actions/setup-python from 4 to 5
Misc
- #188 Add test for log::Level deserialization
- #274 move 'must_use' attribute to struct for 'builder' types
- #283 Add cron job
- #299 docs(builder): fix typo in doc comment
- #344 Fix clippy: Derive Eq as well
- #347 Fix clippy: use first() instead of get(0)
- #348 actions: Remove "minimal" setting, as workflow does not support this key
- #356 refactoring deserialize-any in config
- #359 Add test to deserialize unsigned int
- #360 Duplicate test for type conversion with unsigned int
- #362 Run clippy only on MSRV
- #363 Backport CHANGELOG entry for 0.13.2
- #388 Add documentation to File required setter
- #392 Add simple example using lazy_static
- #393 More clippy fixes
- #396 Replace actions rs
- #401 Backport changelog
- #404 Replace fixupmerge with gitlint
- #406 Fix clippy: Remove unnecessary cast
- #410 Copy member docs to builder functions
- #416 Replace actions-rs with run scripts
- #423 Fix clippy: Remove needless borrowed reference
- #445 Update license field following SPDX 2.1 license expression standard
- #460 Use weak features for preserve_order
- #469 chore: Use a common method in parsers to check root is a table
- #471 Clippy exact toolchains
- #479 docs: Example for conditionally loading sources
- #485 Add DCO
- #488 Unify deser impl (redux)
- #489 deserialize: strings: Introduce string_serialize_via_display macro
- #507 Check external types
- #511 Fix: cargo-check-external-types must use nightly 2023-10-10
-
0.13.422 Nov 2023Nothing published for this version
-
0.13.304 Dec 2022Release notes
Open source →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
Clonetrait derive to builder states
-
0.13.202 Aug 2022Release notes
Open source →- 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
-
0.13.113 Apr 2022Release notes
Open source → -
0.13.003 Apr 2022Release notes
Open source →- Prefix-Separator 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
-
0.12.019 Feb 2022Release notes
Open source →Format support changes in this version
Other noteworthy changes
- 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
Formattrait for (custom) file formats #219
Deprecated
-
0.11.017 Mar 2021Release notes
Open source →- The
Configtype got a builder-patternwith_merged()method #166. - A
Config::set_once()function was added, to set an value that can be overwritten byConfig::mergeing 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
- The
-
0.10.108 Dec 2019 -
0.10.008 Dec 2019Release notes
Open source →- Remove lowercasing of keys (unless the key is coming from an environment variable).
- Update nom to 5.x
-
0.9.309 May 2019 -
0.9.203 Jan 2019 -
0.9.126 Sep 2018Release notes
Open source →- Allow Environment variable collection to ignore empty values. #78
// Empty env variables will not be collected Environment::with_prefix("APP").ignore_empty(true)
- Allow Environment variable collection to ignore empty values. #78
-
0.9.002 Jul 2018 -
0.8.026 Jan 2018 -
0.7.126 Jan 2018Release notes
Open source →- Be compatible with nom's verbose_errors feature (#50)[https://github.com/rust-cli/config-rs/pull/50]
- Add
derive(PartialEq)for Value (#54)[https://github.com/rust-cli/config-rs/pull/54]
-
0.7.005 Aug 2017Release notes
Open source →- Fix conflict with
serde_yaml. #39
-
Implement
SourceforConfig. -
Implement
serde::de::DeserializerforConfig.my_config.deserializemay now be called as eitherDeserialize::deserialize(my_config)ormy_config.try_into(). -
Remove
ConfigResult. The builder pattern requires either.try_intoas 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();
- Fix conflict with
-
0.6.023 Jun 2017Release notes
Open source →-
Implement
SourceforVec<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
namespaceoption 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 )
-
-
0.5.116 Jun 2017 -
0.5.016 Jun 2017Release notes
Open source →config.gethas 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::Valueas 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_nameto 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
-
0.4.112 Feb 2017Nothing published for this version
-
0.4.012 Feb 2017Release notes
Open source →-
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(); }
-
-
0.3.108 Feb 2017Nothing published for this version
-
0.3.008 Feb 2017Release notes
Open source →- YAML from @tmccombs
- Nested field retrieval
- Deep merging of sources (was shallow)
config::File::from_strto parse and merge a file from a string- Support for retrieval of maps and slices —
config::get_tableandconfig::get_array
-
0.2.029 Jan 2017Release notes
Open source →Initial release.
<!-- next-url --> [Unreleased]: https://github.com/rust-cli/config-rs/compare/v0.15.25...HEAD [0.15.25]: https://github.com/rust-cli/config-rs/compare/v0.15.24...v0.15.25 [0.15.24]: https://github.com/rust-cli/config-rs/compare/v0.15.23...v0.15.24 [0.15.23]: https://github.com/rust-cli/config-rs/compare/v0.15.22...v0.15.23 [0.15.22]: https://github.com/rust-cli/config-rs/compare/v0.15.21...v0.15.22 [0.15.21]: https://github.com/rust-cli/config-rs/compare/v0.15.20...v0.15.21 [0.15.20]: https://github.com/rust-cli/config-rs/compare/v0.15.19...v0.15.20 [0.15.19]: https://github.com/rust-cli/config-rs/compare/v0.15.18...v0.15.19 [0.15.18]: https://github.com/rust-cli/config-rs/compare/v0.15.17...v0.15.18 [0.15.17]: https://github.com/rust-cli/config-rs/compare/v0.15.16...v0.15.17 [0.15.16]: https://github.com/rust-cli/config-rs/compare/v0.15.15...v0.15.16 [0.15.15]: https://github.com/rust-cli/config-rs/compare/v0.15.14...v0.15.15 [0.15.14]: https://github.com/rust-cli/config-rs/compare/v0.15.13...v0.15.14 [0.15.13]: https://github.com/rust-cli/config-rs/compare/v0.15.12...v0.15.13 [0.15.12]: https://github.com/rust-cli/config-rs/compare/v0.15.11...v0.15.12 [0.15.11]: https://github.com/rust-cli/config-rs/compare/v0.15.10...v0.15.11 [0.15.10]: https://github.com/rust-cli/config-rs/compare/v0.15.9...v0.15.10 [0.15.9]: https://github.com/rust-cli/config-rs/compare/v0.15.8...v0.15.9 [0.15.8]: https://github.com/rust-cli/config-rs/compare/v0.15.7...v0.15.8 [0.15.7]: https://github.com/rust-cli/config-rs/compare/v0.15.6...v0.15.7 [0.15.6]: https://github.com/rust-cli/config-rs/compare/v0.15.5...v0.15.6 [0.15.5]: https://github.com/rust-cli/config-rs/compare/v0.15.4...v0.15.5 [0.15.4]: https://github.com/rust-cli/config-rs/compare/v0.15.3...v0.15.4 [0.15.3]: https://github.com/rust-cli/config-rs/compare/v0.15.2...v0.15.3 [0.15.2]: https://github.com/rust-cli/config-rs/compare/v0.15.1...v0.15.2 [0.15.1]: https://github.com/rust-cli/config-rs/compare/v0.15.0...v0.15.1 [0.15.0]: https://github.com/rust-cli/config-rs/compare/v0.14.1...v0.15.0 [0.14.1]: https://github.com/rust-cli/config-rs/compare/0.14.0...v0.14.1
-
0.1.318 Nov 2015Nothing published for this version
-
0.1.215 Oct 2015Nothing published for this version
-
0.1.130 Apr 2015Nothing published for this version
-
0.1.019 Apr 2015Nothing published for this version
-
0.0.116 Apr 2015Nothing published for this version