From 1f7f7dc1c3aea427b4bcbd013ef4280cff5f8995 Mon Sep 17 00:00:00 2001 From: Pavel Gabriel Date: Mon, 10 May 2021 11:28:04 +0200 Subject: [PATCH] support loading config from io.Reader --- config/config.go | 23 +++++++++++++++++++++-- config/config_test.go | 19 +++++++++++++++++++ config/testdata/config.yml | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 config/testdata/config.yml diff --git a/config/config.go b/config/config.go index 4748b685..610c7014 100644 --- a/config/config.go +++ b/config/config.go @@ -1,6 +1,8 @@ package config import ( + "fmt" + "io" "os" "strings" @@ -25,7 +27,7 @@ func NewService(logger log.Logger) Service { func (s *Service) Load(config interface{}) error { if err := s.LoadFile(pkger.Include("/configs/config.default.yml"), config); err != nil { - return err + s.logger.LogErrorf("loading default config file using pkger: %w", err) } if err := LoadEnvironmentFile(s.logger, APP_CONFIG, config); err != nil { @@ -45,12 +47,29 @@ func (s *Service) LoadFile(file string, config interface{}) error { f, err := pkger.Open(file) if err != nil { - return logger.LogErrorf("pkger unable to load %s: %w", file, err).Err() + return fmt.Errorf("pkger unable to load %s: %w", file, err) } deflt := viper.New() deflt.SetConfigType("yaml") if err := deflt.ReadConfig(f); err != nil { + return fmt.Errorf("unable to load the defaults: %w", err) + } + + if err := deflt.Unmarshal(config); err != nil { + return fmt.Errorf("unable to unmarshal the defaults: %w", err) + } + + return nil +} + +func (s *Service) LoadFromReader(in io.Reader, config interface{}) error { + logger := s.logger + logger.Info().Logf("loading config file from reader") + + deflt := viper.New() + deflt.SetConfigType("yaml") + if err := deflt.ReadConfig(in); err != nil { return logger.LogErrorf("unable to load the defaults: %w", err).Err() } diff --git a/config/config_test.go b/config/config_test.go index b4eb506d..3105098c 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,6 +1,7 @@ package config_test import ( + "embed" "os" "testing" @@ -17,6 +18,7 @@ type ConfigModel struct { Default string App string Secret string + Custom string } func Test_Load(t *testing.T) { @@ -37,3 +39,20 @@ func Test_Load(t *testing.T) { require.Equal(t, "app", cfg.Config.App) require.Equal(t, "keep secret!", cfg.Config.Secret) } + +//go:embed testdata/*.yml +var configs embed.FS + +func Test_LoadFile(t *testing.T) { + cfg := &GlobalConfigModel{} + + service := config.NewService(log.NewDefaultLogger()) + + file, err := configs.Open("testdata/config.yml") + require.NoError(t, err) + + err = service.LoadFromReader(file, cfg) + require.NoError(t, err) + + require.Equal(t, "custom", cfg.Config.Custom) +} diff --git a/config/testdata/config.yml b/config/testdata/config.yml new file mode 100644 index 00000000..6c128f6f --- /dev/null +++ b/config/testdata/config.yml @@ -0,0 +1,2 @@ +Config: + Custom: "custom"