@autorest/openapi-to-cadl
Version:
Autorest plugin to scaffold a Typespec definition from an OpenAPI document
53 lines (45 loc) • 1.81 kB
text/typescript
import { CadlProgram, EndpointParameter } from "../interfaces";
import { generateDocs } from "../utils/docs";
import { getNamespace } from "../utils/namespace";
export function generateServiceInformation(program: CadlProgram) {
const { serviceInformation } = program;
const definitions: string[] = [];
definitions.push(`@service({
title: "${serviceInformation.name}"
${serviceInformation.version ? `, version: "${serviceInformation.version}"` : ""}
})`);
if (serviceInformation.endpoint) {
definitions.push(`@server("${serviceInformation.endpoint}", ${JSON.stringify(serviceInformation.doc) ?? ""}`);
const parametrizedHost = getEndpointParameters(serviceInformation.endpoint);
const hasParameters =
(serviceInformation.endpointParameters && serviceInformation.endpointParameters.length) ||
parametrizedHost.length;
const allParams: EndpointParameter[] = [
...(serviceInformation.endpointParameters ?? []).filter((p) => !parametrizedHost.some((e) => e.name === p.name)),
...parametrizedHost,
];
if (hasParameters) {
definitions.push(", {");
for (const param of allParams ?? []) {
const doc = generateDocs(param);
doc && definitions.push(doc);
definitions.push(`${param.name}: string `);
}
}
hasParameters && definitions.push("}");
definitions.push(")");
}
const serviceDoc = generateDocs(serviceInformation);
serviceDoc && definitions.push(serviceDoc);
definitions.push(getNamespace(program));
return definitions.join("\n");
}
function getEndpointParameters(endpoint: string) {
const regex = /{([^{}]+)}/g;
const params: EndpointParameter[] = [];
let match;
while ((match = regex.exec(endpoint)) !== null) {
params.push({ name: match[1] });
}
return params;
}