in packages/typespec-go/src/tcgcadapter/clients.ts [479:568]
private adaptMethodParameter(param: tcgc.SdkBodyParameter | tcgc.SdkHeaderParameter | tcgc.SdkPathParameter | tcgc.SdkQueryParameter | tcgc.SdkCookieParameter): go.Parameter {
if (param.isApiVersionParam && param.clientDefaultValue) {
// we emit the api version param inline as a literal, never as a param.
// the ClientOptions.APIVersion setting is used to change the version.
const paramType = new go.LiteralValue(new go.PrimitiveType('string'), param.clientDefaultValue);
switch (param.kind) {
case 'header':
return new go.HeaderParameter(param.name, param.serializedName, paramType, 'literal', true, 'method');
case 'path':
return new go.PathParameter(param.name, param.serializedName, true, paramType, 'literal', true, 'method');
case 'query':
return new go.QueryParameter(param.name, param.serializedName, true, paramType, 'literal', true, 'method');
default:
throw new AdapterError('UnsupportedTsp', `unsupported API version param kind ${param.kind}`, param.__raw?.node ?? NoTarget);
}
}
let location: go.ParameterLocation = 'method';
const getClientParamsKey = function (param: tcgc.SdkBodyParameter | tcgc.SdkHeaderParameter | tcgc.SdkPathParameter | tcgc.SdkQueryParameter | tcgc.SdkCookieParameter): string {
// include the param kind in the key name as a client param can be used
// in different places across methods (path/query)
return `${param.name}-${param.kind}`;
};
if (param.onClient) {
// check if we've already adapted this client parameter
const clientParam = this.clientParams.get(getClientParamsKey(param));
if (clientParam) {
return clientParam;
}
location = 'client';
}
let adaptedParam: go.Parameter;
const paramName = getEscapedReservedName(ensureNameCase(param.name, true), 'Param');
const paramKind = this.adaptParameterKind(param);
const byVal = isTypePassedByValue(param.type);
if (param.kind === 'body') {
// TODO: form data? (non-multipart)
if (param.defaultContentType.match(/multipart/i)) {
adaptedParam = new go.MultipartFormBodyParameter(paramName, this.ta.getPossibleType(param.type, false, true), paramKind, byVal);
} else {
const contentType = this.adaptContentType(param.defaultContentType);
let bodyType = this.ta.getPossibleType(param.type, false, true);
if (contentType === 'binary') {
// tcgc models binary params as 'bytes' but we want an io.ReadSeekCloser
bodyType = this.ta.getReadSeekCloser(param.type.kind === 'array');
}
adaptedParam = new go.BodyParameter(paramName, contentType, `"${param.defaultContentType}"`, bodyType, paramKind, byVal);
}
} else if (param.kind === 'header') {
if (param.collectionFormat) {
if (param.collectionFormat === 'multi' || param.collectionFormat === 'form') {
throw new AdapterError('InternalError', `unexpected collection format ${param.collectionFormat} for HeaderCollectionParameter`, param.__raw?.node ?? NoTarget);
}
// TODO: is hard-coded false for element type by value correct?
const type = this.ta.getPossibleType(param.type, true, false);
if (!go.isSliceType(type)) {
throw new AdapterError('InternalError', `unexpected type ${go.getTypeDeclaration(type)} for HeaderCollectionParameter ${param.name}`, param.__raw?.node ?? NoTarget);
}
adaptedParam = new go.HeaderCollectionParameter(paramName, param.serializedName, type, param.collectionFormat === 'simple' ? 'csv' : param.collectionFormat, paramKind, byVal, location);
} else {
adaptedParam = new go.HeaderParameter(paramName, param.serializedName, this.adaptHeaderType(param.type, true), paramKind, byVal, location);
}
} else if (param.kind === 'path') {
adaptedParam = new go.PathParameter(paramName, param.serializedName, !param.allowReserved, this.adaptPathParameterType(param.type), paramKind, byVal, location);
} else if (param.kind === 'cookie') {
// TODO: currently we don't have Azure service using cookie parameter. need to add support if needed in the future.
throw new AdapterError('UnsupportedTsp', 'unsupported parameter type cookie', param.__raw?.node ?? NoTarget);
} else {
if (param.collectionFormat) {
const type = this.ta.getPossibleType(param.type, true, false);
if (!go.isSliceType(type)) {
throw new AdapterError('InternalError', `unexpected type ${go.getTypeDeclaration(type)} for QueryCollectionParameter ${param.name}`, param.__raw?.node ?? NoTarget);
}
// TODO: unencoded query param
adaptedParam = new go.QueryCollectionParameter(paramName, param.serializedName, true, type, param.collectionFormat === 'simple' ? 'csv' : (param.collectionFormat === 'form' ? 'multi' : param.collectionFormat), paramKind, byVal, location);
} else {
// TODO: unencoded query param
adaptedParam = new go.QueryParameter(paramName, param.serializedName, true, this.adaptQueryParameterType(param.type), paramKind, byVal, location);
}
}
if (adaptedParam.location === 'client') {
// track client parameter for later use
this.clientParams.set(getClientParamsKey(param), adaptedParam);
}
return adaptedParam;
}