OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / spf13 / viper / remote / remote.go
diff --git a/vendor/github.com/spf13/viper/remote/remote.go b/vendor/github.com/spf13/viper/remote/remote.go
new file mode 100644 (file)
index 0000000..68a35d6
--- /dev/null
@@ -0,0 +1,104 @@
+// Copyright © 2015 Steve Francia <spf@spf13.com>.
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// Package remote integrates the remote features of Viper.
+package remote
+
+import (
+       "bytes"
+       "github.com/spf13/viper"
+       crypt "github.com/xordataexchange/crypt/config"
+       "io"
+       "os"
+)
+
+type remoteConfigProvider struct{}
+
+func (rc remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) {
+       cm, err := getConfigManager(rp)
+       if err != nil {
+               return nil, err
+       }
+       b, err := cm.Get(rp.Path())
+       if err != nil {
+               return nil, err
+       }
+       return bytes.NewReader(b), nil
+}
+
+func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) {
+       cm, err := getConfigManager(rp)
+       if err != nil {
+               return nil, err
+       }
+       resp, err := cm.Get(rp.Path())
+       if err != nil {
+               return nil, err
+       }
+
+       return bytes.NewReader(resp), nil
+}
+
+func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) {
+       cm, err := getConfigManager(rp)
+       if err != nil {
+               return nil, nil
+       }
+       quit := make(chan bool)
+       quitwc := make(chan bool)
+       viperResponsCh := make(chan *viper.RemoteResponse)
+       cryptoResponseCh := cm.Watch(rp.Path(), quit)
+       // need this function to convert the Channel response form crypt.Response to viper.Response
+       go func(cr <-chan *crypt.Response, vr chan<- *viper.RemoteResponse, quitwc <-chan bool, quit chan<- bool) {
+               for {
+                       select {
+                       case <-quitwc:
+                               quit <- true
+                               return
+                       case resp := <-cr:
+                               vr <- &viper.RemoteResponse{
+                                       Error: resp.Error,
+                                       Value: resp.Value,
+                               }
+
+                       }
+
+               }
+       }(cryptoResponseCh, viperResponsCh, quitwc, quit)
+
+       return viperResponsCh, quitwc
+}
+
+func getConfigManager(rp viper.RemoteProvider) (crypt.ConfigManager, error) {
+       var cm crypt.ConfigManager
+       var err error
+
+       if rp.SecretKeyring() != "" {
+               kr, err := os.Open(rp.SecretKeyring())
+               defer kr.Close()
+               if err != nil {
+                       return nil, err
+               }
+               if rp.Provider() == "etcd" {
+                       cm, err = crypt.NewEtcdConfigManager([]string{rp.Endpoint()}, kr)
+               } else {
+                       cm, err = crypt.NewConsulConfigManager([]string{rp.Endpoint()}, kr)
+               }
+       } else {
+               if rp.Provider() == "etcd" {
+                       cm, err = crypt.NewStandardEtcdConfigManager([]string{rp.Endpoint()})
+               } else {
+                       cm, err = crypt.NewStandardConsulConfigManager([]string{rp.Endpoint()})
+               }
+       }
+       if err != nil {
+               return nil, err
+       }
+       return cm, nil
+}
+
+func init() {
+       viper.RemoteConfig = &remoteConfigProvider{}
+}