package env import ( "fmt" "os" "os/user" "path/filepath" "strings" ) // this is an experiment at this point to // see how this turns out // normally called by "argv" (go.wit.com/lib/protobuf/argvpb) func Init(appname, version, buildtime string, fromargv []string, goodFunc func(string), badFunc func(string, error)) { APPNAME = appname VERSION = version BUILDTIME = buildtime argv = fromargv goodExit = goodFunc badExit = badFunc if envPB != nil { // fmt.Println("Init() already ran") return } envPB = NewKeys() envPB.Init = true envPB.HomeDir, _ = os.UserHomeDir() loadAppENV() SetGlobal("lib/env", "APPNAME", APPNAME) SetGlobal("lib/env", "VERSION", VERSION) SetGlobal("lib/env", "BUILDTIME", BUILDTIME) usr, err := user.Current() if err == nil { SetGlobal("lib/env", "username", usr.Username) } homedir, err := os.UserHomeDir() if err == nil { SetGlobal("lib/env", "homedir", homedir) } } // if it exists, loads ~/.config//rc func loadAppENV() error { configDir, err := os.UserConfigDir() if err != nil { return err } { // old way. remove the file after read envPB.Filename = filepath.Join(configDir, APPNAME, APPNAME+".ENV") data, err := os.ReadFile(envPB.Filename) if err == nil { parseENV(string(data)) os.Remove(envPB.Filename) } } envPB.Filename = filepath.Join(configDir, APPNAME, APPNAME+"rc") data, err := os.ReadFile(envPB.Filename) if err == nil { parseENV(string(data)) } return err } func InitValid() bool { if envPB == nil { // todo: track that the application did not init envPB = NewKeys() return false } return envPB.Init } // only allow super simple files func parseENV(data string) { var helptext string // fmt.Println("loadENV()", filename) for _, line := range strings.Split(data, "\n") { line = strings.TrimSpace(line) if line == "" { // ignore empty lines continue } if strings.HasPrefix(line, "#") { // save notes & instructions from the config file helptext += line + "\n" continue } parts := strings.Split(line, "=") if len(parts) != 2 { // fmt.Println("INVALID LINE:", i, line) continue } varname := parts[0] varname = strings.TrimSpace(varname) if varname == "" { // ignore empty varname continue } // check for duplicates here found := envPB.FindByVar(varname) if found != nil { // varname alrady set continue } value := parts[1] value = strings.Trim(value, "'\"") saveMu.Lock() saveMu.Unlock() c := new(Key) c.Var = varname c.Value = value c.Help = helptext helptext = "" envPB.Append(c) } } func LoadENV(filename string) error { fpath := FullPath(filename) fmt.Println("LoadENV", fpath) data, err := os.ReadFile(fpath) if err == nil { parseFileData(filename, string(data)) } return err }