summaryrefslogtreecommitdiff
path: root/flags.go
blob: 7009970fe6ad99c65faf78bacd627a6516081e6e (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package log

/*
	Handles the on/off flags for things like log.Info() and log.Warn()
*/

import 	(
	"sync"
)

var INFO LogFlag
var VERBOSE LogFlag
var SPEW LogFlag
var WARN LogFlag
var ERROR LogFlag
var PRINTLN LogFlag

// writeMutex protects locks the write process
var flagsMutex sync.Mutex

type LogFlag struct {
	B	bool
	Default	bool	// set at the time of Registration()
	Name	string
	// TODO: figure out what package is sending the Registration
	Subsystem	string // probably should just be forced to be the package name
	Short	string	// string actually printed on each line
	Desc	string
}

var flags []*LogFlag

func init() {
	INFO.B = false
	INFO.Name = "INFO"
	INFO.Subsystem = "log"
	INFO.Desc = "Enable log.Info()"
	INFO.Register()

	SPEW.B = false
	SPEW.Name = "SPEW"
	SPEW.Subsystem = "log"
	SPEW.Desc = "Enable log.Spew()"
	SPEW.Register()

	VERBOSE.B = false
	VERBOSE.Name = "VERBOSE"
	VERBOSE.Subsystem = "log"
	VERBOSE.Desc = "Enable log.Verbose()"
	VERBOSE.Register()

	WARN.B = true
	WARN.Name = "WARN"
	WARN.Subsystem = "log"
	WARN.Desc = "Enable log.Warn()"
	WARN.Register()

	ERROR.B = true
	ERROR.Name = "ERROR"
	ERROR.Subsystem = "log"
	ERROR.Desc = "Enable log.Error()"
	ERROR.Register()

	PRINTLN.B = true
	PRINTLN.Name = "PRINTLN"
	PRINTLN.Subsystem = "log"
	PRINTLN.Desc = "Enable log.Println()"
	PRINTLN.Register()
}

// set all the flags
func SetAll(b bool) {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	for _, f := range flags {
		f.B = b
	}
}

// set all the flags
func SetDefaults() {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	for _, f := range flags {
		f.B = f.Default
	}
}

// this bypasses all checks and _always_ logs the info to STDOUT
// is this a bad idea? Probably not....
// TODO: returning []*LogFlag is not safe and access must be locked
// but this is only used by the log debugging window at this time
func ShowFlags() []*LogFlag {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	for _, f := range flags {
		Log(true, "ShowFlags() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
	}

	return flags
}

// TODO, switch to this 
func ProcessFlags(callback func(*LogFlag)) {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	for _, f := range flags {
		Log(true, "ProcessFlags() run callback(f) here on", f)
		callback(f)
	}

}


// register a variable name from a subsystem
// inspired by Alex Flint
// set the Default value at the time of registration
func (f *LogFlag) Register() {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	Info("log.Register() ", f)
	f.Default = f.B
	flags = append(flags,f)
}

func (f *LogFlag) Set(b bool) {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	Info("Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
	f.B = b
	Info("Set() f.B is now", f.B)
}

func Set(subsystem string, name string, b bool) {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	Verbose("log.Set() TODO find var:", "(" + subsystem + ")", name, "=", b)
	for _, f := range flags {
		Verbose("log.Set() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
		if (subsystem == f.Subsystem) && (name == f.Name) {
			Verbose("log.Set() FOUND ", f)
			f.B = b
			return
		}
	}

}

func Get(subsystem string, name string) bool {
	flagsMutex.Lock()
	defer flagsMutex.Unlock()
	Verbose("log.Get() TODO find var:", "(" + subsystem + ")", name)
	for _, f := range flags {
		Verbose("log.Get() ", "(" + f.Subsystem + ")", f.Name, "=", f.B, ":", f.Desc)
		if (subsystem == f.Subsystem) && (name == f.Name) {
			Verbose("log.Get() FOUND ", f)
			return f.B
		}
	}
	return false
}