✨ Parse env vars
This commit is contained in:
		
					parent
					
						
							
								25f5c37243
							
						
					
				
			
			
				commit
				
					
						85f666cbc2
					
				
			
		
					 5 changed files with 57 additions and 17 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
										
									
									
									
								
							| 
						 | 
					@ -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
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
										
									
									
									
								
							| 
						 | 
					@ -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=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue