From 7c2cc673cc3d2ad4d76f10ed473397634bf4d2d1 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Mon, 21 Sep 2026 20:22:27 +0300 Subject: [PATCH] =?UTF-8?q?fix(docs-generator):=20array-map-fixed=20=3D=20?= =?UTF-8?q?jsonencode([...])=20(StringAttribute,=20=D0=BD=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82);=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=20data=5Ftype,=20=D0=B0=20=D0=BD=D0=B5=20is=5Fjson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/writers/writers.go | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/TOOLS/docs-generator/internal/writers/writers.go b/TOOLS/docs-generator/internal/writers/writers.go index bd41d4e..744e525 100644 --- a/TOOLS/docs-generator/internal/writers/writers.go +++ b/TOOLS/docs-generator/internal/writers/writers.go @@ -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)"