From 3688420246857df7e53546eb3e2e89a1d0be9427 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 22 Jul 2024 17:51:52 +0200 Subject: [PATCH] feat: centrally defined defaults --- cmd/root.go | 16 ++++++++-------- lib/config.go | 28 +++++++++++++++++++++++++++- lib/config_test.go | 8 ++++++++ 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 26937b3..8750993 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -19,14 +19,14 @@ import ( func init() { flags := rootCmd.Flags() flags.StringP("config", "c", "", "config file path") - flags.BoolP("tls", "t", false, "enable TLS") - flags.Bool("auth", false, "enable authentication") - flags.String("cert", "cert.pem", "path to TLS certificate") - flags.String("key", "key.pem", "path to TLS key") - flags.StringP("address", "a", "0.0.0.0", "address to listen on") - flags.StringP("port", "p", "0", "port to listen on") - flags.StringP("prefix", "P", "/", "URL path prefix") - flags.String("log_format", "console", "logging format") + flags.BoolP("tls", "t", lib.DefaultTLS, "enable TLS") + flags.Bool("auth", lib.DefaultAuth, "enable authentication") + flags.String("cert", lib.DefaultCert, "path to TLS certificate") + flags.String("key", lib.DefaultKey, "path to TLS key") + flags.StringP("address", "a", lib.DefaultAddress, "address to listen on") + flags.IntP("port", "p", lib.DefaultPort, "port to listen on") + flags.StringP("prefix", "P", lib.DefaultPrefix, "URL path prefix") + flags.String("log_format", lib.DefaultLogFormat, "logging format") } var rootCmd = &cobra.Command{ diff --git a/lib/config.go b/lib/config.go index a1e6b15..78b8d46 100644 --- a/lib/config.go +++ b/lib/config.go @@ -10,6 +10,17 @@ import ( "github.com/spf13/viper" ) +const ( + DefaultTLS = false + DefaultAuth = false + DefaultCert = "cert.pem" + DefaultKey = "key.pem" + DefaultAddress = "0.0.0.0" + DefaultPort = 0 + DefaultPrefix = "/" + DefaultLogFormat = "console" +) + type Config struct { Permissions `mapstructure:",squash"` Debug bool @@ -55,7 +66,17 @@ func ParseConfig(filename string, flags *pflag.FlagSet) (*Config, error) { v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) v.AutomaticEnv() - // Defaults + // Defaults shared with flags + v.SetDefault("TLS", DefaultTLS) + v.SetDefault("Cert", DefaultCert) + v.SetDefault("Key", DefaultKey) + v.SetDefault("Address", DefaultAddress) + v.SetDefault("Port", DefaultPort) + v.SetDefault("Auth", DefaultAuth) + v.SetDefault("Prefix", DefaultPrefix) + v.SetDefault("LogFormat", DefaultLogFormat) + + // Other defaults v.SetDefault("CORS.AllowedHeaders", []string{"*"}) v.SetDefault("CORS.AllowedHosts", []string{"*"}) v.SetDefault("CORS.AllowedMethods", []string{"*"}) @@ -108,6 +129,11 @@ func (c *Config) Validate() error { return errors.New("invalid config: auth cannot be disabled with users defined") } + c.Scope, err = filepath.Abs(c.Scope) + if err != nil { + return fmt.Errorf("invalid config: %w", err) + } + if c.TLS { if c.Cert == "" { return errors.New("invalid config: Cert must be defined if TLS is activated") diff --git a/lib/config_test.go b/lib/config_test.go index 4e3fb00..1094076 100644 --- a/lib/config_test.go +++ b/lib/config_test.go @@ -27,6 +27,14 @@ func TestConfigDefaults(t *testing.T) { cfg := writeAndParseConfig(t, "", ".yml") require.NoError(t, cfg.Validate()) + require.EqualValues(t, DefaultAuth, cfg.Auth) + require.EqualValues(t, DefaultTLS, cfg.TLS) + require.EqualValues(t, DefaultAddress, cfg.Address) + require.EqualValues(t, DefaultPort, cfg.Port) + require.EqualValues(t, DefaultPrefix, cfg.Prefix) + require.EqualValues(t, DefaultLogFormat, cfg.LogFormat) + require.NotEmpty(t, cfg.Scope) + require.EqualValues(t, []string{"*"}, cfg.CORS.AllowedHeaders) require.EqualValues(t, []string{"*"}, cfg.CORS.AllowedHosts) require.EqualValues(t, []string{"*"}, cfg.CORS.AllowedMethods)