From 9e549f722fe3019566762753276c0ce8a4972a6b Mon Sep 17 00:00:00 2001 From: leandrofars Date: Tue, 6 Feb 2024 00:16:35 -0300 Subject: [PATCH] feat(ws): config package to load env and flags --- backend/services/ws/internal/config/config.go | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 backend/services/ws/internal/config/config.go diff --git a/backend/services/ws/internal/config/config.go b/backend/services/ws/internal/config/config.go new file mode 100644 index 0000000..59ce489 --- /dev/null +++ b/backend/services/ws/internal/config/config.go @@ -0,0 +1,103 @@ +// Loads environemnt variables and returns a config struct +package config + +import ( + "flag" + "log" + "os" + "strconv" + + "github.com/joho/godotenv" +) + +type Config struct { + Port string // server port: e.g. ":8080" + Token string // controller auth token +} + +func NewConfig() Config { + + //Defines log format + log.SetFlags(log.LstdFlags | log.Lshortfile) + + loadEnv() + + /* + App variables priority: + 1º - Flag through command line. + 2º - Env variables. + 3º - Default flag value. + */ + + /* ------------------------------ define flags ------------------------------ */ + flPort := flag.String("port", lookupEnvOrString("SERVER_PORT", ":8080"), "Server port") + flToken := flag.String("token", lookupEnvOrString("SERVER_AUTH_TOKEN", ""), "Controller auth token") + flHelp := flag.Bool("help", false, "Help") + flag.Parse() + /* -------------------------------------------------------------------------- */ + + if *flHelp { + flag.Usage() + os.Exit(0) + } + + return Config{ + Port: *flPort, + Token: *flToken, + } +} + +// Load environment variables from .env or .env.local file +func loadEnv() { + err := godotenv.Load() + if err != nil { + log.Println("Error to load environment variables:", err) + } + + localEnv := ".env.local" + if _, err := os.Stat(localEnv); err == nil { + _ = godotenv.Overload(localEnv) + log.Println("Loaded variables from '.env.local'") + } else { + log.Println("Loaded variables from '.env'") + } +} + +/* ---------------------------- helper functions ---------------------------- */ +/* + They are used to lookup if a environment variable is set with a value + different of "" and return it. + In case the var doesn't exist, it returns the default value. + Also, they're useful to convert the string value of vars to the desired type. +*/ + +func lookupEnvOrString(key string, defaultVal string) string { + if val, _ := os.LookupEnv(key); val != "" { + return val + } + return defaultVal +} + +func lookupEnvOrInt(key string, defaultVal int) int { + if val, _ := os.LookupEnv(key); val != "" { + v, err := strconv.Atoi(val) + if err != nil { + log.Fatalf("LookupEnvOrInt[%s]: %v", key, err) + } + return v + } + return defaultVal +} + +func lookupEnvOrBool(key string, defaultVal bool) bool { + if val, _ := os.LookupEnv(key); val != "" { + v, err := strconv.ParseBool(val) + if err != nil { + log.Fatalf("LookupEnvOrBool[%s]: %v", key, err) + } + return v + } + return defaultVal +} + +/* -------------------------------------------------------------------------- */