✨ Load config from file with defaults
This commit is contained in:
		
					parent
					
						
							
								2da9fcac37
							
						
					
				
			
			
				commit
				
					
						40f9518611
					
				
			
		
					 8 changed files with 127 additions and 2 deletions
				
			
		|  | @ -19,6 +19,7 @@ package cmd | |||
| import ( | ||||
| 	"os" | ||||
| 
 | ||||
| 	"codeberg.org/danjones000/my-log/config" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| 
 | ||||
|  | @ -50,11 +51,11 @@ func init() { | |||
| 	// Cobra supports persistent flags, which, if defined here, | ||||
| 	// will be global for your application. | ||||
| 
 | ||||
| 	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.my-log.yaml)") | ||||
| 	rootCmd.PersistentFlags().StringVarP(&config.ConfigPath, "config", "c", config.ConfigPath, "config file") | ||||
| 
 | ||||
| 	// Cobra also supports local flags, which will only run | ||||
| 	// when this action is called directly. | ||||
| 	rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") | ||||
| 	// rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") | ||||
| } | ||||
| 
 | ||||
| // initConfig reads in config file and ENV variables if set. | ||||
|  |  | |||
							
								
								
									
										31
									
								
								config/default.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								config/default.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| package config | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	fp "path/filepath" | ||||
| 
 | ||||
| 	"github.com/BurntSushi/toml" | ||||
| ) | ||||
| 
 | ||||
| const ConfigStr = ` | ||||
| [input] | ||||
| ext = "txt" | ||||
| recurse = true | ||||
| path = "%s" | ||||
| 
 | ||||
| [output] | ||||
| [output.stdout] | ||||
| enabled = true | ||||
| [output.stdout.config] | ||||
| json = false | ||||
| ` | ||||
| 
 | ||||
| func DefaultConfig() (Config, error) { | ||||
| 	home, _ := os.UserHomeDir() | ||||
| 	inDir := fp.Join(home, "my-log") | ||||
| 	s := fmt.Sprintf(ConfigStr, inDir) | ||||
| 	c := Config{} | ||||
| 	_, err := toml.Decode(s, &c) | ||||
| 	return c, err | ||||
| } | ||||
							
								
								
									
										18
									
								
								config/default_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								config/default_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | |||
| package config | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	fp "path/filepath" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| func TestDefaultConfig(t *testing.T) { | ||||
| 	home, _ := os.UserHomeDir() | ||||
| 	inDir := fp.Join(home, "my-log") | ||||
| 	c, err := DefaultConfig() | ||||
| 	require.NoError(t, err) | ||||
| 	assert.Equal(t, inDir, c.Input.Path) | ||||
| } | ||||
							
								
								
									
										26
									
								
								config/load.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								config/load.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| package config | ||||
| 
 | ||||
| import ( | ||||
| 	"os" | ||||
| 	fp "path/filepath" | ||||
| 
 | ||||
| 	"github.com/BurntSushi/toml" | ||||
| ) | ||||
| 
 | ||||
| var ConfigPath string | ||||
| 
 | ||||
| func init() { | ||||
| 	conf, _ := os.UserConfigDir() | ||||
| 	ConfigPath = fp.Join(conf, "my-log", "config.toml") | ||||
| } | ||||
| 
 | ||||
| func Load() (Config, error) { | ||||
| 	c, _ := DefaultConfig() | ||||
| 	_, err := os.Stat(ConfigPath) | ||||
| 	if os.IsNotExist(err) { | ||||
| 		return c, nil | ||||
| 	} | ||||
| 	_, err = toml.DecodeFile(ConfigPath, &c) | ||||
| 	// @todo get environ | ||||
| 	return c, err | ||||
| } | ||||
							
								
								
									
										29
									
								
								config/load_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								config/load_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| package config | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	//fp "path/filepath" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
| 
 | ||||
| func TestLoad(t *testing.T) { | ||||
| 	f, _ := os.CreateTemp("", "test") | ||||
| 	ConfigPath = f.Name() | ||||
| 	fmt.Fprint(f, `[input] | ||||
| ext = "log"`) | ||||
| 	c, err := Load() | ||||
| 	require.NoError(t, err) | ||||
| 	assert.Equal(t, "log", c.Input.Ext) | ||||
| } | ||||
| 
 | ||||
| func TestLoadIgnoreMissingFile(t *testing.T) { | ||||
| 	def, _ := DefaultConfig() | ||||
| 	ConfigPath = "/not/a/real/file" | ||||
| 	c, err := Load() | ||||
| 	require.NoError(t, err) | ||||
| 	assert.Equal(t, def, c) | ||||
| } | ||||
							
								
								
									
										17
									
								
								config/types.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								config/types.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| package config | ||||
| 
 | ||||
| type Config struct { | ||||
| 	Input   Input | ||||
| 	Outputs map[string]Output `toml:"output"` | ||||
| } | ||||
| 
 | ||||
| type Input struct { | ||||
| 	Path    string | ||||
| 	Recurse bool | ||||
| 	Ext     string | ||||
| } | ||||
| 
 | ||||
| type Output struct { | ||||
| 	Enabled bool | ||||
| 	Config  map[string]any | ||||
| } | ||||
							
								
								
									
										1
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
										
									
									
									
								
							|  | @ -3,6 +3,7 @@ module codeberg.org/danjones000/my-log | |||
| go 1.21.5 | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/BurntSushi/toml v1.3.2 | ||||
| 	github.com/spf13/cobra v1.8.0 | ||||
| 	github.com/stretchr/testify v1.8.4 | ||||
| ) | ||||
|  |  | |||
							
								
								
									
										2
									
								
								go.sum
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
										
									
									
									
								
							|  | @ -1,3 +1,5 @@ | |||
| github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= | ||||
| github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= | ||||
| 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue