function schemaTypeToGoType()

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