-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
229 lines (217 loc) · 4.87 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
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package config
import (
"github.com/fsnotify/fsnotify"
"github.com/google/wire"
"github.com/spf13/viper"
"path/filepath"
"strings"
"sync"
)
const EnvLocal = "local"
const EnvTest = "test"
const EnvStage = "stage"
const EnvProduction = "production"
type App struct {
Name string `yaml:"name"`
Ver string `yaml:"ver"`
Env string `yaml:"env"`
}
type Http struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
Log string `yaml:"log"`
}
type Pprof struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
}
type Websocket struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
Log string `yaml:"log"`
}
type Rpc struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
Ttl int64 `yaml:"ttl"`
Log string `yaml:"log"`
}
type Ps struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
}
type Mysql struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
User string `yaml:"user"`
Password string `yaml:"password"`
Charset string `yaml:"charset"`
Database string `yaml:"database"`
}
type Redis struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
User string `yaml:"user"`
Password string `yaml:"password"`
db int `yaml:"db"`
}
type Jaeger struct {
Host string `yaml:"host"`
Port uint `yaml:"port"`
}
type Jwt struct {
Secret string `yaml:"secret"`
DefaultToken string `yaml:"default_token"`
}
type Pager struct {
PageSize uint `yaml:"page_size"`
}
type Etcd struct {
Host []string `yaml:"host"`
Timeout uint64 `yaml:"timeout"`
}
type Smms struct {
User string `yaml:"user"`
Password string `yaml:"password"`
}
type Email struct {
Smtp string `yaml:"smtp"`
Port uint64 `yaml:"port"`
Ssl bool `yaml:"ssl"`
Account string `yaml:"account"`
Password string `yaml:"password"`
}
type PubSub struct {
Brokers []string `yaml:"brokers"`
}
type Manager struct {
Email map[string]string `yaml:"email"`
}
type Gateway struct {
Id []string `yaml:"id"`
}
type Config struct {
App App
Http Http
Pprof Pprof
Websocket Websocket
Rpc Rpc
Ps Ps
Mysql Mysql
Redis Redis
Jaeger Jaeger
Jwt Jwt
Pager Pager
Etcd Etcd
Smms Smms
Email Email
PubSub PubSub
Manager Manager
Gateway Gateway
}
var (
onceConfig sync.Once
instanceConfig *Config
)
func GetConfigInstance(param CmdParam) *Config {
onceConfig.Do(func() {
instanceConfig = &Config{}
dir := filepath.Dir(param.ConfigFile)
lastBase := filepath.Base(param.ConfigFile)
ext := filepath.Ext(param.ConfigFile)
configName := strings.Replace(lastBase, ext, "", -1)
configType := strings.Replace(ext, ".", "", -1)
v := viper.New()
v.AddConfigPath(dir)
v.SetConfigName(configName)
v.SetConfigType(configType)
v.WatchConfig()
v.OnConfigChange(func(in fsnotify.Event) {
})
if err := v.ReadInConfig(); err != nil {
}
if err := v.Unmarshal(instanceConfig); err != nil {
}
})
return instanceConfig
}
func NewApp(conf *Config) *App {
return &conf.App
}
func NewHttp(conf *Config) *Http {
return &conf.Http
}
func NewPprof(conf *Config) *Pprof {
return &conf.Pprof
}
func NewWebsocket(conf *Config) *Websocket {
return &conf.Websocket
}
func NewRpc(conf *Config) *Rpc {
return &conf.Rpc
}
func NewPs(conf *Config) *Ps {
return &conf.Ps
}
func NewMysql(conf *Config) *Mysql {
return &conf.Mysql
}
func NewRedis(conf *Config) *Redis {
return &conf.Redis
}
func NewJaeger(conf *Config) *Jaeger {
return &conf.Jaeger
}
func NewJwt(conf *Config) *Jwt {
return &conf.Jwt
}
func NewPager(conf *Config) *Pager {
return &conf.Pager
}
func NewEtcd(conf *Config) *Etcd {
return &conf.Etcd
}
func NewSmMs(conf *Config) *Smms {
return &conf.Smms
}
func NewEmail(conf *Config) *Email {
return &conf.Email
}
func NewPubSub(conf *Config) *PubSub {
return &conf.PubSub
}
func NewManager(conf *Config) *Manager {
return &conf.Manager
}
func NewGateway(conf *Config) *Gateway {
return &conf.Gateway
}
var AppProvider = wire.NewSet(NewApp)
var HttpProvider = wire.NewSet(NewHttp)
var PprofProvider = wire.NewSet(NewPprof)
var WebsocketProvider = wire.NewSet(NewWebsocket)
var RpcProvider = wire.NewSet(NewRpc)
var PsProvider = wire.NewSet(NewPs)
var MysqlProvider = wire.NewSet(NewMysql)
var RedisProvider = wire.NewSet(NewRedis)
var JaegerProvider = wire.NewSet(NewJaeger)
var JwtProvider = wire.NewSet(NewJwt)
var PagerProvider = wire.NewSet(NewPager)
var EtcdProvider = wire.NewSet(NewEtcd)
var SmMsProvider = wire.NewSet(NewSmMs)
var EmailProvider = wire.NewSet(NewEmail)
var PubSubProvider = wire.NewSet(NewPubSub)
var ManagerProvider = wire.NewSet(NewManager)
var GatewayProvider = wire.NewSet(NewGateway)
var Provider = wire.NewSet(GetConfigInstance)
type CmdParam struct {
RootPath string
ConfigFile string
}
func NewCmdParam(rootPath string, configFile string) *CmdParam {
param := &CmdParam{
RootPath: rootPath,
ConfigFile: configFile,
}
return param
}