/
config.go
96 lines (78 loc) · 1.96 KB
/
config.go
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
package core
import (
"os"
"path"
"github.com/spf13/viper"
)
const SERVICE_ENV_KEY = "OJ_LAB_SERVICE_ENV"
const PROJECT_ROOT_ENV_KEY = "OJ_LAB_PROJECT_ROOT"
const OVERRIDE_CONFIG_NAME_ENV_KEY = "OJ_LAB_OVERRIDE_CONFIG_NAME"
const DEFAULT_OVERRIDE_CONFIG_NAME = "override"
const DEFAULT_PROJECT_ROOT = "oj-lab-services"
type ServiceEnv string
const (
DEV_SERVICE_ENV ServiceEnv = "development"
PRD_SERVICE_ENV ServiceEnv = "production"
)
var serviceEnv ServiceEnv
var AppConfig *viper.Viper
func (se ServiceEnv) isValid() bool {
if se == DEV_SERVICE_ENV || se == PRD_SERVICE_ENV {
return true
}
return false
}
func IsDevEnv() bool {
return serviceEnv == DEV_SERVICE_ENV
}
func loadConfig(basePath string) error {
viper.AddConfigPath(basePath)
serviceEnv = DEV_SERVICE_ENV
env := os.Getenv(SERVICE_ENV_KEY)
if ServiceEnv(env).isValid() {
serviceEnv = ServiceEnv(env)
}
println("Env:", serviceEnv)
viper.SetConfigName(string(serviceEnv))
err := viper.ReadInConfig()
if err != nil {
return err
}
overrideConfigName := os.Getenv(OVERRIDE_CONFIG_NAME_ENV_KEY)
if overrideConfigName == "" {
overrideConfigName = DEFAULT_OVERRIDE_CONFIG_NAME
}
println("Set override config name:", overrideConfigName)
viper.SetConfigName(overrideConfigName)
err = viper.MergeInConfig()
if err == nil {
println("Found override config, merged")
}
AppConfig = viper.GetViper()
return nil
}
func GetProjectRoot() string {
projectRoot := os.Getenv(PROJECT_ROOT_ENV_KEY)
if projectRoot == "" {
projectRoot = DEFAULT_PROJECT_ROOT
}
wd, err := os.Getwd()
if err != nil {
panic("Cannot find working dir")
}
isRoot := path.Base(wd) == projectRoot
for !isRoot && wd != "/" {
wd = path.Dir(wd)
isRoot = path.Base(wd) == projectRoot
}
if wd == "/" {
panic("Cannot find project root folder")
}
return wd
}
func init() {
projectRoot := GetProjectRoot()
println("Initing config with project root:", projectRoot)
loadConfig(path.Join(projectRoot, "config"))
setupLog()
}