export async function generateModels()

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
  };
}