app: composition root (A1-A4), Run(ctx), handleIncoming (вариант A), фикс config.Load(""), GetActiveTaskByChatID, main.go обновлён
All checks were successful
build-test / build (push) Successful in 35s

This commit is contained in:
Hermes
2026-08-15 09:51:03 +05:00
parent 4641090398
commit c72b41b2c5
7 changed files with 392 additions and 47 deletions

View File

@@ -13,21 +13,29 @@ import (
// env-переменные (тег env) и валидирует. Если path пустой — ищет config.yaml
// в CWD. Ошибка C4 если файл не существует (но не fatal при path="").
func Load(path string) (*Config, error) {
noFile := false
if path == "" {
path = "config.yaml"
}
raw, err := os.ReadFile(path)
if err != nil {
if strings.Contains(err.Error(), "no such file") || strings.Contains(err.Error(), "cannot find") {
return nil, fmt.Errorf("%w: %s", ErrFileNotFound, path)
if path == "config.yaml" {
// Файл не указан и не найден — не фатально, соберём дефолты+env
noFile = true
} else {
return nil, fmt.Errorf("%w: %s", ErrFileNotFound, path)
}
} else {
return nil, fmt.Errorf("%w: read %s: %v", ErrInvalidFormat, path, err)
}
return nil, fmt.Errorf("%w: read %s: %v", ErrInvalidFormat, path, err)
}
// подстановка ${VAR:-default}
expanded := os.Expand(string(raw), envLookup)
cfg := &Config{}
if err := yaml.Unmarshal([]byte(expanded), cfg); err != nil {
return nil, fmt.Errorf("%w: parse %s: %v", ErrInvalidFormat, path, err)
if !noFile {
expanded := os.Expand(string(raw), envLookup)
if err := yaml.Unmarshal([]byte(expanded), cfg); err != nil {
return nil, fmt.Errorf("%w: parse %s: %v", ErrInvalidFormat, path, err)
}
}
// дефолты для zero-значений
applyDefaults(cfg)