to Config struct for configging
This commit is contained in:
68
config.go
Normal file
68
config.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Port int
|
||||
AB 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
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user