in packages/codegen.go/src/models.ts [147:226]
function generateModelDefs(modelImports: ImportManager, serdeImports: ImportManager, codeModel: go.CodeModel): Array<ModelDef> {
const models = codeModel.models;
const modelDefs = new Array<ModelDef>();
for (const model of models) {
for (const field of model.fields) {
const descriptionMods = new Array<string>();
if (field.annotations.readOnly) {
descriptionMods.push('READ-ONLY');
} else if (field.annotations.required && (!go.isLiteralValue(field.type) || model.usage === go.UsageFlags.Output)) {
descriptionMods.push('REQUIRED');
} else if (go.isLiteralValue(field.type)) {
if (!field.annotations.required) {
descriptionMods.push('FLAG');
}
descriptionMods.push('CONSTANT');
}
if (go.isLiteralValue(field.type) && model.usage !== go.UsageFlags.Output) {
// add a comment with the const value for const properties that are sent over the wire
if (field.docs.description) {
field.docs.description += '\n';
}
field.docs.description += `Field has constant value ${helpers.formatLiteralValue(field.type, false)}, any specified value is ignored.`;
}
if (field.docs.description) {
descriptionMods.push(field.docs.description);
} else if (go.isSliceType(field.type) && field.type.rawJSONAsBytes) {
// add a basic description if one isn't available
descriptionMods.push('The contents of this field are raw JSON.');
}
field.docs.description = descriptionMods.join('; ');
}
const serDeFormat = helpers.getSerDeFormat(model, codeModel);
const modelDef = new ModelDef(model.name, serDeFormat, model.fields, model.docs);
for (const field of values(modelDef.Fields)) {
modelImports.addImportForType(field.type);
}
if (go.isModelType(model) && serDeFormat === 'XML' && !model.annotations.omitSerDeMethods) {
serdeImports.add('encoding/xml');
let needsDateTimeMarshalling = false;
let byteArrayFormat = false;
for (const field of values(model.fields)) {
serdeImports.addImportForType(field.type);
if (go.isTimeType(field.type)) {
needsDateTimeMarshalling = true;
} else if (go.isBytesType(field.type)) {
byteArrayFormat = true;
}
}
// due to differences in XML marshallers/unmarshallers, we use different codegen than for JSON
if (needsDateTimeMarshalling || model.xml?.wrapper || needsXMLArrayMarshalling(model) || byteArrayFormat) {
generateXMLMarshaller(model, modelDef, serdeImports);
if (needsDateTimeMarshalling || byteArrayFormat) {
generateXMLUnmarshaller(model, modelDef, serdeImports);
}
} else if (needsXMLDictionaryHelper(model)) {
generateXMLMarshaller(model, modelDef, serdeImports);
generateXMLUnmarshaller(model, modelDef, serdeImports);
}
modelDefs.push(modelDef);
continue;
}
if (go.isPolymorphicType(model)) {
generateDiscriminatorMarkerMethod(model.interface, modelDef);
for (let parent = model.interface.parent; parent !== undefined; parent = parent.parent) {
generateDiscriminatorMarkerMethod(parent, modelDef);
}
}
if (model.annotations.multipartFormData) {
generateToMultipartForm(modelDef);
modelDef.SerDe.needsJSONPopulateMultipart = true;
} else if (!model.annotations.omitSerDeMethods) {
generateJSONMarshaller(model, modelDef, serdeImports);
generateJSONUnmarshaller(model, modelDef, serdeImports, codeModel.options);
}
modelDefs.push(modelDef);
}
return modelDefs;
}