Separate formatters in config

This commit is contained in:
Dan Jones 2024-03-07 21:19:45 -06:00
commit da3b524925
6 changed files with 56 additions and 11 deletions

View file

@ -27,8 +27,14 @@ dotFolder = true
[output.stdout]
enabled = true
[output.stdout.config]
# Whether to output as JSON. Maybe useful to pipe elsewhere.
json = false
# Formatter to use when outputting to stdout
formatter = "plain"
[formatters]
[formatters.json]
# Set to true to pretty print JSON output
pretty_print = false
`

View file

@ -32,6 +32,7 @@ func Load() (Config, error) {
}
env.Parse(&c)
c.Outputs["stdout"] = loadStdout(c.Outputs["stdout"])
c.Formatters["json"] = loadJsonFormat(c.Formatters["json"])
l := ""
for k, v := range Overrides {
@ -77,3 +78,21 @@ func (oo Outputs) Stdout() (s Stdout, enabled bool) {
return
}
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
}

View file

@ -65,12 +65,25 @@ func TestStdoutMissing(t *testing.T) {
}
func TestStdoutLoad(t *testing.T) {
os.Setenv("LOG_STDOUT_JSON", "true")
defer os.Unsetenv("LOG_STDOUT_JSON")
os.Setenv("LOG_STDOUT_FORMATTER", "json")
defer os.Unsetenv("LOG_STDOUT_FORMATTER")
os.Setenv("LOG_STDOUT_ENABLED", "true")
defer os.Unsetenv("LOG_STDOUT_ENABLED")
c, _ := Load()
std, en := c.Outputs.Stdout()
assert.True(t, en)
assert.True(t, std.Json)
assert.Equal(t, "json", std.Formatter)
}
func TestFormatJson(t *testing.T) {
ff := Formatters{
"json": map[string]any{"pretty_print": true},
}
js := ff.Json()
assert.True(t, js.PrettyPrint)
ff = Formatters{}
js = ff.Json()
assert.False(t, js.PrettyPrint)
}

View file

@ -1,8 +1,9 @@
package config
type Config struct {
Input Input
Outputs Outputs `toml:"output"`
Input Input
Outputs Outputs `toml:"output"`
Formatters Formatters
}
type Input struct {
@ -20,9 +21,15 @@ type Output struct {
}
type Stdout struct {
Json bool `env:"LOG_STDOUT_JSON" mapstructure:"json"`
Formatter string `env:"LOG_STDOUT_FORMATTER" mapstructure:"formatter"`
}
type stdoutEnabled struct {
Enabled bool `env:"LOG_STDOUT_ENABLED"`
}
type Formatters map[string]map[string]any
type JsonFormat struct {
PrettyPrint bool `env:"LOG_JSON_PRETTY_PRINT" mapstructure:"pretty_print"`
}

View file

@ -6,7 +6,7 @@ import (
"codeberg.org/danjones000/my-log/config"
)
type formatMaker func(oo config.Outputs) (Formatter, error)
type formatMaker func(config.Formatters) (Formatter, error)
var formatterMap = map[string]formatMaker{
"plain": newPlain,
@ -19,7 +19,7 @@ func New(kind string) (f Formatter, err error) {
}
if make, ok := formatterMap[kind]; ok {
return make(conf.Outputs)
return make(conf.Formatters)
}
return nil, errors.New("unimplemented")

View file

@ -8,7 +8,7 @@ import (
"codeberg.org/danjones000/my-log/tools"
)
func newPlain(oo config.Outputs) (Formatter, error) {
func newPlain(ff config.Formatters) (Formatter, error) {
return &PlainText{}, nil
}