Working With Files

A ConfigurationProvider that is based on a file should support a FileSource:

pub struct FileSource {
    pub path: PathBuf,
    pub optional: bool,
    pub reload_on_change: bool,
    pub reload_delay: Duration,
}

An optional file means that the path does not need to exist. When reload_on_change is specified, the provider will watch for changes to path and trigger a notification via ConfigurationProvider::reload_token. A file change might trigger before a file has been completely written, which is operating system dependent. reload_delay indicates how long a provider should wait to reload when a change is detected. The default duration is 250 milliseconds.

All of the built-in, file-based configuration providers support accepting a FileSource. A file source is most commonly just a file path, but it may include additional configuration features. The FileSourceBuilder struct and FileSourceBuilderExtensions trait provide several methods of specifying a FileSource and its options in a fluent manner.

use config::{*, ext::*};
use std::path::PathBuf;

fn main() {
    let xml = PathBuf::from("settings.xml");
    let config = DefaultConfigurationBuilder::new()
        .add_ini_file(FileSource::new(PathBuf::("prod.cfg.ini"), false, false, None))
        .add_ini_file(FileSource::optional(PathBuf::("dev.cfg.ini")))
        .add_xml_file(xml.is().optional())
        .add_json_file("settings.json".is().optional().reloadable())
        .build()
        .unwrap();

    for (key, value) in config.iter(None) {
        println!("{} = {}", key, value.as_str());
    }
}