Files
Gokapi/internal/environment/Environment.go
2021-04-15 15:22:23 +02:00

131 lines
3.0 KiB
Go

package environment
import (
"os"
"reflect"
"strconv"
"strings"
)
// IsTrue is a placeholder for yes
const IsTrue = "yes"
// IsFalse is a placeholder for no
const IsFalse = "no"
// Environment is a struct containing available env variables
type Environment struct {
ConfigDir string
ConfigFile string
ConfigPath string
DataDir string
AdminName string
AdminPassword string
WebserverPort string
WebserverLocalhost string
ExternalUrl string
RedirectUrl string
SaltAdmin string
SaltFiles string
LengthId int
}
var defaultValues = defaultsEnvironment{
CONFIG_DIR: "config",
CONFIG_FILE: "config.json",
DATA_DIR: "data",
LENGTH_ID: 15,
}
// New parses the env variables
func New() Environment {
configDir := envString("CONFIG_DIR")
configFile := envString("CONFIG_FILE")
configPath := configDir + "/" + configFile
return Environment{
ConfigDir: configDir,
ConfigFile: configFile,
ConfigPath: configPath,
DataDir: envString("DATA_DIR"),
AdminName: envString("USERNAME"),
AdminPassword: envString("PASSWORD"),
WebserverPort: envString("PORT"),
ExternalUrl: envString("EXTERNAL_URL"),
RedirectUrl: envString("REDIRECT_URL"),
SaltAdmin: envString("SALT_ADMIN"),
SaltFiles: envString("SALT_FILES"),
WebserverLocalhost: envBool("LOCALHOST"),
LengthId: envInt("LENGTH_ID", 5),
}
}
// Looks up an environment variable or returns an empty string
func envString(key string) string {
val, ok := os.LookupEnv("GOKAPI_" + key)
if !ok {
return defaultValues.getString(key)
}
return val
}
// Looks up a boolean environment variable, returns either IsFalse or IsTrue
func envBool(key string) string {
val, ok := os.LookupEnv("GOKAPI_" + key)
if !ok {
return ""
}
valLower := strings.ToLower(val)
if valLower == "true" || valLower == "yes" {
return IsTrue
}
if valLower == "false" || valLower == "no" {
return IsFalse
}
return ""
}
// Looks up an environment variable or returns an empty string
func envInt(key string, minValue int) int {
val, ok := os.LookupEnv("GOKAPI_" + key)
if !ok {
return defaultValues.getInt(key)
}
intVal, err := strconv.Atoi(val)
if err != nil {
return -1
}
if intVal < minValue {
return minValue
}
return intVal
}
// Gets the env variable or default value as string
func (structPointer *defaultsEnvironment) getString(name string) string {
field := reflect.ValueOf(structPointer).Elem().FieldByName(name)
if field.IsValid() {
return field.String()
}
return ""
}
// Gets the env variable or default value as int
func (structPointer *defaultsEnvironment) getInt(name string) int {
field := reflect.ValueOf(structPointer).Elem().FieldByName(name)
if field.IsValid() {
return int(field.Int())
}
return -1
}
type defaultsEnvironment struct {
CONFIG_DIR string
CONFIG_FILE string
DATA_DIR string
SALT_ADMIN string
SALT_FILES string
LENGTH_ID int
}