5 stable releases

2.1.1 Mar 6, 2024
2.1.0 Dec 11, 2023
2.0.0 Nov 25, 2023
1.0.2 Jun 5, 2023
1.0.0 Oct 6, 2022

#49 in Configuration

Download history 67/week @ 2024-01-06 35/week @ 2024-01-13 51/week @ 2024-01-20 35/week @ 2024-01-27 50/week @ 2024-02-03 343/week @ 2024-02-10 117/week @ 2024-02-17 80/week @ 2024-02-24 204/week @ 2024-03-02 129/week @ 2024-03-09 87/week @ 2024-03-16 283/week @ 2024-03-23 101/week @ 2024-03-30 145/week @ 2024-04-06 225/week @ 2024-04-13

767 downloads per month
Used in more-options

MIT license

120KB
2.5K SLoC

More Configuration   CI Crates.io MIT licensed

More Configuration is a configuration library for Rust.

You may be looking for:

Features

This crate provides the following features:

  • default - Abstractions for configuration, including the std features
  • std - Standard configuration implementation
  • all - Includes all features, except async
  • async - Use configuration in an asynchronous context
  • mem - An in-memory configuration source
  • env - An environment variables configuration source
  • cmd - A command-line argument configuration source
  • json - A *.json file configuration source
  • xml - A *.xml file configuration source
  • ini - An *.ini file configuration source
  • chained - Chain multiple configuration sources
  • binder - Bind a configuration to strongly-typed values and structs

Use --features all,async for all features with asynchronous support

Configuration in Action

Consider the following demo.json file:

{
  "text": "Hello world!",
  "demo": true,
  "clients": [{
    "region": "us-west",
    "url": "https://tempuri.org"
  }]
}

The configuration can be loaded, merged, and accessed from multiple sources:

use config::{*, ext::*};

fn main() {
    let config = DefaultConfigurationBuilder::new()
        .add_in_memory(&[("Demo", "false")])
        .add_json_file("demo.json".is().optional())
        .add_env_vars()
        .add_command_line()
        .build()
        .unwrap();
    
    if let Some(demo) = config.get("demo") {
      if demo.as_str() == "true" {
        println!("{}", config.get("Text").unwrap().as_str());
        println!("{}", config.get("Clients:0:Region").unwrap().as_str());
        return;
      }
    }
    
    println!("Not a demo!");
}

Raw configuration values can be used, but they are much more interesting when we data bind them to strongly-typed values:

use serde::Deserialize;

#[derive(Default, Deserialize)]
#[serde(rename_all(deserialize = "PascalCase"))]
struct Client {
    region: String,
    url: String,
}

#[derive(Default, Deserialize)]
#[serde(rename_all(deserialize = "PascalCase"))]
struct AppOptions {
    text: String,
    demo: bool,
    clients: Vec<Client>,
}

The first letter of JSON configuration keys are normalized to uppercase.

use config::{*, ext::*};

fn main() {
    let file = std::env::current_exe()
        .unwrap()
        .parent()
        .unwrap()
        .join("../../demo.json");
    let config = DefaultConfigurationBuilder::new()
        .add_json_file(file)
        .build()
        .unwrap();
    let app: AppOptions = config.reify();
    
    if app.demo {
        println!("{}", &app.text);
        println!("{}", &app.clients[0].region);
        return;
    }
    
    println!("Not a demo!");
}

Minimum Supported Rust Version

When increasing the minimum supported Rust version (MSRV), the new version must have been released at least six months ago. The current MSRV is 1.60.

License

This project is licensed under the MIT license.

Dependencies

~0–9.5MB
~55K SLoC