package config import ( "strings" "time" "git.yuntuo.hk/k2safe/go-omni/logx" ) const defaultRequestIDHeader = "X-Request-ID" // Config controls the default runtime behavior of an App. type Config struct { Mode string Address string RequestIDHeader string EnableLogger bool ShutdownTimeout time.Duration Log logx.Config } func Default() Config { return Config{ Address: ":8080", RequestIDHeader: defaultRequestIDHeader, ShutdownTimeout: 10 * time.Second, Log: logx.Default(), } } // Validate checks configuration values before an application starts. func (c Config) Validate() error { if strings.TrimSpace(c.Address) == "" { return &ConfigError{Field: "address", Message: "is required"} } if strings.TrimSpace(c.RequestIDHeader) == "" { return &ConfigError{Field: "request_id_header", Message: "is required"} } if c.ShutdownTimeout <= 0 { return &ConfigError{Field: "shutdown_timeout", Message: "must be positive"} } return nil } // ConfigError describes an invalid application configuration field. type ConfigError struct { Field string Message string } func (e *ConfigError) Error() string { return "config " + e.Field + " " + e.Message } // Option changes an App's configuration. type Option func(*Config) // WithMode sets the default transport's running mode. func WithMode(mode string) Option { return func(cfg *Config) { cfg.Mode = mode } } // WithRequestIDHeader changes the header used to read and return request IDs. func WithRequestIDHeader(header string) Option { return func(cfg *Config) { if value := strings.TrimSpace(header); value != "" { cfg.RequestIDHeader = value } } } // WithLogger enables GoOmni's structured access logger. func WithLogger(enabled bool) Option { return func(cfg *Config) { cfg.EnableLogger = enabled } } // WithConfig applies a complete configuration loaded from a file or // environment. Later options can still override individual fields. func WithConfig(settings Config) Option { return func(cfg *Config) { *cfg = settings } } // WithLogConfig configures the logger used by the application runtime. func WithLogConfig(settings logx.Config) Option { return func(cfg *Config) { cfg.Log = settings } } // WithShutdownTimeout controls how long RunContext waits for active requests. func WithShutdownTimeout(timeout time.Duration) Option { return func(cfg *Config) { if timeout > 0 { cfg.ShutdownTimeout = timeout } } }