Parse env vars

This commit is contained in:
Dan Jones 2024-02-10 11:06:00 -06:00
commit 85f666cbc2
5 changed files with 57 additions and 17 deletions

View file

@ -9,6 +9,8 @@ import (
"codeberg.org/danjones000/my-log/tools" "codeberg.org/danjones000/my-log/tools"
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
"github.com/caarlos0/env/v10"
mapst "github.com/mitchellh/mapstructure"
) )
var ConfigPath string var ConfigPath string
@ -28,7 +30,8 @@ func Load() (Config, error) {
return c, err return c, err
} }
} }
// @todo get environ env.Parse(&c)
// @todo how to handle env on options so cli args aren't overwrittem?
l := "" l := ""
for k, v := range Overrides { for k, v := range Overrides {
@ -51,3 +54,19 @@ func Load() (Config, error) {
_, err = toml.Decode(l, &c) _, err = toml.Decode(l, &c)
return c, err return c, err
} }
func (oo Outputs) Stdout() (s Stdout, enabled bool) {
o, ok := oo["stdout"]
if !ok {
return s, false
}
st := struct {
Enabled bool `env:"LOG_STDOUT_ENABLED"`
}{o.Enabled}
env.Parse(&st)
enabled = st.Enabled
mapst.Decode(o.Config, &s)
env.Parse(&s)
return
}

View file

@ -13,6 +13,7 @@ import (
func TestLoad(t *testing.T) { func TestLoad(t *testing.T) {
f, _ := os.CreateTemp("", "test") f, _ := os.CreateTemp("", "test")
ConfigPath = f.Name() ConfigPath = f.Name()
defer f.Close()
fmt.Fprint(f, `[input] fmt.Fprint(f, `[input]
ext = "log"`) ext = "log"`)
c, err := Load() c, err := Load()
@ -20,6 +21,15 @@ ext = "log"`)
assert.Equal(t, "log", c.Input.Ext) assert.Equal(t, "log", c.Input.Ext)
} }
func TestLoadBadFile(t *testing.T) {
f, _ := os.CreateTemp("", "test")
ConfigPath = f.Name()
defer f.Close()
fmt.Fprint(f, `{"not":"toml"}`)
_, err := Load()
assert.Error(t, err)
}
func TestLoadIgnoreMissingFile(t *testing.T) { func TestLoadIgnoreMissingFile(t *testing.T) {
def, _ := DefaultConfig() def, _ := DefaultConfig()
ConfigPath = "/not/a/real/file" ConfigPath = "/not/a/real/file"
@ -27,3 +37,23 @@ func TestLoadIgnoreMissingFile(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, def, c) assert.Equal(t, def, c)
} }
func TestOverride(t *testing.T) {
Overrides = map[string]string{
"input.path": "/path/to/it",
"input.ext": "~",
}
c, err := Load()
require.NoError(t, err)
assert.Equal(t, Overrides["input.path"], c.Input.Path)
assert.Equal(t, "txt", c.Input.Ext)
}
func TestOverrideJson(t *testing.T) {
Overrides = map[string]string{"input.ext": `{"a":"b"}`}
c, err := Load()
require.NoError(t, err)
assert.Equal(t, "txt", c.Input.Ext)
}
// @todo test time

View file

@ -1,16 +1,14 @@
package config package config
import mapst "github.com/mitchellh/mapstructure"
type Config struct { type Config struct {
Input Input Input Input
Outputs Outputs `toml:"output"` Outputs Outputs `toml:"output"`
} }
type Input struct { type Input struct {
Path string Path string `env:"LOG_PATH"`
Recurse bool Recurse bool `env:"LOG_RECURSE"`
Ext string Ext string `env:"LOG_EXT"`
} }
type Outputs map[string]Output type Outputs map[string]Output
@ -20,16 +18,6 @@ type Output struct {
Config map[string]any Config map[string]any
} }
func (oo Outputs) Stdout() (s Stdout, enabled bool) {
o, ok := oo["stdout"]
if !ok {
return s, false
}
enabled = o.Enabled
mapst.Decode(o.Config, &s)
return
}
type Stdout struct { type Stdout struct {
Json bool Json bool `env:"LOG_STDOUT_JSON"`
} }

1
go.mod
View file

@ -4,6 +4,7 @@ go 1.21.5
require ( require (
github.com/BurntSushi/toml v1.3.2 github.com/BurntSushi/toml v1.3.2
github.com/caarlos0/env/v10 v10.0.0
github.com/mitchellh/mapstructure v1.5.0 github.com/mitchellh/mapstructure v1.5.0
github.com/spf13/cobra v1.8.0 github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.8.4

2
go.sum
View file

@ -1,5 +1,7 @@
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/caarlos0/env/v10 v10.0.0 h1:yIHUBZGsyqCnpTkbjk8asUlx6RFhhEs+h7TOBdgdzXA=
github.com/caarlos0/env/v10 v10.0.0/go.mod h1:ZfulV76NvVPw3tm591U4SwL3Xx9ldzBP9aGxzeN7G18=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=