91 lines
1.4 KiB
Go
91 lines
1.4 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
var config map[string]interface{}
|
|
|
|
func Load(path string) error {
|
|
err := loadConfigFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
env := os.Getenv("addrss_ENVIRONMENT")
|
|
if env != "" {
|
|
path = strings.ReplaceAll(path, ".json", "."+env+".json")
|
|
err = loadConfigFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetString(key string) (string, error) {
|
|
v, err := Get(key)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return v.(string), nil
|
|
}
|
|
|
|
func GetInt64(key string) (int64, error) {
|
|
v, err := Get(key)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return int64(v.(float64)), nil
|
|
}
|
|
|
|
func GetBool(key string) (bool, error) {
|
|
v, err := Get(key)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return v.(bool), nil
|
|
}
|
|
|
|
func Get(key string) (interface{}, error) {
|
|
value, ok := config[key]
|
|
if !ok {
|
|
return nil, fmt.Errorf("configuration value not found for key %s", key)
|
|
}
|
|
|
|
switch v := value.(type) {
|
|
case string:
|
|
if strings.Contains(v, "{{") && strings.Contains(v, "}}") {
|
|
_, a, _ := strings.Cut(v, "{{")
|
|
envVar, _, _ := strings.Cut(a, "}}")
|
|
|
|
value = strings.ReplaceAll(v, "{{"+envVar+"}}", os.Getenv(envVar))
|
|
}
|
|
return value, nil
|
|
|
|
default:
|
|
return value, nil
|
|
}
|
|
}
|
|
|
|
func loadConfigFile(path string) error {
|
|
contents, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = json.Unmarshal(contents, &config)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|