in src/typespec-aaz/src/convertor.ts [426:533]
function extractHttpResponses(
context: AAZOperationEmitterContext,
operation: HttpOperation,
lroMetadata: LroMetadata | undefined,
): CMDHttpResponse[] | undefined {
let success202Response: CMDHttpResponse | undefined; // only one success 202 response is allowed
let success204Response: CMDHttpResponse | undefined; // only one success 204 response is allowed
let success2xxResponse: CMDHttpResponse | undefined; // only one success 2xx(except 202 and 204) response is allowed
let redirectResponse: CMDHttpResponse | undefined;
const errorResponses = [];
for (const response of operation.responses) {
let statusCodes = getOpenAPI2StatusCodes(context, response.statusCodes, response.type);
if (statusCodes.length === 0) {
reportDiagnostic(context.program, {
code: "missing-status-codes",
target: response.type,
});
}
if (statusCodes.includes("default")) {
errorResponses.push(convert2CMDHttpResponse(context, response, undefined, true));
continue;
}
const isSuccess = statusCodes.map((code) => code.startsWith("2")).includes(true);
const isRedirect = statusCodes.map((code) => code.startsWith("3")).includes(true);
const isError = !isSuccess && !isRedirect;
if (isSuccess) {
if (statusCodes.includes("202")) {
if (success202Response !== undefined) {
reportDiagnostic(context.program, {
code: "Duplicated-success-202",
target: response.type,
});
}
success202Response = convert2CMDHttpResponse(context, response, ["202"], false);
}
if (statusCodes.includes("204")) {
if (success204Response !== undefined) {
reportDiagnostic(context.program, {
code: "Duplicated-success-204",
target: response.type,
});
}
success204Response = convert2CMDHttpResponse(context, response, ["204"], false);
}
// remove 202 and 204 from statusCodes
statusCodes = statusCodes.filter((code) => code !== "202" && code !== "204");
if (statusCodes.length > 0) {
if (success2xxResponse !== undefined) {
success2xxResponse.statusCode = [
...success2xxResponse.statusCode!,
...statusCodes.map((code) => Number(code)),
];
context.tracer.trace("AppendSuccess2xxStatusCodes", JSON.stringify(success2xxResponse.statusCode));
} else {
success2xxResponse = convert2CMDHttpResponse(context, response, statusCodes, false);
}
}
} else if (isRedirect) {
if (redirectResponse !== undefined) {
reportDiagnostic(context.program, {
code: "Duplicated-redirect",
target: response.type,
});
}
redirectResponse = convert2CMDHttpResponse(context, response, statusCodes, false);
} else if (isError) {
errorResponses.push(convert2CMDHttpResponse(context, response, statusCodes, true));
}
}
const responses = [];
if (success2xxResponse !== undefined) {
responses.push(success2xxResponse);
}
if (success202Response !== undefined) {
responses.push(success202Response);
}
if (success204Response !== undefined) {
responses.push(success204Response);
}
const success_status_code: number[] = [
...(success2xxResponse?.statusCode || []),
...(success202Response?.statusCode || []),
...(success204Response?.statusCode || []),
];
const lro_base_status_code = success_status_code.filter((code) => [200, 201].includes(code));
if (lro_base_status_code.length === 0 && lroMetadata !== undefined && operation.verb === "delete") {
const lro_response: CMDHttpResponse = {
statusCode: [200, 201],
isError: false,
description: "Response schema for long-running operation.",
};
responses.push(lro_response);
}
if (redirectResponse !== undefined) {
responses.push(redirectResponse);
}
responses.push(...errorResponses);
if (lroMetadata !== undefined && lroMetadata.logicalResult) {
// TODO: add logicalResult in responses
}
return responses;
}