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
All checks were successful
build-test / build (push) Successful in 35s
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user