91 lines
2 KiB
Go
91 lines
2 KiB
Go
|
|
package bootstrap
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bubble/types"
|
|||
|
|
"github.com/sirupsen/logrus"
|
|||
|
|
"gopkg.in/yaml.v3"
|
|||
|
|
"io/fs"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const ConfDir = "./confs/"
|
|||
|
|
|
|||
|
|
func LoadApplications() []types.PackageApplication {
|
|||
|
|
var apps []types.PackageApplication
|
|||
|
|
|
|||
|
|
err := filepath.WalkDir(ConfDir, func(path string, d fs.DirEntry, err error) error {
|
|||
|
|
if err != nil || d == nil || d.IsDir() {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
if filepath.Ext(d.Name()) != ".yaml" && filepath.Ext(d.Name()) != ".yml" {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
app, err := loadFromYAML(path)
|
|||
|
|
if err != nil {
|
|||
|
|
logrus.Errorf("Ошибка загрузки %s: %v", path, err)
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
apps = append(apps, app)
|
|||
|
|
return nil
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
if err != nil {
|
|||
|
|
logrus.Fatal(err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return apps
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func loadFromYAML(filePath string) (types.PackageApplication, error) {
|
|||
|
|
var app types.PackageApplication
|
|||
|
|
|
|||
|
|
data, err := os.ReadFile(filePath)
|
|||
|
|
if err != nil {
|
|||
|
|
return app, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err = yaml.Unmarshal(data, &app); err != nil {
|
|||
|
|
return app, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
app = connectVariables(app)
|
|||
|
|
return app, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// connectVariables — связывает поля с переменными по указателям
|
|||
|
|
// и инициализирует Value = Default
|
|||
|
|
func connectVariables(app types.PackageApplication) types.PackageApplication {
|
|||
|
|
varMap := make(map[string]*types.Variable)
|
|||
|
|
for i := range app.Variables {
|
|||
|
|
v := &app.Variables[i]
|
|||
|
|
v.Value = v.Default // сразу устанавливаем дефолт
|
|||
|
|
varMap[v.Name] = v
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for i := range app.Sections {
|
|||
|
|
section := &app.Sections[i]
|
|||
|
|
for j := range section.Fields {
|
|||
|
|
field := §ion.Fields[j]
|
|||
|
|
if v, exists := varMap[field.VariableName]; exists {
|
|||
|
|
field.Variable = v
|
|||
|
|
field.Active = true
|
|||
|
|
} else {
|
|||
|
|
logrus.Warnf("Переменная не найдена: %s (в поле %s)", field.VariableName, field.Name)
|
|||
|
|
// Создаём заглушку
|
|||
|
|
field.Variable = &types.Variable{
|
|||
|
|
Name: field.VariableName,
|
|||
|
|
Type: "string",
|
|||
|
|
Default: "",
|
|||
|
|
Value: "",
|
|||
|
|
}
|
|||
|
|
field.Active = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return app
|
|||
|
|
}
|