✨ 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 ( | import ( | ||||||
| 	"os" | 	"os" | ||||||
| 
 | 
 | ||||||
|  | 	"codeberg.org/danjones000/my-log/config" | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -50,11 +51,11 @@ func init() { | ||||||
| 	// Cobra supports persistent flags, which, if defined here, | 	// Cobra supports persistent flags, which, if defined here, | ||||||
| 	// will be global for your application. | 	// 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 | 	// Cobra also supports local flags, which will only run | ||||||
| 	// when this action is called directly. | 	// 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. | // 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 | go 1.21.5 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
|  | 	github.com/BurntSushi/toml v1.3.2 | ||||||
| 	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,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/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