7e11bf9a55
Create `config` package nearby storage node application. Implement `Config` as a wrapper over `viper.Viper` that provides the minimum functionality required by the application. The constructor allows you to read the config from the file. Methods are provided for reading subsections and values from the config tree. Helper functions are implemented to cast a value to native Go types. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
53 lines
1 KiB
Go
53 lines
1 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// Config represents a group of named values structured
|
|
// by tree type.
|
|
//
|
|
// Sub-trees are named configuration sub-sections,
|
|
// leaves are named configuration values.
|
|
// Names are of string type.
|
|
type Config viper.Viper
|
|
|
|
const (
|
|
separator = "."
|
|
envPrefix = "neofs"
|
|
envSeparator = "_"
|
|
)
|
|
|
|
// Prm groups required parameters of the Config.
|
|
type Prm struct{}
|
|
|
|
// New creates a new Config instance.
|
|
//
|
|
// If file option is provided (WithConfigFile),
|
|
// configuration values are read from it.
|
|
// Otherwise, Config is a degenerate tree.
|
|
func New(_ Prm, opts ...Option) *Config {
|
|
v := viper.New()
|
|
|
|
o := defaultOpts()
|
|
for i := range opts {
|
|
opts[i](o)
|
|
}
|
|
|
|
if o.path != "" {
|
|
v.SetEnvPrefix(envPrefix)
|
|
v.AutomaticEnv()
|
|
v.SetEnvKeyReplacer(strings.NewReplacer(separator, envSeparator))
|
|
v.SetConfigFile(o.path)
|
|
|
|
err := v.ReadInConfig()
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to read config: %v", err))
|
|
}
|
|
}
|
|
|
|
return (*Config)(v)
|
|
}
|