reprogl

Форк
0
/
config.go 
150 строк · 3.3 Кб
1
package container
2

3
import (
4
	"errors"
5
	"fmt"
6
	"reflect"
7

8
	"github.com/gookit/ini/v2"
9
)
10

11
type AppConfig struct {
12
	AppData
13
	CDNBaseURL        string `app_config:"CDN_BASE_URL"`
14
	DatabaseDSN       string `app_config:"DB"`
15
	Host              string `app_config:"HOST"`
16
	Port              string `app_config:"PORT"`
17
	BackendApiUrl     string `app_config:"BACKEND_API_URL"`
18
	BackendApiUser    string `app_config:"BACKEND_API_USER"`
19
	BackendApiWsseKey string `app_config:"BACKEND_API_WSSE_KEY"`
20
	TelegramToken     string `app_config:"TELEGRAM_TOKEN"`
21
	TelegramAdminID   int    `app_config:"TELEGRAM_ADMIN_ID"`
22
	SessionHashKey    string `app_config:"SESSION_HASH_KEY"`
23
	SessionBlockKey   string `app_config:"SESSION_BLOCK_KEY"`
24

25
	OAuthYandexID     string `app_config:"OAUTH_CLIENT_ID_YANDEX"`
26
	OAuthYandexSecret string `app_config:"OAUTH_SECRET_YANDEX"`
27
	OAuthVkID         string `app_config:"OAUTH_CLIENT_ID_VK"`
28
	OAuthVkSecret     string `app_config:"OAUTH_SECRET_VK"`
29
}
30

31
var cnf AppConfig
32

33
func Load(file string) error {
34
	cnf = AppConfig{AppData: loadAppData()}
35

36
	return cnf.load(file)
37
}
38

39
func GetConfig() AppConfig {
40
	return cnf
41
}
42

43
func IsDevMode() bool {
44
	return devMode
45
}
46

47
func GetBuildTag() (tag string) {
48
	if devMode {
49
		tag = "dev"
50
	} else {
51
		tag = "prod"
52
	}
53

54
	return
55
}
56

57
func configStringValue(paramName string) (string, error) {
58
	var value string
59
	if _, ok := ini.GetValue(paramName); ok {
60
		value = ini.String(paramName)
61
	} else {
62
		return value, errors.New("app.ini: Undefined parameter \"" + paramName + "\"")
63
	}
64

65
	return value, nil
66
}
67

68
func configIntValue(paramName string) (int, error) {
69
	var value int
70
	if _, ok := ini.GetValue(paramName); ok {
71
		value = ini.Int(paramName)
72
	} else {
73
		return value, errors.New("app.ini: Undefined parameter \"" + paramName + "\"")
74
	}
75

76
	return value, nil
77
}
78

79
type structField struct {
80
	name          string
81
	parameterName string
82
	fieldType     reflect.Kind
83
}
84

85
func (c *AppConfig) load(file string) error {
86
	err := ini.LoadExists(file)
87
	if err != nil {
88
		return err
89
	}
90

91
	rv := reflect.ValueOf(c)
92
	if rv.IsNil() {
93
		return fmt.Errorf("config: load error %v", reflect.TypeOf(c))
94
	}
95

96
	return setupFields(rv, parseFields(reflect.TypeOf(*c)))
97
}
98

99
func setupFields(rv reflect.Value, fields []structField) error {
100
	if rv.Kind() != reflect.Pointer {
101
		return fmt.Errorf("config: argument is not a pointer")
102
	}
103

104
	confValue := rv.Elem()
105
	for _, field := range fields {
106
		f := confValue.FieldByName(field.name)
107
		if f.IsValid() && f.CanSet() {
108
			switch field.fieldType {
109
			case reflect.Int:
110
				intVal, err := configIntValue(field.parameterName)
111
				if err != nil {
112
					return err
113
				}
114
				x := int64(intVal)
115
				if !f.OverflowInt(x) {
116
					f.SetInt(x)
117
				} else {
118
					return fmt.Errorf("config: int overflow for field %s", field.name)
119
				}
120
			case reflect.String:
121
				stringVal, err := configStringValue(field.parameterName)
122
				if err != nil {
123
					return err
124
				}
125
				f.SetString(stringVal)
126
			default:
127
				return fmt.Errorf("config: undefined type %s of field %s", field.fieldType, field.name)
128
			}
129
		}
130
	}
131

132
	return nil
133
}
134

135
func parseFields(t reflect.Type) []structField {
136
	var fields = make([]structField, 0)
137
	for i := 0; i < t.NumField(); i++ {
138
		f := t.Field(i)
139
		tag := f.Tag.Get("app_config")
140
		if tag != "" {
141
			fields = append(fields, structField{
142
				parameterName: tag,
143
				fieldType:     f.Type.Kind(),
144
				name:          f.Name,
145
			})
146
		}
147
	}
148

149
	return fields
150
}
151

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.