# salak
Salak is a multi layered configuration loader and zero-boilerplate configuration parser, with many predefined sources.
[](https://crates.io/crates/salak)
[](https://crates.io/crates/salak)
[](https://docs.rs/salak)
[](https://deps.rs/crate/salak)
[](https://github.com/leptonyu/salak.rs/blob/master/LICENSE-MIT)
[](https://github.com/leptonyu/salak.rs/actions)
Please refer to [salak doc](https://docs.rs/salak).
## *Notice*
Please *notice* that `salak-0.9.*` is totally rewrited, so the APIs may changes much, and some functions may be removed. They will be added in later version.
## Quick Example
```rust
use salak::*;
#[derive(Debug, FromEnvironment)]
#[salak(prefix = "config")]
struct Config {
#[salak(default = false)]
verbose: bool,
optional: Option<String>,
#[salak(name = "val")]
value: i64,
}
let env = Salak::builder()
.set("config.val", "2021")
.build()
.unwrap();
let config = env.get::<Config>().unwrap();
assert_eq!(2021, config.value);
assert_eq!(None, config.optional);
assert_eq!(false, config.verbose);
```
## Trait FromEnvironment

## Salak Factory
[salak_factory](https://crates.io/crates/salak_factory) can initialize resource based on `salak`, such as redis, postgresql, etc.
```rust
use salak::*;
use salak_factory::redis_default::RedisPool;
fn main() -> Result<(), PropertyError> {
let env = Salak::builder()
.register_resource::<RedisPool>(ResourceBuilder::default())
.register_resource::<RedisPool>(ResourceBuilder::default().namespace("secondary"))
.configure_args(app_info!())
.build()?;
let _pool1 = env.get_resource::<RedisPool>()?;
let _pool2 = env.get_resource_by_namespace::<RedisPool>("secondary")?;
// let conn = _pool1.get()?;
Ok(())
}
```