From c2f34df4931482826fae84f3f9e991b0e470f8dc Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Wed, 4 Aug 2021 13:51:43 +0300 Subject: [PATCH] config: minor changes to split config and watcher files Signed-off-by: Vasiliy Tolstov --- config/default.go | 74 -------------------------------------- config/default_test.go | 4 +-- config/watcher.go | 81 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 77 deletions(-) create mode 100644 config/watcher.go diff --git a/config/default.go b/config/default.go index 320abbd5..ded6d79c 100644 --- a/config/default.go +++ b/config/default.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/imdario/mergo" - "github.com/unistack-org/micro/v3/util/jitter" rutil "github.com/unistack-org/micro/v3/util/reflect" ) @@ -292,76 +291,3 @@ func NewConfig(opts ...Option) Config { } return &defaultConfig{opts: options} } - -type defaultWatcher struct { - opts Options - wopts WatchOptions - done chan struct{} - vchan chan map[string]interface{} - echan chan error -} - -func (w *defaultWatcher) run() { - ticker := jitter.NewTicker(w.wopts.MinInterval, w.wopts.MaxInterval) - defer ticker.Stop() - - src := w.opts.Struct - if w.wopts.Struct != nil { - src = w.wopts.Struct - } - - for { - select { - case <-w.done: - return - case <-ticker.C: - dst, err := rutil.Zero(src) - if err == nil { - err = fillValues(reflect.ValueOf(dst), w.opts.StructTag) - } - if err != nil { - w.echan <- err - return - } - srcmp, err := rutil.StructFieldsMap(src) - if err != nil { - w.echan <- err - return - } - dstmp, err := rutil.StructFieldsMap(dst) - if err != nil { - w.echan <- err - return - } - for sk, sv := range srcmp { - if reflect.DeepEqual(dstmp[sk], sv) { - delete(dstmp, sk) - } - } - if len(dstmp) > 0 { - w.vchan <- dstmp - src = dst - } - } - } -} - -func (w *defaultWatcher) Next() (map[string]interface{}, error) { - select { - case <-w.done: - break - case err := <-w.echan: - return nil, err - case v, ok := <-w.vchan: - if !ok { - break - } - return v, nil - } - return nil, ErrWatcherStopped -} - -func (w *defaultWatcher) Stop() error { - close(w.done) - return nil -} diff --git a/config/default_test.go b/config/default_test.go index a21a021d..8a64a336 100644 --- a/config/default_test.go +++ b/config/default_test.go @@ -45,10 +45,8 @@ func TestWatch(t *testing.T) { go func() { for { mp, err := w.Next() - if err != nil && err != config.ErrWatcherStopped { + if err != nil { t.Fatal(err) - } else if err == config.ErrWatcherStopped { - return } if len(mp) != 1 { t.Fatal(fmt.Errorf("default watcher err: %v", mp)) diff --git a/config/watcher.go b/config/watcher.go new file mode 100644 index 00000000..3e7563ea --- /dev/null +++ b/config/watcher.go @@ -0,0 +1,81 @@ +package config + +import ( + "reflect" + + "github.com/unistack-org/micro/v3/util/jitter" + rutil "github.com/unistack-org/micro/v3/util/reflect" +) + +type defaultWatcher struct { + opts Options + wopts WatchOptions + done chan struct{} + vchan chan map[string]interface{} + echan chan error +} + +func (w *defaultWatcher) run() { + ticker := jitter.NewTicker(w.wopts.MinInterval, w.wopts.MaxInterval) + defer ticker.Stop() + + src := w.opts.Struct + if w.wopts.Struct != nil { + src = w.wopts.Struct + } + + for { + select { + case <-w.done: + return + case <-ticker.C: + dst, err := rutil.Zero(src) + if err == nil { + err = fillValues(reflect.ValueOf(dst), w.opts.StructTag) + } + if err != nil { + w.echan <- err + return + } + srcmp, err := rutil.StructFieldsMap(src) + if err != nil { + w.echan <- err + return + } + dstmp, err := rutil.StructFieldsMap(dst) + if err != nil { + w.echan <- err + return + } + for sk, sv := range srcmp { + if reflect.DeepEqual(dstmp[sk], sv) { + delete(dstmp, sk) + } + } + if len(dstmp) > 0 { + w.vchan <- dstmp + src = dst + } + } + } +} + +func (w *defaultWatcher) Next() (map[string]interface{}, error) { + select { + case <-w.done: + break + case err := <-w.echan: + return nil, err + case v, ok := <-w.vchan: + if !ok { + break + } + return v, nil + } + return nil, ErrWatcherStopped +} + +func (w *defaultWatcher) Stop() error { + close(w.done) + return nil +}