in packages/autorest.go/src/transform/transform.ts [250:376]
function schemaTypeToGoType(codeModel: m4.CodeModel, schema: m4.Schema, type: 'Property' | 'InBody' | 'HeaderParam' | 'PathParam' | 'QueryParam'): string {
const rawJSONAsBytes = <boolean>codeModel.language.go!.rawJSONAsBytes;
switch (schema.type) {
case m4.SchemaType.Any:
if (rawJSONAsBytes) {
schema.language.go!.rawJSONAsBytes = rawJSONAsBytes;
return '[]byte';
}
return 'any';
case m4.SchemaType.AnyObject:
if (rawJSONAsBytes) {
schema.language.go!.rawJSONAsBytes = rawJSONAsBytes;
return '[]byte';
}
return 'map[string]any';
case m4.SchemaType.ArmId:
return 'string';
case m4.SchemaType.Array: {
const arraySchema = <m4.ArraySchema>schema;
const arrayElem = arraySchema.elementType;
if (rawJSONAsBytes && (arrayElem.type === m4.SchemaType.Any || arrayElem.type === m4.SchemaType.AnyObject)) {
schema.language.go!.rawJSONAsBytes = rawJSONAsBytes;
// propagate the setting to the element type
arrayElem.language.go!.rawJSONAsBytes = rawJSONAsBytes;
return '[][]byte';
}
arraySchema.language.go!.elementIsPtr = !helpers.isTypePassedByValue(arrayElem) && !<boolean>codeModel.language.go!.sliceElementsByValue;
// passing nil for array elements in headers, paths, and query params
// isn't very useful as we'd just skip nil entries. so disable it.
if (type !== 'Property' && type !== 'InBody') {
arraySchema.language.go!.elementIsPtr = false;
}
arrayElem.language.go!.name = schemaTypeToGoType(codeModel, arrayElem, type);
if (<boolean>arraySchema.language.go!.elementIsPtr) {
return `[]*${arrayElem.language.go!.name}`;
}
return `[]${arrayElem.language.go!.name}`;
}
case m4.SchemaType.Binary:
return 'io.ReadSeekCloser';
case m4.SchemaType.Boolean:
return 'bool';
case m4.SchemaType.ByteArray:
return '[]byte';
case m4.SchemaType.Char:
return 'rune';
case m4.SchemaType.Constant: {
const constSchema = <m4.ConstantSchema>schema;
constSchema.valueType.language.go!.name = schemaTypeToGoType(codeModel, constSchema.valueType, type);
return constSchema.valueType.language.go!.name;
}
case m4.SchemaType.DateTime: {
const dateTime = <m4.DateTimeSchema>schema;
if (dateTime.format === 'date-time-rfc1123') {
schema.language.go!.internalTimeType = 'dateTimeRFC1123';
} else {
schema.language.go!.internalTimeType = 'dateTimeRFC3339';
}
if (type === 'InBody') {
// add a marker to the code model indicating that we need
// to include support for marshalling/unmarshalling time.
// header/query param values are parsed separately so they
// don't need the custom time types.
if (dateTime.format === 'date-time-rfc1123') {
codeModel.language.go!.generateDateTimeRFC1123Helper = true;
} else {
codeModel.language.go!.generateDateTimeRFC3339Helper = true;
}
}
return 'time.Time';
}
case m4.SchemaType.UnixTime:
// unix time always requires the helper time type
codeModel.language.go!.generateUnixTimeHelper = true;
schema.language.go!.internalTimeType = 'timeUnix';
return 'time.Time';
case m4.SchemaType.Dictionary: {
const dictSchema = <m4.DictionarySchema>schema;
const dictElem = dictSchema.elementType;
if (rawJSONAsBytes && (dictElem.type === m4.SchemaType.Any || dictElem.type === m4.SchemaType.AnyObject)) {
dictSchema.elementType = dictionaryElementAnySchema;
return `map[string]${dictionaryElementAnySchema.language.go!.name}`;
}
dictSchema.language.go!.elementIsPtr = !helpers.isTypePassedByValue(dictSchema.elementType);
dictElem.language.go!.name = schemaTypeToGoType(codeModel, dictElem, type);
if (<boolean>dictSchema.language.go!.elementIsPtr) {
return `map[string]*${dictElem.language.go!.name}`;
}
return `map[string]${dictElem.language.go!.name}`;
}
case m4.SchemaType.Integer:
if ((<m4.NumberSchema>schema).precision === 32) {
return 'int32';
}
return 'int64';
case m4.SchemaType.Number:
if ((<m4.NumberSchema>schema).precision === 32) {
return 'float32';
}
return 'float64';
case m4.SchemaType.Credential:
case m4.SchemaType.Duration:
case m4.SchemaType.ODataQuery:
case m4.SchemaType.String:
case m4.SchemaType.Uuid:
case m4.SchemaType.Uri:
return 'string';
case m4.SchemaType.Date:
schema.language.go!.internalTimeType = 'dateType';
if (type === 'InBody') {
codeModel.language.go!.generateDateHelper = true;
}
return 'time.Time';
case m4.SchemaType.Time:
schema.language.go!.internalTimeType = 'timeRFC3339';
if (type === 'InBody') {
codeModel.language.go!.generateTimeRFC3339Helper = true;
}
return 'time.Time';
case m4.SchemaType.Choice:
case m4.SchemaType.SealedChoice:
case m4.SchemaType.Object:
return schema.language.go!.name;
default:
throw new Error(`unhandled schema type ${schema.type}`);
}
}