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_, 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 }