summaryrefslogtreecommitdiff
path: root/app/config.go
blob: 57c2e6ef74425ce313bd5072c35b314b2c47f0f0 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package app

import (
	"os"
	"path/filepath"
	"runtime"

	log "github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

// config file stuff
var (
	configFileName = "config"
	configFileExt  = ".yml"
	configType     = "yaml"
	appName        = "gitbatch"

	configurationDirectory = filepath.Join(osConfigDirectory(), appName)
	configFileAbsPath      = filepath.Join(configurationDirectory, configFileName)
)

// configuration items
var (
	modeKey             = "mode"
	modeKeyDefault      = "fetch"
	pathsKey            = "paths"
	pathsKeyDefault     = []string{"."}
	logLevelKey         = "loglevel"
	logLevelKeyDefault  = "error"
	qucikKey            = "quick"
	qucikKeyDefault     = false
	recursionKey        = "recursion"
	recursionKeyDefault = 1
)

// LoadConfiguration returns a Config struct is filled
func LoadConfiguration() (*SetupConfig, error) {
	if err := initializeConfigurationManager(); err != nil {
		return nil, err
	}
	if err := setDefaults(); err != nil {
		return nil, err
	}
	if err := readConfiguration(); err != nil {
		return nil, err
	}
	var directories []string
	if len(viper.GetStringSlice(pathsKey)) <= 0 {
		d, _ := os.Getwd()
		directories = []string{d}
	} else {
		directories = viper.GetStringSlice(pathsKey)
	}
	config := &SetupConfig{
		Directories: directories,
		LogLevel:    viper.GetString(logLevelKey),
		Depth:       viper.GetInt(recursionKey),
		QuickMode:   viper.GetBool(qucikKey),
		Mode:        viper.GetString(modeKey),
	}
	return config, nil
}

// set default configuration parameters
func setDefaults() error {
	viper.SetDefault(logLevelKey, logLevelKeyDefault)
	viper.SetDefault(qucikKey, qucikKeyDefault)
	viper.SetDefault(recursionKey, recursionKeyDefault)
	viper.SetDefault(modeKey, modeKeyDefault)
	// viper.SetDefault(pathsKey, pathsKeyDefault)
	return nil
}

// read configuration from file
func readConfiguration() error {
	err := viper.ReadInConfig() // Find and read the config file
	if err != nil {             // Handle errors reading the config file
		// if file does not exist, simply create one
		if _, err := os.Stat(configFileAbsPath + configFileExt); os.IsNotExist(err) {
			os.MkdirAll(configurationDirectory, 0755)
			os.Create(configFileAbsPath + configFileExt)
		} else {
			return err
		}
		// let's write defaults
		if err := viper.WriteConfig(); err != nil {
			return err
		}
	}
	return nil
}

// write configuration to a file
func writeConfiguration() error {
	err := viper.WriteConfig()
	return err
}

// initialize the configuration manager
func initializeConfigurationManager() error {
	// config viper
	viper.AddConfigPath(configurationDirectory)
	viper.SetConfigName(configFileName)
	viper.SetConfigType(configType)

	return nil
}

// returns OS dependent config directory
func osConfigDirectory() (osConfigDirectory string) {
	switch osname := runtime.GOOS; osname {
	case "windows":
		osConfigDirectory = os.Getenv("APPDATA")
	case "darwin":
		osConfigDirectory = os.Getenv("HOME") + "/Library/Application Support"
	case "linux":
		osConfigDirectory = os.Getenv("HOME") + "/.config"
	default:
		log.Warn("Operating system couldn't be recognized")
	}
	return osConfigDirectory
}