diff --git a/config/config.go b/config/config.go index 72eec7a9..c8243110 100644 --- a/config/config.go +++ b/config/config.go @@ -40,3 +40,14 @@ type Config interface { // Next() (, error) // Stop() error //} + +// Load loads config from config sources +func Load(ctx context.Context, cs ...Config) error { + var err error + for _, c := range cs { + if err = c.Load(ctx); err != nil { + return err + } + } + return nil +} diff --git a/config/default.go b/config/default.go index 7ee22fda..39cc3ff1 100644 --- a/config/default.go +++ b/config/default.go @@ -23,12 +23,24 @@ func (c *defaultConfig) Init(opts ...Option) error { } func (c *defaultConfig) Load(ctx context.Context) error { + for _, fn := range c.opts.BeforeLoad { + if err := fn(ctx, c); err != nil { + return err + } + } + valueOf := reflect.ValueOf(c.opts.Struct) if err := c.fillValues(ctx, valueOf); err != nil { return err } + for _, fn := range c.opts.AfterLoad { + if err := fn(ctx, c); err != nil { + return err + } + } + return nil } @@ -208,6 +220,18 @@ func (c *defaultConfig) fillValues(ctx context.Context, valueOf reflect.Value) e } func (c *defaultConfig) Save(ctx context.Context) error { + for _, fn := range c.opts.BeforeSave { + if err := fn(ctx, c); err != nil { + return err + } + } + + for _, fn := range c.opts.AfterSave { + if err := fn(ctx, c); err != nil { + return err + } + } + return nil }