跳转至

P0.A20.F4 · Codegen 后端 ✅

所属 ADRADR-AIOS-20 §2.4 T3 主 commitd9cdbe9 测试:6/6 xunit pass


完成内容

新增 5 个文件(+497 行)

文件 说明
Models/CodegenRequest.cs WidgetDefDto + CodegenRequest
Models/CodegenResponse.cs 响应体(Header/PresetSchema/文件名)
Services/CodegenService.cs 核心生成:GenerateHeader + GeneratePresetSchema
Controllers/CodegenController.cs POST /api/codegen/generate + ModuleId 正则校验
Tests/CodegenServiceTests.cs 6 case TDD(xunit)

Program.cs DI

builder.Services.AddSingleton<CodegenService>();

API

POST /api/codegen/generate
Body: { moduleId, displayName?, mode, widgets: [{ type, name, label?, unit?, min?, max?, defaultValue?, options?, readOnly?, dataType? }] }
→ { skipped, skipReason?, header, presetSchema, headerFileName, schemaFileName }

生成规则

Widget Type C 函数 JSON Schema
slider/knob/number-input float set/get number + min/max/unit
toggle/checkbox/button-toggle bool set/get boolean
combo-box/radio-group/tab-bar int set/get string + enum
button-momentary void trigger only 不生成(瞬态)
label-value/meter-level (ReadOnly) 跳过 不生成
TT* 控件 dataType→C类型 set/get dataType→schema 类型

安全

  • ModuleId 白名单正则:^[a-zA-Z][a-zA-Z0-9_]*$
  • legacy mode → { skipped: true }

验收结果

  • POST /api/codegen/generate 接口可访问
  • normal 模块返回 .h 含 set/get
  • legacy 模块 → { skipped: true }
  • ReadOnly widget 不出现在 .h
  • ModuleId 特殊字符 → 400 BadRequest
  • CodegenServiceTests.cs 6/6 pass(xunit)
  • dotnet build 0 error

解锁

  • 🟢 F5 codegen 前端(POST /api/codegen/generate 接口稳定)