65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package config
|
|
|
|
import (
|
|
"git.yuntuo.hk/k2safe/go-omni/config"
|
|
"git.yuntuo.hk/k2safe/go-omni/logx"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
Server config.Config `json:"server"`
|
|
}
|
|
|
|
func Default() Config {
|
|
server := config.Default()
|
|
server.Address = "127.0.0.1:8080"
|
|
server.EnableLogger = true
|
|
server.SlowRequestThreshold = 500 * time.Millisecond
|
|
server.Log.Service = "example.com/managed"
|
|
server.Log.Format = "json"
|
|
server.Log.Output = "stderr"
|
|
return Config{Server: server}
|
|
}
|
|
|
|
// Load applies defaults -> file -> typed environment -> validation.
|
|
// New fields automatically use GO_OMNI_<JSON_PATH>, or an explicit env tag.
|
|
func Load(path string) (Config, error) {
|
|
cfg := Default()
|
|
var err error
|
|
cfg, err = config.ApplyDefaults(cfg)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
if path != "" {
|
|
cfg, err = config.DecodeFile(path, cfg)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
}
|
|
cfg, err = config.OverlayEnv(cfg, config.EnvOptions{Prefix: "GO_OMNI_", Empty: "ignore", Aliases: config.ServerEnvAliases("GO_OMNI_", "server")})
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
output, outputSet := os.LookupEnv("GO_OMNI_SERVER_LOG_OUTPUT")
|
|
if !outputSet {
|
|
output = os.Getenv("GO_OMNI_LOG_OUTPUT")
|
|
}
|
|
file, fileSet := os.LookupEnv("GO_OMNI_SERVER_LOG_FILE")
|
|
if !fileSet {
|
|
file = os.Getenv("GO_OMNI_LOG_FILE")
|
|
}
|
|
if output != "" && file == "" {
|
|
cfg.Server.Log.File = ""
|
|
cfg.Server.Log.Rotation = logx.RotationConfig{}
|
|
}
|
|
return cfg, cfg.Validate()
|
|
}
|
|
func (c Config) Validate() error {
|
|
if err := c.Server.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|