summaryrefslogtreecommitdiff
path: root/init.go
blob: 4db6315529d3bfc6a86ee9a35722e5767061939b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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/<appname>/<appname>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
}