summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Leckey <ryan@launchbadge.com>2017-06-16 11:45:35 -0700
committerRyan Leckey <ryan@launchbadge.com>2017-06-16 11:45:35 -0700
commita02114f9ea17e0161b2b334c1c57bac451a70266 (patch)
tree5d556cb502c49a6192cd9e3c7719f437469b65ff
parentbe251fef2cfcf79a34f5c4e5086c715234281b5e (diff)
Add hierarchial config example
-rw-r--r--examples/hierarchical-env/Cargo.toml8
-rw-r--r--examples/hierarchical-env/config/default.toml17
-rw-r--r--examples/hierarchical-env/config/development.toml4
-rw-r--r--examples/hierarchical-env/config/production.toml13
-rw-r--r--examples/hierarchical-env/src/main.rs16
-rw-r--r--examples/hierarchical-env/src/settings.rs70
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()
+ }
+}