diff --git a/getters.go b/getters.go index 24d92f4..3e5ef98 100644 --- a/getters.go +++ b/getters.go @@ -10,147 +10,177 @@ import ( func (c *ConfigManager) GetBool(key string) bool { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - val := v.Value - switch val := val.(type) { - case bool: - return val - case string: - if strings.ToLower(val) == "true" { - return true - } + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return false - case int: - if val == 0 { - return false - } - return true - case float32, float64: - if val == 0 { - return false - } - return true - case nil: - return false - case time.Duration: - if val == 0 || val < 0 { - return false - } - return true - default: - return val.(bool) } } - return false + val := v.Value + switch val := val.(type) { + case bool: + return val + case string: + if strings.ToLower(val) == "true" { + return true + } + return false + case int: + if val == 0 { + return false + } + return true + case float32, float64: + if val == 0 { + return false + } + return true + case nil: + return false + case time.Duration: + if val == 0 || val < 0 { + return false + } + return true + default: + return val.(bool) + } } func (c *ConfigManager) GetDuration(key string) time.Duration { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - val := v.Value - switch val := val.(type) { - case time.Duration: - return val - case string: - d, err := time.ParseDuration(val) - if err != nil { - return 0 - } - return d - case int: - return time.Duration(val) - case float32: - return time.Duration(val) - case float64: - return time.Duration(val) - case nil: + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return 0 - default: - return val.(time.Duration) } } - return 0 + val := v.Value + switch val := val.(type) { + case time.Duration: + return val + case string: + d, err := time.ParseDuration(val) + if err != nil { + return 0 + } + return d + case int: + return time.Duration(val) + case float32: + return time.Duration(val) + case float64: + return time.Duration(val) + case nil: + return 0 + default: + return val.(time.Duration) + + } } func (c *ConfigManager) GetString(key string) string { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - switch val := v.Value.(type) { - case string: - return val - default: - return fmt.Sprintf("%v", v.Value) + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { + return "" } } - return "" + + switch val := v.Value.(type) { + case string: + return val + default: + return fmt.Sprintf("%v", v.Value) + } } func (c *ConfigManager) GetStringMap(key string) map[string]any { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - switch val := v.Value.(type) { - case map[string]any: - return val - default: + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return nil } } - return nil + switch val := v.Value.(type) { + case map[string]any: + return val + default: + return nil + } } func (c *ConfigManager) GetStringSlice(key string) []string { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - switch val := v.Value.(type) { - case []string: - return val - default: + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return nil } } - return nil + switch val := v.Value.(type) { + case []string: + return val + default: + return nil + } } func (c *ConfigManager) GetInt(key string) int { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - switch val := v.Value.(type) { - case int: - return val - case string: - i, err := strconv.Atoi(val) - if err != nil { - return 0 - } - return i - case float32: - return int(val) - case float64: - return int(val) - case nil: + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return 0 - default: - return val.(int) } } - return 0 + switch val := v.Value.(type) { + case int: + return val + case string: + i, err := strconv.Atoi(val) + if err != nil { + return 0 + } + return i + case float32: + return int(val) + case float64: + return int(val) + case nil: + return 0 + default: + return 0 + } } func (c *ConfigManager) GetIntSlice(key string) []int { c.mutex.RLock() defer c.mutex.RUnlock() - if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { - switch val := v.Value.(type) { - case []int: - return val - default: + v, ok := c.combinedConfig[strings.ToLower(key)] + if !ok { + v, ok = c.envConfig[strings.ToLower(key)] + if !ok { return nil } } - return nil + switch val := v.Value.(type) { + case []int: + return val + default: + return nil + } } diff --git a/jety.go b/jety.go index 3873cac..2762c06 100644 --- a/jety.go +++ b/jety.go @@ -28,6 +28,7 @@ type ( ConfigManager struct { configName string + configPath string configFileUsed string configType configType envPrefix string @@ -201,6 +202,12 @@ func readFile(filename string, fileType configType) (map[string]any, error) { } } +func (c *ConfigManager) SetConfigDir(path string) { + c.mutex.Lock() + defer c.mutex.Unlock() + c.configPath = name +} + func (c *ConfigManager) SetConfigName(name string) { c.mutex.Lock() defer c.mutex.Unlock() diff --git a/setters.go b/setters.go index 4133e95..36226d0 100644 --- a/setters.go +++ b/setters.go @@ -9,6 +9,7 @@ func (c *ConfigManager) SetBool(key string, value bool) { defer c.mutex.Unlock() lower := strings.ToLower(key) c.mapConfig[lower] = ConfigMap{Key: key, Value: value} + c.combinedConfig[lower] = ConfigMap{Key: key, Value: value} } func (c *ConfigManager) SetString(key string, value string) { @@ -16,6 +17,7 @@ func (c *ConfigManager) SetString(key string, value string) { defer c.mutex.Unlock() lower := strings.ToLower(key) c.mapConfig[lower] = ConfigMap{Key: key, Value: value} + c.combinedConfig[lower] = ConfigMap{Key: key, Value: value} } func (c *ConfigManager) Set(key string, value any) { @@ -23,6 +25,7 @@ func (c *ConfigManager) Set(key string, value any) { defer c.mutex.Unlock() lower := strings.ToLower(key) c.mapConfig[lower] = ConfigMap{Key: key, Value: value} + c.combinedConfig[lower] = ConfigMap{Key: key, Value: value} } func (c *ConfigManager) SetDefault(key string, value any) { @@ -30,4 +33,10 @@ func (c *ConfigManager) SetDefault(key string, value any) { defer c.mutex.Unlock() lower := strings.ToLower(key) c.defaultConfig[lower] = ConfigMap{Key: key, Value: value} + if _, ok := c.mapConfig[lower]; !ok { + if envVal, ok := c.envConfig[lower]; !ok { + c.mapConfig[lower] = envVal + c.combinedConfig[lower] = envVal + } + } }