Codegen overview
Deterministic GenerateDB + GenerateCRUD emitters with golden tests.
Source: codegen/. Only two entry points:
dbSrc, err := codegen.GenerateDB(pkg string, defs []ResourceDef, opts Options)
crudSrc, err := codegen.GenerateCRUD(pkg string, defs []ResourceDef)Output is gofmt-clean and golden-pinned (codegen/testdata/*.golden) — diffs are reviewable and regeneration is byte-stable.
GenerateDB
Emits XxxRow bun models plus:
BusinessModels()— registry of rowsBusinessIndexes()— polyFK / composite-unique / index DDL hintsNamingSeriesCounterRow— when a series PK is used
GenerateCRUD
Per resource emits:
XxxResponse(hidden fields excluded)XxxCreateBody(hidden + readonly + auto PK/created_at/updated_at+ children-virtual excluded)XxxUpdateBody(same exclusions, pointer fields for partial updates)XxxListInput+ToListOptions()(hidden excluded; scalars only — Huma query has a no-pointer limit; JSON excluded)XxxChildInputwhen parent-owned- Aliases/vars:
XxxSchema(Schema[Row, Response, Create, Update, ListInput]),XxxSchemaFields,XxxSchemaPK,XxxSchemaParent,XxxSchemaSingleton
Options{Aggregates} toggles aggregate helpers.
Rules worth knowing
bun/json/querytags derive from schema casing — never hand-edit generated files.- Hidden fields never reach the API surface; readonly fields never accept writes.
- Feed codegen from the Go DSL (
schema.Define→dsl.Run) — definitions converge on the same emitters.