12 releases
new 0.2.6 | Oct 10, 2024 |
---|---|
0.2.5 | Dec 10, 2023 |
0.2.4 | Jul 2, 2023 |
0.2.3 | Mar 10, 2023 |
0.1.0 | Jul 28, 2021 |
#19 in Configuration
3,833 downloads per month
Used in 11 crates
90KB
1.5K
SLoC
Confique: type-safe, layered configuration library
Confique is a rather light-weight library that helps with configuration management in a type-safe and DRY (don't repeat yourself) fashion.
Features:
- Type safe: the code using the config values does not need to parse strings or
unwrap
anyOption
s. All values already have the correct type. - Layered configuration: you can load from and then merge multiple sources of configuration.
- Load config values from:
- Based on
serde
: less code inconfique
(more light-weight) and access to a huge ecosystem of high quality parsers. - Easily generate configuration "templates": describe all available config values to your users without repeating yourself.
Simple example
use std::{net::IpAddr, path::PathBuf};
use confique::Config;
#[derive(Config)]
struct Conf {
/// Port to listen on.
#[config(env = "PORT", default = 8080)]
port: u16,
/// Bind address.
#[config(default = "127.0.0.1")]
address: IpAddr,
#[config(nested)]
log: LogConf,
}
#[derive(Config)]
struct LogConf {
#[config(default = true)]
stdout: bool,
file: Option<PathBuf>,
#[config(default = ["debug"])]
ignored_modules: Vec<String>,
}
let config = Conf::builder()
.env()
.file("example-app.toml")
.file("/etc/example-app/config.toml")
.load()?;
See the documentation for more information.
Configuration Template
With the above example, you can automatically generate a configuration template: a file in a chosen format that lists all values with their description, default values, and env values.
toml::template::<Conf>() |
yaml::template::<Conf>() |
json5::template::<Conf>() |
|
|
|
(Note: The "environment variable" sentence is on a single line; I just split it into two lines for readability in this README.)
Comparison with other libraries/solutions
config
- Loosely typed:
- You access configuration values via string path (e.g.
"http.port"
) and deserialize at "use site". - No defined schema
- You access configuration values via string path (e.g.
- More features
- Larger library
- If you need a "config template", you need to repeat code/docs
figment
- Also based on
serde
and also uses your own structs as data store, thus type safe - Instead of using partial types, aggregates different layers in a dynamic data store
- If you need a "config template", you need to repeat code/docs
Just serde
?
Serde is not a configuration, but a deserialization library.
But you can get surprisingly far with just serde and it might actually be sufficient for your project.
However, once you want to load from multiple sources, you either have make all your fields Option
or repeat code/docs.
With confique
you also get some other handy helpers.
Status of this project
There is still some design space to explore and there are certainly still many features one could add. However, the core interface (the derive macro and the core traits) probably won't change a lot anymore. Confique is used by a web project (that's already used in production) which I'm developing alongside of confique.
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~2.7–4MB
~77K SLoC