From 0b9d236a15e44032f3b85157434861648100bb69 Mon Sep 17 00:00:00 2001 From: Jianhui Zhao Date: Thu, 31 Jul 2025 22:23:24 +0800 Subject: [PATCH] Optimize configuration parsing Reduce redundant code and add fault tolerance handling Signed-off-by: Jianhui Zhao --- config.go | 119 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 50 deletions(-) diff --git a/config.go b/config.go index 7b41252..73d1a42 100644 --- a/config.go +++ b/config.go @@ -26,87 +26,106 @@ package main import ( "fmt" - "strconv" "github.com/kylelemons/go-gypsy/yaml" "github.com/urfave/cli/v3" ) type Config struct { - AddrDev string - AddrUser string - AddrHttpProxy string + AddrDev string + AddrUser string + AddrHttpProxy string + HttpProxyRedirURL string HttpProxyRedirDomain string - Token string - DevHookUrl string - UserHookUrl string - LocalAuth bool - Password string - AllowOrigins bool - PprofAddr string + + Token string + DevHookUrl string + UserHookUrl string + LocalAuth bool + Password string + AllowOrigins bool + + PprofAddr string } func (cfg *Config) Parse(c *cli.Command) error { + var yamlCfg *yaml.File + var err error + conf := c.String("conf") if conf != "" { - err := parseYamlCfg(cfg, conf) + yamlCfg, err = yaml.ReadFile(conf) if err != nil { - return err + return fmt.Errorf(`read config file: %s`, err.Error()) } + } - getFlagOpt(c, "addr-dev", &cfg.AddrDev) - getFlagOpt(c, "addr-user", &cfg.AddrUser) - getFlagOpt(c, "addr-http-proxy", &cfg.AddrHttpProxy) - getFlagOpt(c, "http-proxy-redir-url", &cfg.HttpProxyRedirURL) - getFlagOpt(c, "http-proxy-redir-domain", &cfg.HttpProxyRedirDomain) - getFlagOpt(c, "dev-hook-url", &cfg.DevHookUrl) - getFlagOpt(c, "user-hook-url", &cfg.UserHookUrl) - getFlagOpt(c, "local-auth", &cfg.LocalAuth) - getFlagOpt(c, "token", &cfg.Token) - getFlagOpt(c, "password", &cfg.Password) - getFlagOpt(c, "allow-origins", &cfg.AllowOrigins) - getFlagOpt(c, "pprof", &cfg.PprofAddr) + fields := map[string]any{ + "addr-dev": &cfg.AddrDev, + "addr-user": &cfg.AddrUser, + "addr-http-proxy": &cfg.AddrHttpProxy, + + "http-proxy-redir-url": &cfg.HttpProxyRedirURL, + "http-proxy-redir-domain": &cfg.HttpProxyRedirDomain, + + "token": &cfg.Token, + "dev-hook-url": &cfg.DevHookUrl, + "user-hook-url": &cfg.UserHookUrl, + "local-auth": &cfg.LocalAuth, + "password": &cfg.Password, + "allow-origins": &cfg.AllowOrigins, + + "pprof": &cfg.PprofAddr, + } + + for name, opt := range fields { + if yamlCfg != nil { + if err = getConfigOpt(yamlCfg, name, opt); err != nil { + return err + } + } + + getFlagOpt(c, name, opt) + } return nil } -func getConfigOpt(yamlCfg *yaml.File, name string, opt any) { - val, err := yamlCfg.Get(name) - if err != nil { - return - } +func getConfigOpt(yamlCfg *yaml.File, name string, opt any) error { + var err error switch opt := opt.(type) { case *string: - *opt = val + var val string + val, err = yamlCfg.Get(name) + if err == nil { + *opt = val + } case *int: - *opt, _ = strconv.Atoi(val) + var val int64 + val, err = yamlCfg.GetInt(name) + if err == nil { + *opt = int(val) + } case *bool: - *opt, _ = strconv.ParseBool(val) + var val bool + val, err = yamlCfg.GetBool(name) + if err == nil { + *opt = val + } + default: + return fmt.Errorf("unsupported type for option %s", name) } -} -func parseYamlCfg(cfg *Config, conf string) error { - yamlCfg, err := yaml.ReadFile(conf) if err != nil { - return fmt.Errorf(`read config file: %s`, err.Error()) + if _, ok := err.(*yaml.NodeNotFound); ok { + return nil + } + return fmt.Errorf(`invalud "%s": %w`, name, err) } - getConfigOpt(yamlCfg, "addr-dev", &cfg.AddrDev) - getConfigOpt(yamlCfg, "addr-user", &cfg.AddrUser) - getConfigOpt(yamlCfg, "addr-http-proxy", &cfg.AddrHttpProxy) - getConfigOpt(yamlCfg, "http-proxy-redir-url", &cfg.HttpProxyRedirURL) - getConfigOpt(yamlCfg, "http-proxy-redir-domain", &cfg.HttpProxyRedirDomain) - - getConfigOpt(yamlCfg, "token", &cfg.Token) - getConfigOpt(yamlCfg, "dev-hook-url", &cfg.DevHookUrl) - getConfigOpt(yamlCfg, "user-hook-url", &cfg.UserHookUrl) - getConfigOpt(yamlCfg, "local-auth", &cfg.LocalAuth) - getConfigOpt(yamlCfg, "password", &cfg.Password) - getConfigOpt(yamlCfg, "allow-origins", &cfg.AllowOrigins) - return nil }