spoc-bot-vr/config.go

77 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"fmt"
"os"
"regexp"
"slices"
"strconv"
"strings"
)
type Config struct {
Port int
InitializeSlack bool
SlackToken string
SlackChannels string
}
func newConfig() (Config, error) {
return newConfigFromEnv(os.Getenv)
}
func newConfigFromEnv(getEnv func(string) string) (Config, error) {
def := Config{
Port: 8080,
}
var m map[string]any
if b, err := json.Marshal(def); err != nil {
return Config{}, err
} else if err := json.Unmarshal(b, &m); err != nil {
return Config{}, err
}
re := regexp.MustCompile(`[A-Z]`)
for k, v := range m {
envK := k
idxes := re.FindAllIndex([]byte(envK), -1)
slices.Reverse(idxes)
for _, idx := range idxes {
if idx[0] > 0 {
envK = fmt.Sprintf("%s_%s", envK[:idx[0]], envK[idx[0]:])
}
}
envK = strings.ToUpper(envK)
s := getEnv(envK)
if s == "" {
continue
}
switch v.(type) {
case string:
m[k] = s
case int64, float64:
n, err := strconv.ParseFloat(s, 32)
if err != nil {
return Config{}, err
}
m[k] = n
case bool:
got, err := strconv.ParseBool(s)
if err != nil {
return Config{}, err
}
m[k] = got
}
}
var result Config
if b, err := json.Marshal(m); err != nil {
return Config{}, err
} else if err := json.Unmarshal(b, &result); err != nil {
return Config{}, err
}
return result, nil
}