add README.md, and fix strings.ToLower(configType)
diff --git a/README.md b/README.md
index 4e72e97..cd42a2f 100644
--- a/README.md
+++ b/README.md
@@ -14,8 +14,9 @@
* setting defaults
* reading from json, toml and yaml config files
* reading from environment variables
-* reading from remote config systems (Etcd or Consul)
+* reading from remote config systems (Etcd or Consul), watching changes
* reading from command line flags
+* reading from buffer
* setting explicit values
It can be thought of as a registry for all of your applications
@@ -81,6 +82,36 @@
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
+### Reading Config from bytes.Buffer
+
+Viper predefined many configuration sources, such as files, environment variables, flags and
+remote K/V store. But you are not bound to them. You can also implement your own way to
+require configuration and feed it to viper.
+
+````go
+viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
+
+// any approach to require this configuration into your program.
+var yamlExample = []byte(`
+Hacker: true
+name: steve
+hobbies:
+- skateboarding
+- snowboarding
+- go
+clothing:
+ jacket: leather
+ trousers: denim
+age: 35
+eyes : brown
+beard: true
+`)
+
+viper.ReadBufConfig(bytes.NewBuffer(yamlExample))
+
+viper.Get("name") // this would be "steve"
+````
+
### Setting Overrides
These could be from a command line flag, or from your own application logic.
@@ -208,6 +239,38 @@
viper.SetConfigType("json") // because there is no file extension in a stream of bytes
err := viper.ReadRemoteConfig()
+### Watching Changes in Etcd - Unencrypted
+
+ // alternatively, you can create a new viper instance.
+ var runtime_viper = viper.New()
+
+ runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml")
+ runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes
+
+ // read from remote config the first time.
+ err := runtime_viper.ReadRemoteConfig()
+
+ // marshal config
+ runtime_viper.Marshal(&runtime_conf)
+
+ // open a goroutine to wath remote changes forever
+ go func(){
+ for {
+ time.Sleep(time.Second * 5) // delay after each request
+
+ // currenlty, only tested with etcd support
+ err := runtime_viper.WatchRemoteConfig()
+ if err != nil {
+ log.Errorf("unable to read remote config: %v", err)
+ continue
+ }
+
+ // marshal new config into our runtime config struct. you can also use channel
+ // to implement a signal to notify the system of the changes
+ runtime_viper.Marshal(&runtime_conf)
+ }
+ }()
+
## Getting Values From Viper
diff --git a/util.go b/util.go
index 7c5d21a..7904b1a 100644
--- a/util.go
+++ b/util.go
@@ -123,7 +123,7 @@
buf := new(bytes.Buffer)
buf.ReadFrom(in)
- switch configType {
+ switch strings.ToLower(configType) {
case "yaml", "yml":
if err := yaml.Unmarshal(buf.Bytes(), &c); err != nil {
jww.ERROR.Fatalf("Error parsing config: %s", err)