summaryrefslogtreecommitdiff
path: root/pkg/app/config.go
blob: b613532345fba55b3831f91fe4454a62af80d6ac (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
package app

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

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

// Config type is the configuration entity of the application
type Config struct {
	Mode        string
	Directories []string
}

// 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{"."}
)

// LoadConfiguration returns a Config struct is filled
func LoadConfiguration() (*Config, 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
	}
	config := &Config{
		Mode:        viper.GetString(modeKey),
		Directories: viper.GetStringSlice(pathsKey),
	}
	return config, nil
}

// set default configuration parameters
func setDefaults() error {
	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
}