// Package settings owns this project's configuration; it adds no business identity model. package config import ( "errors" "os" "strings" "time" "git.yuntuo.hk/k2safe/go-omni/config" "git.yuntuo.hk/k2safe/go-omni/logx" ) 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 uses defaults -> strict YAML/JSON -> nonempty environment variables. // Pass an empty path to use only defaults and environment. func Load(path string) (Config, error) { cfg := Default() var err error if path != "" { cfg, err = config.DecodeFile(path, cfg) if err != nil { return Config{}, err } } cfg.Server, err = config.ApplyEnv(cfg.Server, "") if err != nil { return Config{}, err } // A stream explicitly selected by environment overrides a file profile. if output := strings.TrimSpace(os.Getenv("GO_OMNI_LOG_OUTPUT")); output != "" && strings.TrimSpace(os.Getenv("GO_OMNI_LOG_FILE")) == "" { cfg.Server.Log.File = "" cfg.Server.Log.Rotation = logx.RotationConfig{} } if err = cfg.Validate(); err != nil { return Config{}, err } return cfg, nil } func (c Config) Validate() error { if err := c.Server.Validate(); err != nil { return err } if c.Server.Log.Format != "json" && c.Server.Log.Format != "text" { return errors.New("log.format must be json or text") } switch strings.ToLower(c.Server.Log.Level) { case "debug", "info", "warn", "warning", "error": default: return errors.New("invalid log.level") } return nil }