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

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

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

// 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{
	if err := viper.WriteConfig(); err != nil {
		return err
	}
	return nil
}

// 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
}