in packages/codegen.go/src/models.ts [18:145]
export async function generateModels(codeModel: go.CodeModel): Promise<ModelsSerDe> {
if (codeModel.models.length === 0) {
return {
models: '',
serDe: ''
};
}
// this list of packages to import
const modelImports = new ImportManager();
const serdeImports = new ImportManager();
let modelText = helpers.contentPreamble(codeModel);
// we do model generation first as it can add imports to the imports list
const modelDefs = generateModelDefs(modelImports, serdeImports, codeModel);
modelText += modelImports.text();
// structs
let needsJSONPopulate = false;
let needsJSONUnpopulate = false;
let needsJSONPopulateByteArray = false;
let needsJSONPopulateAny = false;
let needsJSONPopulateMultipart = false;
let serdeTextBody = '';
for (const modelDef of values(modelDefs)) {
modelText += modelDef.text();
modelDef.Methods.sort((a: ModelMethod, b: ModelMethod) => { return helpers.sortAscending(a.name, b.name); });
for (const method of values(modelDef.Methods)) {
if (method.desc.length > 0) {
modelText += `${comment(method.desc, '// ', undefined, helpers.commentLength)}\n`;
}
modelText += method.text;
}
modelDef.SerDe.methods.sort((a: ModelMethod, b: ModelMethod) => { return helpers.sortAscending(a.name, b.name); });
for (const method of values(modelDef.SerDe.methods)) {
if (method.desc.length > 0) {
serdeTextBody += `${comment(method.desc, '// ', undefined, helpers.commentLength)}\n`;
}
serdeTextBody += method.text;
}
if (modelDef.SerDe.needsJSONPopulate) {
needsJSONPopulate = true;
}
if (modelDef.SerDe.needsJSONUnpopulate) {
needsJSONUnpopulate = true;
}
if (modelDef.SerDe.needsJSONPopulateByteArray) {
needsJSONPopulateByteArray = true;
}
if (modelDef.SerDe.needsJSONPopulateAny) {
needsJSONPopulateAny = true;
}
if (modelDef.SerDe.needsJSONPopulateMultipart) {
needsJSONPopulateMultipart = true;
}
}
if (needsJSONPopulate) {
serdeImports.add('reflect');
serdeImports.add('github.com/Azure/azure-sdk-for-go/sdk/azcore');
serdeTextBody += 'func populate(m map[string]any, k string, v any) {\n';
serdeTextBody += '\tif v == nil {\n';
serdeTextBody += '\t\treturn\n';
serdeTextBody += '\t} else if azcore.IsNullValue(v) {\n';
serdeTextBody += '\t\tm[k] = nil\n';
serdeTextBody += '\t} else if !reflect.ValueOf(v).IsNil() {\n';
serdeTextBody += '\t\tm[k] = v\n';
serdeTextBody += '\t}\n';
serdeTextBody += '}\n\n';
}
if (needsJSONPopulateAny) {
serdeImports.add('github.com/Azure/azure-sdk-for-go/sdk/azcore');
serdeTextBody += 'func populateAny(m map[string]any, k string, v any) {\n';
serdeTextBody += '\tif v == nil {\n';
serdeTextBody += '\t\treturn\n';
serdeTextBody += '\t} else if azcore.IsNullValue(v) {\n';
serdeTextBody += '\t\tm[k] = nil\n';
serdeTextBody += '\t} else {\n';
serdeTextBody += '\t\tm[k] = v\n';
serdeTextBody += '\t}\n';
serdeTextBody += '}\n\n';
}
if (needsJSONPopulateByteArray) {
serdeImports.add('github.com/Azure/azure-sdk-for-go/sdk/azcore');
serdeImports.add('github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime');
serdeTextBody += 'func populateByteArray[T any](m map[string]any, k string, b []T, convert func() any) {\n';
serdeTextBody += '\tif azcore.IsNullValue(b) {\n';
serdeTextBody += '\t\tm[k] = nil\n';
serdeTextBody += '\t} else if len(b) == 0 {\n';
serdeTextBody += '\t\treturn\n';
serdeTextBody += '\t} else {\n';
serdeTextBody += '\t\tm[k] = convert()\n';
serdeTextBody += '\t}\n';
serdeTextBody += '}\n\n';
}
if (needsJSONUnpopulate) {
serdeImports.add('fmt');
serdeTextBody += 'func unpopulate(data json.RawMessage, fn string, v any) error {\n';
serdeTextBody += '\tif data == nil || string(data) == "null" {\n';
serdeTextBody += '\t\treturn nil\n';
serdeTextBody += '\t}\n';
serdeTextBody += '\tif err := json.Unmarshal(data, v); err != nil {\n';
serdeTextBody += '\t\treturn fmt.Errorf("struct field %s: %v", fn, err)\n';
serdeTextBody += '\t}\n';
serdeTextBody += '\treturn nil\n';
serdeTextBody += '}\n\n';
}
if (needsJSONPopulateMultipart) {
serdeImports.add('encoding/json');
serdeTextBody += 'func populateMultipartJSON(m map[string]any, k string, v any) error {\n';
serdeTextBody += '\tdata, err := json.Marshal(v)\n';
serdeTextBody += '\tif err != nil {\n\t\treturn err\n\t}\n';
serdeTextBody += '\tm[k] = data\n\treturn nil\n';
serdeTextBody += '}\n\n';
}
let serdeText = '';
if (serdeTextBody.length > 0) {
serdeText = helpers.contentPreamble(codeModel);
serdeText += serdeImports.text();
serdeText += serdeTextBody;
}
return {
models: modelText,
serDe: serdeText
};
}