diff --git a/remote/remote.go b/remote/remote.go index f36f035..94838a7 100644 --- a/remote/remote.go +++ b/remote/remote.go @@ -40,13 +40,34 @@ func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) return bytes.NewReader(resp), nil } -func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *crypt.Response, chan bool) { +func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.Response, chan bool) { cm, err := getConfigManager(rp) if err != nil { return nil, nil } quit := make(chan bool) - return cm.Watch(rp.Path(), quit) ,quit + quitwc := make(chan bool) + viperResponsCh := make(chan *viper.Response) + 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.Response, quitwc <-chan bool, quit chan<- bool) { + for { + select { + case <- quitwc: + quit <- true + return + case resp := <-cr: + vr <- &viper.Response{ + Error: resp.Error, + Value: resp.Value, + } + + } + + } + }(cryptoResponseCh,viperResponsCh,quitwc,quit) + + return viperResponsCh,quitwc } diff --git a/viper.go b/viper.go index 56278f3..c18e463 100644 --- a/viper.go +++ b/viper.go @@ -36,11 +36,15 @@ import ( "github.com/spf13/cast" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/pflag" - crypt "github.com/xordataexchange/crypt/config" ) var v *Viper +type Response struct { + Value []byte + Error error +} + func init() { v = New() } @@ -48,7 +52,7 @@ func init() { type remoteConfigFactory interface { Get(rp RemoteProvider) (io.Reader, error) Watch(rp RemoteProvider) (io.Reader, error) - WatchChannel(rp RemoteProvider)(<-chan *crypt.Response, chan bool) + WatchChannel(rp RemoteProvider)(<-chan *Response, chan bool) } // RemoteConfig is optional, see the remote package @@ -1309,7 +1313,7 @@ func (v *Viper) watchKeyValueConfigOnChannel() error { for _, rp := range v.remoteProviders { respc, _ := RemoteConfig.WatchChannel(rp) //Todo: Add quit channel - go func(rc <-chan *crypt.Response) { + go func(rc <-chan *Response) { for { b := <-rc reader := bytes.NewReader(b.Value)