| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | package config | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-02-09 09:44:35 -06:00
										 |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 	"os" | 
					
						
							|  |  |  | 	fp "path/filepath" | 
					
						
							| 
									
										
										
										
											2024-02-09 09:44:35 -06:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-09 09:44:35 -06:00
										 |  |  | 	"codeberg.org/danjones000/my-log/tools" | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 	"github.com/BurntSushi/toml" | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | 	"github.com/caarlos0/env/v10" | 
					
						
							|  |  |  | 	mapst "github.com/mitchellh/mapstructure" | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ConfigPath string | 
					
						
							| 
									
										
										
										
											2024-02-11 13:50:27 -06:00
										 |  |  | var Overrides = map[string]string{} | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							|  |  |  | 	conf, _ := os.UserConfigDir() | 
					
						
							|  |  |  | 	ConfigPath = fp.Join(conf, "my-log", "config.toml") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Load() (Config, error) { | 
					
						
							|  |  |  | 	c, _ := DefaultConfig() | 
					
						
							|  |  |  | 	_, err := os.Stat(ConfigPath) | 
					
						
							| 
									
										
										
										
											2024-02-09 09:44:35 -06:00
										 |  |  | 	if !os.IsNotExist(err) { | 
					
						
							|  |  |  | 		_, err = toml.DecodeFile(ConfigPath, &c) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return c, err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | 	env.Parse(&c) | 
					
						
							| 
									
										
										
										
											2024-02-10 11:48:23 -06:00
										 |  |  | 	c.Outputs["stdout"] = loadStdout(c.Outputs["stdout"]) | 
					
						
							| 
									
										
										
										
											2024-03-07 21:19:45 -06:00
										 |  |  | 	c.Formatters["json"] = loadJsonFormat(c.Formatters["json"]) | 
					
						
							| 
									
										
										
										
											2024-02-09 09:44:35 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	l := "" | 
					
						
							|  |  |  | 	for k, v := range Overrides { | 
					
						
							|  |  |  | 		val := tools.ParseString(v) | 
					
						
							|  |  |  | 		if val == nil { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if _, isJson := val.(json.RawMessage); isJson { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		valout := fmt.Sprintf("%v", val) | 
					
						
							|  |  |  | 		if vals, isString := val.(string); isString { | 
					
						
							|  |  |  | 			valout = fmt.Sprintf(`"%s"`, vals) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if valt, isTime := val.(time.Time); isTime { | 
					
						
							|  |  |  | 			valout = valt.Format(time.RFC3339) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		l = l + "\n" + fmt.Sprintf("%s = %s", k, valout) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_, err = toml.Decode(l, &c) | 
					
						
							| 
									
										
										
										
											2024-02-04 18:19:19 -06:00
										 |  |  | 	return c, err | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-10 11:48:23 -06:00
										 |  |  | func loadStdout(stdout Output) Output { | 
					
						
							|  |  |  | 	st := stdoutEnabled{stdout.Enabled} | 
					
						
							|  |  |  | 	env.Parse(&st) | 
					
						
							|  |  |  | 	stdout.Enabled = st.Enabled | 
					
						
							|  |  |  | 	var std Stdout | 
					
						
							|  |  |  | 	mapst.Decode(stdout.Config, &std) | 
					
						
							|  |  |  | 	env.Parse(&std) | 
					
						
							|  |  |  | 	mapst.Decode(std, &stdout.Config) | 
					
						
							|  |  |  | 	return stdout | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | func (oo Outputs) Stdout() (s Stdout, enabled bool) { | 
					
						
							|  |  |  | 	o, ok := oo["stdout"] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return s, false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-10 11:48:23 -06:00
										 |  |  | 	enabled = o.Enabled | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | 	mapst.Decode(o.Config, &s) | 
					
						
							| 
									
										
										
										
											2024-02-10 11:48:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-10 11:06:00 -06:00
										 |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-07 21:19:45 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | func loadJsonFormat(c map[string]any) map[string]any { | 
					
						
							|  |  |  | 	jf := JsonFormat{} | 
					
						
							|  |  |  | 	mapst.Decode(c, &jf) | 
					
						
							|  |  |  | 	env.Parse(&jf) | 
					
						
							|  |  |  | 	mapst.Decode(jf, &c) | 
					
						
							|  |  |  | 	return c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (ff Formatters) Json() (jf JsonFormat) { | 
					
						
							|  |  |  | 	o, ok := ff["json"] | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	mapst.Decode(o, &jf) | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } |