-
Notifications
You must be signed in to change notification settings - Fork 0
/
cfg_init.go
114 lines (105 loc) · 6.58 KB
/
cfg_init.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
// Package cfg
package cfg
import (
"container/list"
"sync"
kitModuleBus "github.com/webnice/kit/v3/module/bus"
kitModuleCfgCli "github.com/webnice/kit/v3/module/cfg/cli"
kitModuleLog "github.com/webnice/kit/v3/module/log"
kitModuleUuid "github.com/webnice/kit/v3/module/uuid"
kitTypes "github.com/webnice/kit/v3/types"
"github.com/Masterminds/semver"
)
func init() {
singleton = &impl{
// Минимальная, стартовая конфигурация приложения.
bootstrapConfiguration: &kitTypes.BootstrapConfiguration{ApplicationDebug: initApplicationDebug()},
// Загружаемая из файла, временная конфигурация.
loadableConfiguration: &kitTypes.BootstrapConfiguration{},
// Основная функция приложения.
main: &mainApplication{
Version: &semver.Version{}, // Исключение возможной ошибки, если версия не установлена.
Fn: nil, // Функция входа, выполнения и завершения приложения с кодом ошибки.
FnMutex: new(sync.Mutex), // Обязательная защита от двойного запуска основной функции приложения.
},
// Регистр компонентов приложения.
comp: &mainComponent{
IsClose: false,
ComponentMutex: new(sync.Mutex),
},
// Регистр объектов конфигураций.
conf: &mainConfiguration{
Items: make([]*configurationItem, 0, 1),
},
// Время отводимое на выполнение функции Finalize() до печали в лог warning сообщения.
finalizeWarningTimeout: defaultFinalizeTimeoutBeforeWarning(),
}
// Интерфейс вывода потоковых сообщений.
singleton.rawWriter = newSyncWriter(singleton)
// Пользователь операционной системы.
singleton.user = currentUser(singleton)
// Добавление интерфейсов используемых модулей.
singleton.bus = kitModuleBus.New(0, 0, singleton.bootstrapConfiguration.ApplicationDebug)
singleton.version, singleton.essence = newVersion(singleton), newEssence(singleton)
singleton.rec, singleton.logger, singleton.uuid =
newRecorder(singleton), kitModuleLog.New(singleton.rawWriter, singleton.bus), kitModuleUuid.Get()
// Основная часть конфигурации приложения, интерфейс работы с командной строкой и переменными окружения.
singleton.initMainConfiguration()
// Управление переключением уровней работы приложения.
singleton.runLevelChangeChan, singleton.runLevelSubscribers = runlevelChangeFuncNew(), list.New()
}
// Основная часть конфигурации приложения, интерфейс работы с командной строкой и переменными окружения.
func (cfg *impl) initMainConfiguration() {
var (
empty func() string
err error
)
cfg.cli = kitModuleCfgCli.
New(cfg.bootstrapConfiguration).
Constant(defaultConstantEnvironment())
empty = func() (ret string) { return }
if err = cfg.cli.Bootstrap(&kitTypes.BootstrapDefaultValue{
ApplicationTargetlevel: defaultApplicationTargetlevelString, // Целевой уровень выполнения приложения.
ApplicationDebug: defaultApplicationDebugString, // Режим отладки приложения.
ApplicationName: defaultApplicationName, // Название приложения.
ApplicationDescription: defaultApplicationDescription, // Описание приложения или сервиса, отображаемое в строке помощи.
HomeDirectory: defaultHomeDirectory, // Домашняя директория пользователя от которого запущено приложение.
WorkingDirectory: defaultWorkingDirectory, // Рабочая директория приложения.
TempDirectory: defaultTempDirectory, // Директория для создания временных файлов (очищаемая системой).
CacheDirectory: defaultCacheDirectory, // Директория для кеша (не очищаемая системой).
ConfigDirectory: defaultConfigDirectory, // Директория конфигурации в домашней директории пользователя.
ConfigFile: empty, // Путь и имя конфигурационного файла по умолчанию.
PidFile: empty, // Путь и имя PID файла по умолчанию.
StateFile: empty, // Файл состояния.
SocketFile: empty, // Сокет файл для коммуникации серверной части с клиентской.
LogLevel: defaultLogLevel().String, // Уровень логирования по умолчанию до загрузки конфигурации.
CommandGroup: cfg.initGroupOfCommand, // Список групп команд, который сформируется при регистрации компонентов.
}); err != nil {
cfg.error = append(cfg.error, Errors().ConfigurationBootstrap(0, err))
}
// Регистрация объекта конфигурации для последующего чтения из файла.
if err = cfg.essence.ConfigurationRegistration(cfg.loadableConfiguration); err != nil {
switch eto := err.(type) {
case Err:
cfg.error = append(cfg.error, eto)
default:
cfg.error = append(cfg.error, Errors().ConfigurationApplicationObject(0, err))
}
}
}
// Возврат списка групп команд, который сформируется при регистрации компонентов.
func (cfg *impl) initGroupOfCommand() (ret []kitTypes.CommandGroup) {
var n int
if cfg.comp == nil || len(cfg.comp.Groups) <= 0 {
return
}
ret = make([]kitTypes.CommandGroup, 0, len(cfg.comp.Groups))
for n = range cfg.comp.Groups {
ret = append(ret, kitTypes.CommandGroup{
Key: cfg.comp.Groups[n].Key,
Title: cfg.comp.Groups[n].Title,
Description: cfg.comp.Groups[n].Description,
})
}
return
}