2021-02-10 20:26:45 +00:00
|
|
|
package app
|
2020-04-27 22:26:15 +00:00
|
|
|
|
|
|
|
import (
|
2020-12-26 13:11:49 +00:00
|
|
|
"strings"
|
|
|
|
|
2020-04-27 22:26:15 +00:00
|
|
|
"github.com/spf13/viper"
|
2021-02-10 20:26:45 +00:00
|
|
|
"gitlab.com/inetmock/inetmock/internal/endpoint"
|
|
|
|
"gitlab.com/inetmock/inetmock/pkg/cert"
|
2020-12-26 13:11:49 +00:00
|
|
|
"gitlab.com/inetmock/inetmock/pkg/path"
|
2020-04-27 22:26:15 +00:00
|
|
|
)
|
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
func CreateConfig() Config {
|
2020-04-27 22:26:15 +00:00
|
|
|
configInstance := &config{
|
2021-02-10 20:26:45 +00:00
|
|
|
cfg: viper.New(),
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
configInstance.cfg.SetConfigName("config")
|
|
|
|
configInstance.cfg.SetConfigType("yaml")
|
|
|
|
configInstance.cfg.AddConfigPath("/etc/inetmock/")
|
|
|
|
configInstance.cfg.AddConfigPath("$HOME/.inetmock")
|
|
|
|
configInstance.cfg.AddConfigPath(".")
|
|
|
|
configInstance.cfg.SetEnvPrefix("INetMock")
|
|
|
|
configInstance.cfg.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
|
|
|
|
configInstance.cfg.AutomaticEnv()
|
|
|
|
|
|
|
|
for k, v := range registeredDefaults {
|
|
|
|
configInstance.cfg.SetDefault(k, v)
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, v := range registeredAliases {
|
|
|
|
configInstance.cfg.RegisterAlias(k, v)
|
|
|
|
}
|
|
|
|
|
2020-12-26 13:11:49 +00:00
|
|
|
return configInstance
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Config interface {
|
|
|
|
ReadConfig(configFilePath string) error
|
|
|
|
ReadConfigString(config, format string) error
|
2021-02-10 20:26:45 +00:00
|
|
|
TLSConfig() cert.CertOptions
|
2020-05-03 08:15:24 +00:00
|
|
|
APIConfig() RPC
|
2021-02-10 20:26:45 +00:00
|
|
|
ListenerSpecs() map[string]endpoint.ListenerSpec
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type config struct {
|
2020-06-15 10:04:08 +00:00
|
|
|
cfg *viper.Viper
|
2021-02-10 20:26:45 +00:00
|
|
|
TLS cert.CertOptions
|
|
|
|
Listeners map[string]endpoint.ListenerSpec
|
2020-06-15 10:04:08 +00:00
|
|
|
API RPC
|
2020-05-03 08:15:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *config) APIConfig() RPC {
|
|
|
|
return c.API
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *config) ReadConfigString(config, format string) (err error) {
|
|
|
|
c.cfg.SetConfigType(format)
|
|
|
|
if err = c.cfg.ReadConfig(strings.NewReader(config)); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
err = c.cfg.Unmarshal(c)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
func (c config) ListenerSpecs() map[string]endpoint.ListenerSpec {
|
|
|
|
return c.Listeners
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
|
2021-02-10 20:26:45 +00:00
|
|
|
func (c config) TLSConfig() cert.CertOptions {
|
2020-04-27 22:26:15 +00:00
|
|
|
return c.TLS
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *config) ReadConfig(configFilePath string) (err error) {
|
|
|
|
if configFilePath != "" && path.FileExists(configFilePath) {
|
|
|
|
c.cfg.SetConfigFile(configFilePath)
|
|
|
|
}
|
|
|
|
if err = c.cfg.ReadInConfig(); err != nil {
|
|
|
|
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
|
|
|
err = nil
|
2021-02-10 20:26:45 +00:00
|
|
|
} else {
|
|
|
|
return
|
2020-04-27 22:26:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err = c.cfg.Unmarshal(c)
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|