fix(generator): нормализация имён атрибутов (fail-safe для кодов с дефисами)

Инцидент: в 1_dummy (API dev) появились коды s3-inst / s3-ref-root. ToSnake не убирал
дефисы -> в схему уходило tfsdk:"s3-inst" -> Terraform отвергает такие имена и НЕ
загружает схему провайдера целиком (plan/apply падали).

- helpers.go: ToSnake завершается sanitizeAttrName ([a-z0-9_] допустимы, остальное -> _).
  Код для API не меняется: json:"s3-inst" в генерате сохранён.
- Проверено: в generated/dev/go нет tfsdk-имён с недопустимыми символами;
  go build OK; go test ./internal/... -short PASS.
- DEV_STAND/FPipeGmail: провайдер 2.0.23 -> 2.0.1; после сброса lock/кэша
  terraform validate -> Success.
- HISTORY: описан инцидент, причина (данные API изменились после утра), фикс и
  особенность: перезапись артефакта под тем же номером требует сброса lock
  (init -upgrade хеш не пересчитывает).

dev 2.0.1 перезалит (sha256 linux d25a71a31dbc9ab16e494b3d1f68b38b2214bd530045c5a3003f515bc725e407).
This commit is contained in:
Repinoid
2026-09-30 21:42:37 +03:00
parent daece181d7
commit fbc20eea61
3 changed files with 61 additions and 2 deletions
@@ -43,7 +43,29 @@ func ToSnake(s string) string {
}
out = append(out, rune(strings.ToLower(string(r))[0]))
}
return string(out)
return sanitizeAttrName(string(out))
}
// sanitizeAttrName приводит имя атрибута к допустимому в Terraform виду:
// разрешены только [a-z0-9_], всё остальное (в т.ч. '-', '.') заменяется на '_'.
//
// Зачем: API может отдавать коды с дефисами (например `s3-inst`, `s3-ref-root`).
// Terraform отвергает такие имена атрибутов целиком ("Invalid Attribute/Block Name"),
// из-за чего провайдер не может отдать схему и падает любой plan/apply.
func sanitizeAttrName(s string) string {
var b strings.Builder
b.Grow(len(s))
for _, r := range s {
switch {
case r >= 'a' && r <= 'z', r >= '0' && r <= '9', r == '_':
b.WriteRune(r)
case r >= 'A' && r <= 'Z':
b.WriteRune(r + ('a' - 'A'))
default:
b.WriteRune('_')
}
}
return b.String()
}
// ParamType возвращает Go-тип для параметра (types.Bool/Int64/String).