From a02114f9ea17e0161b2b334c1c57bac451a70266 Mon Sep 17 00:00:00 2001 From: Ryan Leckey Date: Fri, 16 Jun 2017 11:45:35 -0700 Subject: Add hierarchial config example --- examples/hierarchical-env/Cargo.toml | 8 +++ examples/hierarchical-env/config/default.toml | 17 ++++++ examples/hierarchical-env/config/development.toml | 4 ++ examples/hierarchical-env/config/production.toml | 13 +++++ examples/hierarchical-env/src/main.rs | 16 ++++++ examples/hierarchical-env/src/settings.rs | 70 +++++++++++++++++++++++ 6 files changed, 128 insertions(+) create mode 100644 examples/hierarchical-env/Cargo.toml create mode 100644 examples/hierarchical-env/config/default.toml create mode 100644 examples/hierarchical-env/config/development.toml create mode 100644 examples/hierarchical-env/config/production.toml create mode 100644 examples/hierarchical-env/src/main.rs create mode 100644 examples/hierarchical-env/src/settings.rs diff --git a/examples/hierarchical-env/Cargo.toml b/examples/hierarchical-env/Cargo.toml new file mode 100644 index 0000000..bbcd4a6 --- /dev/null +++ b/examples/hierarchical-env/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "hierarchical-env" +version = "0.1.0" + +[dependencies] +config = { path = "../../" } +serde_derive = "^1.0.8" +serde = "^1.0.8" diff --git a/examples/hierarchical-env/config/default.toml b/examples/hierarchical-env/config/default.toml new file mode 100644 index 0000000..dbb2f30 --- /dev/null +++ b/examples/hierarchical-env/config/default.toml @@ -0,0 +1,17 @@ +[database] +url = "postgres://postgres@localhost" + +[sparkpost] +key = "sparkpost-dev-key" +token = "sparkpost-dev-token" +url = "https://api.sparkpost.com" +version = 1 + +[twitter] +consumer_token = "twitter-dev-consumer-key" +consumer_secret = "twitter-dev-consumer-secret" + +[braintree] +merchant_id = "braintree-merchant-id" +public_key = "braintree-dev-public-key" +private_key = "braintree-dev-private-key" diff --git a/examples/hierarchical-env/config/development.toml b/examples/hierarchical-env/config/development.toml new file mode 100644 index 0000000..f07dcc2 --- /dev/null +++ b/examples/hierarchical-env/config/development.toml @@ -0,0 +1,4 @@ +debug = true + +[database] +echo = true diff --git a/examples/hierarchical-env/config/production.toml b/examples/hierarchical-env/config/production.toml new file mode 100644 index 0000000..cd0c4cf --- /dev/null +++ b/examples/hierarchical-env/config/production.toml @@ -0,0 +1,13 @@ +debug = false + +[sparkpost] +key = "sparkpost-prod-key" +token = "sparkpost-prod-token" + +[twitter] +consumer_token = "twitter-prod-consumer-key" +consumer_secret = "twitter-prod-consumer-secret" + +[braintree] +public_key = "braintree-prod-public-key" +private_key = "braintree-prod-private-key" diff --git a/examples/hierarchical-env/src/main.rs b/examples/hierarchical-env/src/main.rs new file mode 100644 index 0000000..65f727d --- /dev/null +++ b/examples/hierarchical-env/src/main.rs @@ -0,0 +1,16 @@ +extern crate config; +extern crate serde; + +#[macro_use] +extern crate serde_derive; + +mod settings; + +use settings::Settings; + +fn main() { + let settings = Settings::new(); + + // Print out our settings + println!("{:?}", settings); +} diff --git a/examples/hierarchical-env/src/settings.rs b/examples/hierarchical-env/src/settings.rs new file mode 100644 index 0000000..43897b3 --- /dev/null +++ b/examples/hierarchical-env/src/settings.rs @@ -0,0 +1,70 @@ +use std::env; +use config::{Config, File, Environment}; + +#[derive(Debug, Deserialize)] +struct Database { + url: String, +} + +#[derive(Debug, Deserialize)] +struct Sparkpost { + key: String, + token: String, + url: String, + version: u8, +} + +#[derive(Debug, Deserialize)] +struct Twitter { + consumer_token: String, + consumer_secret: String, +} + +#[derive(Debug, Deserialize)] +struct Braintree { + merchant_id: String, + public_key: String, + private_key: String, +} + +#[derive(Debug, Deserialize)] +pub struct Settings { + debug: bool, + database: Database, + sparkpost: Sparkpost, + twitter: Twitter, + braintree: Braintree, +} + +impl Settings { + pub fn new() -> Self { + let mut s = Config::new(); + + // Start off by merging in the "default" configuration file + s.merge(File::with_name("config/default")).unwrap(); + + // Add in the current environment file + // Default to 'development' env + // Note that this file is _optional_ + let env = env::var("RUN_MODE").unwrap_or("development".into()); + s.merge(File::with_name(&format!("config/{}", env)).required(false)).unwrap(); + + // Add in a local configuration file + // This file shouldn't be checked in to git + s.merge(File::with_name("config/local").required(false)).unwrap(); + + // Add in settings from the environment (with a prefix of APP) + // Eg.. `APP_DEBUG=1 ./target/app` would set the `debug` key + s.merge(Environment::with_prefix("app")).unwrap(); + + // You may also programmatically change settings + s.set("database.url", "postgres://").unwrap(); + + // Now that we're done, let's access our configuration + println!("debug: {:?}", s.get_bool("debug")); + println!("database: {:?}", s.get::("database.url")); + + // You can deserialize (and thus freeze) the entire configuration as + s.deserialize().unwrap() + } +} -- cgit v1.2.3