diff options
author | Ryan Leckey <ryan@launchbadge.com> | 2017-06-16 11:45:35 -0700 |
---|---|---|
committer | Ryan Leckey <ryan@launchbadge.com> | 2017-06-16 11:45:35 -0700 |
commit | a02114f9ea17e0161b2b334c1c57bac451a70266 (patch) | |
tree | 5d556cb502c49a6192cd9e3c7719f437469b65ff /examples | |
parent | be251fef2cfcf79a34f5c4e5086c715234281b5e (diff) |
Add hierarchial config example
Diffstat (limited to 'examples')
-rw-r--r-- | examples/hierarchical-env/Cargo.toml | 8 | ||||
-rw-r--r-- | examples/hierarchical-env/config/default.toml | 17 | ||||
-rw-r--r-- | examples/hierarchical-env/config/development.toml | 4 | ||||
-rw-r--r-- | examples/hierarchical-env/config/production.toml | 13 | ||||
-rw-r--r-- | examples/hierarchical-env/src/main.rs | 16 | ||||
-rw-r--r-- | examples/hierarchical-env/src/settings.rs | 70 |
6 files changed, 128 insertions, 0 deletions
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::<String>("database.url")); + + // You can deserialize (and thus freeze) the entire configuration as + s.deserialize().unwrap() + } +} |