package config import ( "flag" "fmt" "os" "strconv" "strings" "time" ) func getEnvKey(key string) string { return fmt.Sprintf("YTDL_WEB_%s", strings.ReplaceAll(strings.ToUpper(key), ".", "_")) } func String(key string, defaultValue string, usage string) func() string { flagValue := flag.String(key, defaultValue, usage) return func() string { if flagValue != nil && *flagValue != defaultValue { return *flagValue } envValue, ok := os.LookupEnv(getEnvKey(key)) if ok { return envValue } return defaultValue } } func Int(key string, defaultValue int, usage string) func() int { flagValue := flag.Int(key, defaultValue, usage) return func() int { if flagValue != nil && *flagValue != defaultValue { return *flagValue } envValue, ok := os.LookupEnv(getEnvKey(key)) if ok { value, err := strconv.Atoi(envValue) if err == nil { return value } } return defaultValue } } func Bool(key string, defaultValue bool, usage string) func() bool { flagValue := flag.Bool(key, defaultValue, usage) return func() bool { if flagValue != nil && *flagValue != defaultValue { return *flagValue } envValue, ok := os.LookupEnv(getEnvKey(key)) if ok { value, err := strconv.ParseBool(envValue) if err == nil { return value } } return defaultValue } } func StringSlice(key string, defaultValue []string, usage string) func() []string { defaultString := strings.Join(defaultValue, ",") flagValue := flag.String(key, defaultString, usage) return func() []string { if flagValue != nil && *flagValue != defaultString { return strings.Split(*flagValue, ",") } envValue, ok := os.LookupEnv(getEnvKey(key)) if ok { return strings.Split(envValue, ",") } return defaultValue } } func Duration(key string, defaultValue time.Duration, usage string) func() time.Duration { flagValue := flag.Duration(key, defaultValue, usage) return func() time.Duration { if flagValue != nil && *flagValue != defaultValue { return *flagValue } envValue, ok := os.LookupEnv(getEnvKey(key)) if ok { value, err := time.ParseDuration(envValue) if err == nil { return value } } return defaultValue } }