fix(docs-generator): array-map-fixed = jsonencode([...]) (StringAttribute, не объект); классификация по data_type, а не is_json

This commit is contained in:
Repinoid
2026-09-21 20:22:27 +03:00
parent af2e10b1d5
commit 7c2cc673cc
@@ -376,7 +376,7 @@ func buildCreateParamsPage(spec types.ServiceSpec, nav string, version string) s
// Якорь-ссылка для map-fixed/array-map-fixed с вложенными параметрами
if p.HasSubParams && len(p.SubParams) > 0 && desc == "" {
anchor := strings.ToLower(p.Code)
if p.IsJson {
if isNestedListParam(p) {
desc = fmt.Sprintf("[Развернуть ↓](#%s-array-map-fixed)", anchor)
} else {
desc = fmt.Sprintf("[Развернуть ↓](#%s-map-fixed)", anchor)
@@ -713,7 +713,7 @@ func formatParamOrBlock(p types.ParamSpec, indent string, requiredOnly bool) str
// а SingleNestedAttribute в HCL — это аргумент (через `=`), НЕ блок.
// Блочный синтаксис (`param { ... }`) ломает terraform validate:
// "Unsupported block type ... Did you mean to define argument?".
if p.HasSubParams && len(p.SubParams) > 0 && !p.IsJson {
if p.HasSubParams && len(p.SubParams) > 0 && !isNestedListParam(p) {
paramCode := ToSnake(p.Code)
var b strings.Builder
b.WriteString(fmt.Sprintf("%s%s = {\n", indent, paramCode))
@@ -739,7 +739,7 @@ func formatParamOrBlock(p types.ParamSpec, indent string, requiredOnly bool) str
// array-map-fixed: resource-generator объявляет такие поля как schema.StringAttribute
// (JSON-строка), поэтому в доке это тоже аргумент-строка через jsonencode([...]),
// а НЕ блок и НЕ dynamic-блок.
if p.HasSubParams && len(p.SubParams) > 0 && p.IsJson {
if p.HasSubParams && len(p.SubParams) > 0 && isNestedListParam(p) {
paramCode := ToSnake(p.Code)
var b strings.Builder
b.WriteString(fmt.Sprintf("%s%s = jsonencode([\n", indent, paramCode))
@@ -867,6 +867,22 @@ func isJsonType(p types.ParamSpec) bool {
return strings.Contains(strings.ToLower(firstType(p)), "json")
}
// isNestedListParam — аналог resource-generator helpers.IsNestedList.
//
// Параметр с подполями и типом-массивом (data_type: array-map-fixed).
// resource-generator объявляет такие поля как schema.StringAttribute (JSON-строка),
// а НЕ как SingleNestedAttribute, поэтому и в доке это строка:
//
// storage_config = jsonencode([{ ... }])
//
// Историческая ошибка: условие проверяло p.IsJson, но array-map-fixed приходит
// с data_type=array-map-fixed (is_json не выставлен), поэтому поле попадало
// в ветку map-fixed и рендерилось объектом — несовместимо со схемой.
func isNestedListParam(p types.ParamSpec) bool {
dtype := strings.ToLower(strings.TrimSpace(p.DataType) + " " + strings.TrimSpace(p.Type))
return strings.Contains(dtype, "array")
}
func defaultCell(value interface{}) string {
if !hasDefault(value) {
return ""
@@ -1095,7 +1111,7 @@ func renderNestedParams(p types.ParamSpec) string {
}
var b strings.Builder
label := p.Code
if p.IsJson {
if isNestedListParam(p) {
label += " (array-map-fixed) — элемент"
} else {
label += " (map-fixed)"