api/internal/config/loading.go
Peter Kurfer 9236a38be0 Moved endpoint handling to new module
- introduce new endpoints module
- introduce Endpoint and EndpointManager
- introduce new Logging abstraction API to allow proper mocking
- add error return value to Start and Shutdown of endpoints
- add mocks of some internals to allow easier testing
- add generate target to take care of all code generation
2020-04-14 00:15:33 +02:00

55 lines
1.3 KiB
Go

package config
import (
"github.com/baez90/inetmock/pkg/logging"
"github.com/baez90/inetmock/pkg/path"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"go.uber.org/zap"
"strings"
)
func CreateConfig() Config {
logger, _ := logging.CreateLogger()
return &config{
logger: logger.Named("Config"),
}
}
type Config interface {
InitConfig(flags *pflag.FlagSet)
ReadConfig(configFilePath string) error
}
type config struct {
logger logging.Logger
}
func (c config) InitConfig(flags *pflag.FlagSet) {
viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath("/etc/inetmock/")
viper.AddConfigPath("$HOME/.inetmock")
viper.AddConfigPath(".")
viper.SetEnvPrefix("INetMock")
_ = viper.BindPFlags(flags)
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
viper.AutomaticEnv()
}
func (c *config) ReadConfig(configFilePath string) (err error) {
if configFilePath != "" && path.FileExists(configFilePath) {
c.logger.Info(
"loading config from passed config file path",
zap.String("configFilePath", configFilePath),
)
viper.SetConfigFile(configFilePath)
}
if err = viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
err = nil
c.logger.Warn("failed to load config")
}
}
return
}