A layered configuration loader with zero-boilerplate configuration management.
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
].
Below are a few of the features which salak
supports.
#[salak(default="value")]
set default value.#[salak(name="key")]
rename property key.#[salak(prefix="salak.database")]
set prefix.random.u8
random.u16
random.u32
random.i8
random.i16
random.i32
random.i64
${key:default}
means get value of key
, if not exists then return default
.${key}
means get value of key
, if not exists then return PropertyError::NotFound(_)
.\$\{key\}
means escape to ${key}
.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.enable_log
, enable log record if enabled.enable_toml
, enable toml support.enable_derive
, enable auto derive [FromEnvironment
] for struts.enable_pico
, enable default command line arguments parsing by pico-args
.enable_clap
, enable default command line arguments parsing by clap
.enable_yaml
, enable yaml support.enable_rand
, enable random value support.```rust use salak::*;
pub struct SslConfig { key: String, pem: String, }
pub struct DatabaseConfig {
url: String,
#[salak(default = "salak")]
username: String,
password: Option
}
std::env::setvar("database.url", "localhost:5432");
std::env::setvar("database.description", "\$\{Hello\}");
let env = Salak::new()
.withdefaultargs(autoreadsysargsparam!()) // This line need enable feature enable_clap
.
.build();
match env.load_config::
// Output: DatabaseConfig { // url: "localhost:5432", // username: "salak", // password: None, // description: "${Hello}", // ssl_config: None, // } ```
salak_factory is out-of-box crate for using well known components, such as redis, postgresql, etc.
rust
let env = Salak::new().build();
let redis_pool = env.build::<RedisConfig>().unwrap();
let redis_conn = redis_pool.get().unwrap();
let _: u64 = redis_conn.set("hello", 1u64).unwrap();
/// Use redis_conn.