Skip to content

Commit 254aba7

Browse files
archerzzMingzhe Huang (from Dev Box)
andauthored
refactor(http-client-csharp): improve error message of no root client (#5475)
- add a `no-root-client` diagnostic error - report diagnostic error instead of throwing exception when there is no root client resolve #5363 --------- Co-authored-by: Mingzhe Huang (from Dev Box) <[email protected]>
1 parent 92162ab commit 254aba7

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

packages/http-client-csharp/emitter/src/lib/client-model-builder.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
SdkType,
1212
UsageFlags,
1313
} from "@azure-tools/typespec-client-generator-core";
14+
import { NoTarget } from "@typespec/compiler";
1415
import { NetEmitterOptions, resolveOptions } from "../options.js";
1516
import { CodeModel } from "../type/code-model.js";
1617
import { InputClient } from "../type/input-client.js";
@@ -20,6 +21,7 @@ import { InputEnumType, InputModelType, InputType } from "../type/input-type.js"
2021
import { RequestLocation } from "../type/request-location.js";
2122
import { SdkTypeMap } from "../type/sdk-type-map.js";
2223
import { fromSdkType } from "./converter.js";
24+
import { reportDiagnostic } from "./lib.js";
2325
import { Logger } from "./logger.js";
2426
import { navigateModels } from "./model.js";
2527
import { fromSdkServiceMethod, getParameterDefaultValue } from "./operation-converter.js";
@@ -38,17 +40,19 @@ export function createModel(sdkContext: SdkContext<NetEmitterOptions>): CodeMode
3840

3941
const sdkApiVersionEnums = sdkPackage.enums.filter((e) => e.usage === UsageFlags.ApiVersionEnum);
4042

43+
const rootClients = sdkPackage.clients.filter((c) => c.initialization.access === "public");
44+
if (rootClients.length === 0) {
45+
reportDiagnostic(sdkContext.program, { code: "no-root-client", format: {}, target: NoTarget });
46+
return {} as CodeModel;
47+
}
48+
4149
const rootApiVersions =
4250
sdkApiVersionEnums.length > 0
4351
? sdkApiVersionEnums[0].values.map((v) => v.value as string).flat()
44-
: getRootApiVersions(sdkPackage.clients);
52+
: rootClients[0].apiVersions;
4553

4654
const inputClients: InputClient[] = [];
47-
fromSdkClients(
48-
sdkPackage.clients.filter((c) => c.initialization.access === "public"),
49-
inputClients,
50-
[],
51-
);
55+
fromSdkClients(rootClients, inputClients, []);
5256

5357
const clientModel: CodeModel = {
5458
Name: sdkPackage.rootNamespace,
@@ -177,14 +181,6 @@ export function createModel(sdkContext: SdkContext<NetEmitterOptions>): CodeMode
177181
}
178182
}
179183

180-
function getRootApiVersions(clients: SdkClientType<SdkHttpOperation>[]): string[] {
181-
// find any root client since they should have the same api versions
182-
const oneRootClient = clients.find((c) => c.initialization.access === "public");
183-
if (!oneRootClient) throw new Error("Root client not found");
184-
185-
return oneRootClient.apiVersions;
186-
}
187-
188184
function getMethodUri(p: SdkEndpointParameter | undefined): string {
189185
if (!p) return "";
190186

packages/http-client-csharp/emitter/src/lib/lib.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ const $lib = createTypeSpecLibrary({
3737
default: paramMessage`${"message"}`,
3838
},
3939
},
40+
"no-root-client": {
41+
severity: "error",
42+
messages: {
43+
default:
44+
"Cannot generate CSharp SDK since no public root client is defined in typespec file.",
45+
},
46+
},
4047
},
4148
emitter: {
4249
options: NetEmitterOptionsSchema,

0 commit comments

Comments
 (0)