Syntax highlighting
diff --git a/README.md b/README.md
index 76e1071..23702fd 100644
--- a/README.md
+++ b/README.md
@@ -63,9 +63,11 @@
Examples:
- viper.SetDefault("ContentDir", "content")
- viper.SetDefault("LayoutDir", "layouts")
- viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
+```go
+viper.SetDefault("ContentDir", "content")
+viper.SetDefault("LayoutDir", "layouts")
+viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
+```
### Reading Config Files
@@ -74,13 +76,15 @@
supports json, toml and yaml files. Viper can search multiple paths, but
currently a single viper only supports a single config file.
- viper.SetConfigName("config") // name of config file (without extension)
- viper.AddConfigPath("/etc/appname/") // path to look for the config file in
- viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths
- err := viper.ReadInConfig() // Find and read the config file
- if err != nil { // Handle errors reading the config file
- panic(fmt.Errorf("Fatal error config file: %s \n", err))
- }
+```go
+viper.SetConfigName("config") // name of config file (without extension)
+viper.AddConfigPath("/etc/appname/") // path to look for the config file in
+viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths
+err := viper.ReadInConfig() // Find and read the config file
+if err != nil { // Handle errors reading the config file
+ panic(fmt.Errorf("Fatal error config file: %s \n", err))
+}
+```
### Reading Config from io.Reader
@@ -88,7 +92,7 @@
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
+```go
viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
// any approach to require this configuration into your program.
@@ -110,26 +114,30 @@
viper.ReadConfig(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.
- viper.Set("Verbose", true)
- viper.Set("LogFile", LogFile)
+```go
+viper.Set("Verbose", true)
+viper.Set("LogFile", LogFile)
+```
### Registering and Using Aliases
Aliases permit a single value to be referenced by multiple keys
- viper.RegisterAlias("loud", "Verbose")
+```go
+viper.RegisterAlias("loud", "Verbose")
- viper.Set("verbose", true) // same result as next line
- viper.Set("loud", true) // same result as prior line
+viper.Set("verbose", true) // same result as next line
+viper.Set("loud", true) // same result as prior line
- viper.GetBool("loud") // true
- viper.GetBool("verbose") // true
+viper.GetBool("loud") // true
+viper.GetBool("verbose") // true
+```
### Working with Environment Variables
@@ -175,13 +183,14 @@
#### Env example
- SetEnvPrefix("spf") // will be uppercased automatically
- BindEnv("id")
+```go
+SetEnvPrefix("spf") // will be uppercased automatically
+BindEnv("id")
- os.Setenv("SPF_ID", "13") // typically done outside of the app
+os.Setenv("SPF_ID", "13") // typically done outside of the app
- id := Get("id") // 13
-
+id := Get("id") // 13
+```
### Working with Flags
@@ -196,9 +205,10 @@
Example:
- serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
- viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
-
+```go
+serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
+viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
+```
### Remote Key/Value Store Support
@@ -222,60 +232,69 @@
`crypt` has a command-line helper that you can use to put configurations
in your K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001.
- go get github.com/xordataexchange/crypt/bin/crypt
- crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json
+```bash
+$ go get github.com/xordataexchange/crypt/bin/crypt
+$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json
+```
Confirm that your value was set:
- crypt get -plaintext /config/hugo.json
+```bash
+$ crypt get -plaintext /config/hugo.json
+```
See the `crypt` documentation for examples of how to set encrypted values, or how
to use Consul.
### Remote Key/Value Store Example - Unencrypted
- viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json")
- viper.SetConfigType("json") // because there is no file extension in a stream of bytes
- err := viper.ReadRemoteConfig()
+```go
+viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json")
+viper.SetConfigType("json") // because there is no file extension in a stream of bytes
+err := viper.ReadRemoteConfig()
+```
### Remote Key/Value Store Example - Encrypted
- viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg")
- viper.SetConfigType("json") // because there is no file extension in a stream of bytes
- err := viper.ReadRemoteConfig()
+```go
+viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg")
+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()
+```go
+// 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
+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()
+// read from remote config the first time.
+err := runtime_viper.ReadRemoteConfig()
- // marshal config
- runtime_viper.Marshal(&runtime_conf)
+// 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)
- }
- }()
-
+// 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
@@ -299,18 +318,18 @@
method has been provided.
Example:
-
- viper.GetString("logfile") // case-insensitive Setting & Getting
- if viper.GetBool("verbose") {
- fmt.Println("verbose enabled")
- }
-
+```go
+viper.GetString("logfile") // case-insensitive Setting & Getting
+if viper.GetBool("verbose") {
+ fmt.Println("verbose enabled")
+}
+```
### Accessing nested keys
The accessor methods also accept formatted paths to deeply nested keys.
For example, if the following JSON file is loaded:
-```
+```json
{
"host": {
"address": "localhost",
@@ -331,7 +350,8 @@
```
Viper can access a nested field by passing a `.` delimited path of keys:
-```
+
+```go
GetString("datastore.metric.host") // (returns "127.0.0.1")
```
@@ -348,7 +368,7 @@
Lastly, if there exists a key that matches the delimited key path, its value will
be returned instead. E.g.
-```
+```json
{
"datastore.metric.host": "0.0.0.0",
"host": {
@@ -381,18 +401,19 @@
Example:
- type config struct {
- Port int
- Name string
- }
+```go
+type config struct {
+ Port int
+ Name string
+}
- var C config
+var C config
- err := Marshal(&C)
- if err != nil {
- t.Fatalf("unable to decode into struct, %v", err)
- }
-
+err := Marshal(&C)
+if err != nil {
+ t.Fatalf("unable to decode into struct, %v", err)
+}
+```
## Viper or Vipers?
@@ -413,13 +434,15 @@
Example:
- x := viper.New()
- y := viper.New()
+```go
+x := viper.New()
+y := viper.New()
- x.SetDefault("ContentDir", "content")
- y.SetDefault("ContentDir", "foobar")
+x.SetDefault("ContentDir", "content")
+y.SetDefault("ContentDir", "foobar")
- ...
+//...
+```
When working with multiple vipers, it is up to the user to keep track of
the different vipers.