Confique: type-safe, layered configuration library

CI status of main Crates.io Version docs.rs

Confique is a rather light-weight library that helps with configuration management in a type-safe and DRY (don't repeat yourself) fashion.

Features:

Simple example

```rust 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>()
```toml # Port to listen on. # # Can also be specified via # environment variable `PORT`. # # Default value: 8080 #port = 8080 # Bind address. # # Default value: "127.0.0.1" #address = "127.0.0.1" [log] # ``` ```yaml # Port to listen on. # # Can also be specified via # environment variable `PORT`. # # Default value: 8080 #port: 8080 # Bind address. # # Default value: 127.0.0.1 #address: 127.0.0.1 log: # ``` ```json5 { // Port to listen on. // // Can also be specified via // environment variable `PORT`. // // Default value: 8080 //port: 8080, // Bind address. // // Default value: "127.0.0.1" //address: "127.0.0.1", log: { // }, } ```

(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

figment

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.