Работа над валидацией полей, работа над выполнением действий

This commit is contained in:
XeRo 2026-01-21 17:56:21 +05:00
parent e37cabadcc
commit dc263b76bf
8 changed files with 220 additions and 23 deletions

View file

@ -1,6 +1,7 @@
package setup
import (
"bubble/setup/utils"
"bubble/types"
"errors"
"fmt"
@ -174,6 +175,45 @@ func Recompute(app *types.PackageApplication) {
}
}
func ValidateCheckField(fieldName, variableName string, validations []types.FieldValidate, app *types.PackageApplication) types.BoolValidateFunc {
if len(validations) == 0 {
return nil
}
return func(checked bool) error {
env := ParamsForCompute(app)
env[variableName] = checked
options := append([]expr.Option{
expr.Env(env),
expr.AllowUndefinedVariables(),
}, DefineExprCustomFunctions()...)
for _, validate := range validations {
program, err := expr.Compile(validate.Rule, options...)
prefix := fmt.Sprintf("Валидация поля %s,", fieldName)
if err != nil {
msg := fmt.Errorf("ошибка компиляции правила: %s, err: %v", validate.Rule, err)
logrus.Errorf("%s %v", prefix, msg)
return msg
}
result, err := expr.Run(program, env)
if err != nil {
msg := fmt.Errorf("ошибка выполнения правила: %s, err: %v", validate.Rule, err)
logrus.Errorf("%s %v", prefix, msg)
return msg
}
if boolValue, ok := result.(bool); ok && !boolValue {
return fmt.Errorf("%s", validate.Message)
} else if !ok {
msg := fmt.Errorf("возвращаемое значение правила: %s не булево", validate.Rule)
logrus.Errorf("%s %v", prefix, msg)
return msg
}
}
return nil
}
}
// ValidateField создает функцию типа textinput.ValidateFunc для проверки значения полей
func ValidateField(fieldName, variableName string, validations []types.FieldValidate, app *types.PackageApplication) textinput.ValidateFunc {
if len(validations) == 0 {
@ -181,7 +221,7 @@ func ValidateField(fieldName, variableName string, validations []types.FieldVali
}
return func(text string) error {
env := ParamsForCompute(app)
env[variableName] = text //todo text это строка, если использовать функцию типа textinput.ValidateFunc, то словим ошибку типов
env[variableName] = text
options := append([]expr.Option{
expr.Env(env),
expr.AllowUndefinedVariables(),
@ -396,3 +436,27 @@ func GetSystemUsers() []string {
}
return users
}
func ExecuteAction(action *types.SectionAction, application *types.PackageApplication) error {
vars := ParamsForCondition(application)
switch action.Type {
case "command":
cmdStr, cmdErr := utils.RenderTemplate(action.Command, vars)
if cmdErr != nil {
return fmt.Errorf("ошибка создания шаблона команды: %v", cmdErr)
}
return utils.RunCommand(cmdStr, action.RunAs)
case "file_template":
source, sourceErr := utils.RenderTemplate(action.FileSource, vars)
if sourceErr != nil {
return fmt.Errorf("ошибка создания шаблона файла источника: %v", sourceErr)
}
target, targetErr := utils.RenderTemplate(action.FileTarget, vars)
if targetErr != nil {
return fmt.Errorf("ошибка создания шаблона файла цели: %v", targetErr)
}
return utils.RenderFileTemplate(source, target, vars)
default:
return fmt.Errorf("неизвестный тип действия")
}
}