salak
A layered configuration loader with zero-boilerplate configuration management.
About
salak
is a rust version of layered configuration loader inspired by spring-boot. salak
provide an [Environment
] structure which load properties from various [PropertySource
]s. Any structure which impmement [FromEnvironment
] can get from [Environment
] by a key. Feature enable_derive
provide rust attributes for auto derive [FromEnvironment
].
Features
Below are a few of the features which salak
supports.
- Auto mapping properties into configuration struct.
#[salak(default="value")]
set default value.#[salak(name="key")]
rename property key.#[salak(prefix="salak.database")]
set prefix.
- ** Supports load properties from various sources **
- Support following random property key.
random.u8
random.u16
random.u32
random.i8
random.i16
random.i32
random.i64
- Load properties from command line arguments.
- Load properties from system environment.
- Load properties from toml config file.
- Load properties from yaml config file.
- Easy to add a new property source.
- Support following random property key.
- Supports profile(develop/production) based configuration.
- Supports placeholder resolve.
- Supports reload configurations.
- Supports factory builder.
Placeholder
${key:default}
means get value ofkey
, if not exists then returndefault
.${key}
means get value ofkey
, if not exists then returnPropertyError::NotFound(_)
.\$\{key\}
means escape to${key}
.
Key Convension
a.b.c
is a normal key separated by dot(.
).a.b[0]
,a.b[1]
,a.b[2]
... is a group of keys with arrays.
Cargo Features
Default features
enable_log
, enable log record if enabled.enable_toml
, enable toml support.enable_derive
, enable auto derive [FromEnvironment
] for struts.
Optional features
enable_clap
, enable default command line arguments parsing byclap
.enable_yaml
, enable yaml support.enable_rand
, enable random value support.
Quick Example
use salak::*;
#[derive(FromEnvironment, Debug)]
pub struct SslConfig {
key: String,
pem: String,
}
#[derive(FromEnvironment, Debug)]
#[salak(prefix = "database")]
pub struct DatabaseConfig {
url: String,
#[salak(default = "salak")]
username: String,
password: Option<String>,
description: String,
#[salak(name="ssl")]
ssl_config: Option<SslConfig>,
}
std::env::set_var("database.url", "localhost:5432");
std::env::set_var("database.description", "\\$\\{Hello\\}");
let env = Salak::new()
.with_default_args(auto_read_sys_args_param!()) // This line need enable feature `enable_clap`.
.build();
match env.load_config::<DatabaseConfig>() {
Ok(val) => println!("{:?}", val),
Err(e) => println!("{}", e),
}
// Output: DatabaseConfig {
// url: "localhost:5432",
// username: "salak",
// password: None,
// description: "${Hello}",
// ssl_config: None,
// }