-
Notifications
You must be signed in to change notification settings - Fork 0
/
types_configuration.go
82 lines (68 loc) · 3.15 KB
/
types_configuration.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
// Package cfg
package cfg
import (
"container/list"
"reflect"
kitTypes "github.com/webnice/kit/v3/types"
)
// Структура регистра хранения объектов конфигурации.
type mainConfiguration struct {
Items []*configurationItem // Зарегистрированные и разобранные объекты конфигураций.
Union interface{} // Объединённая структура, содержащая в себе все зарегистрированные структуры.
}
// Структура регистра хранения одного объекта одной конфигурации.
type configurationItem struct {
Original interface{} // Ссылка на оригинальный объект конфигурации
Fields []reflect.StructField // Все найденные экспортируемые поля оригинальной структуры
Type reflect.Type // Тип reflect.Type структуры
Value reflect.Value // Тип reflect.Value оригинального объекта
callback *list.List // Подписчики обратного вызова *callbackItem.
}
// Структура хранения подписчиков на обратный вызов при динамическом изменении конфигурации.
type callbackItem struct {
Name string // Подписчик: пакет, объект.
Item kitTypes.Callbacker // Интерфейс функции подписчика на обратный вызов.
}
// IsName Проверка существования поля с указанным именем во всех уже добавленных объектах конфигурации.
// Вернётся истина, если будет найдено совпадение.
func (mcn mainConfiguration) IsName(name string) (ret bool) {
var n, i int
for n = range mcn.Items {
for i = range mcn.Items[n].Fields {
if mcn.Items[n].Fields[i].Name == name {
ret = true
return
}
}
}
return
}
// IsTagValue Проверка существования поля с указанным тегом имеющим указанное значение во всех полях всех уже
// добавленных объектах конфигурации.
// Вернётся истина, если будет найдено совпадение.
func (mcn mainConfiguration) IsTagValue(name string, value string) (ret bool) {
var (
n, i int
ok bool
tagValue string
)
for n = range mcn.Items {
for i = range mcn.Items[n].Fields {
if tagValue, ok = mcn.Items[n].Fields[i].Tag.Lookup(name); ok {
if tagValue == value {
ret = true
return
}
}
}
}
return
}
// StructField Функция собирает и возвращает все поля всех зарегистрированных объектов конфигурации в один срез.
func (mcn mainConfiguration) StructField() (ret []reflect.StructField) {
var n int
for n = range mcn.Items {
ret = append(ret, mcn.Items[n].Fields...)
}
return
}