3 releases (breaking)

new 0.6.0 Feb 27, 2021
0.5.1 Feb 21, 2021
0.4.0 Feb 20, 2021
0.3.0 Feb 19, 2021
0.1.0 Feb 15, 2021

#34 in Configuration

36 downloads per month

MIT license



A layered configuration loader with zero-boilerplate configuration management.

Crates.io Crates.io Documentation dependency status License Actions Status

  1. About
  2. Features
  3. Placeholder
  4. Key Convension
  5. Cargo Features
    1. Default features
    2. Optional features
  6. Quick Example


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.

  • 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 **
    • 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.
  • Supports profile(develop/production) based configuration.
  • Supports placeholder resolve.
  • Supports reload configurations.


  • ${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}.

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

  1. enable_log, enable log record if enabled.
  2. enable_toml, enable toml support.
  3. enable_derive, enable auto derive [FromEnvironment] for struts.

Optional features

  1. enable_clap, enable default command line arguments parsing by clap.
  2. enable_yaml, enable yaml 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,
  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`.

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,
// }


~16K SLoC