@azure-tools/typespec-go 0.14.2 → 0.15.0-dev.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +669 -0
- package/README.md +6 -4
- package/dist/{codegen.go/src/core/clientFactory.d.ts → src/codegen/core/client-factory.d.ts} +2 -2
- package/dist/src/codegen/core/client-factory.d.ts.map +1 -0
- package/dist/{codegen.go/src/core/clientFactory.js → src/codegen/core/client-factory.js} +29 -24
- package/dist/src/codegen/core/client-factory.js.map +1 -0
- package/dist/{codegen.go/src/core/cloudConfig.d.ts → src/codegen/core/cloud-config.d.ts} +2 -2
- package/dist/src/codegen/core/cloud-config.d.ts.map +1 -0
- package/dist/{codegen.go/src/core/cloudConfig.js → src/codegen/core/cloud-config.js} +10 -9
- package/dist/src/codegen/core/cloud-config.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/constants.d.ts +1 -1
- package/dist/src/codegen/core/constants.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/constants.js +9 -9
- package/dist/src/codegen/core/constants.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/errors.d.ts +1 -1
- package/dist/src/codegen/core/errors.d.ts.map +1 -0
- package/dist/src/codegen/core/errors.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/example.d.ts +1 -1
- package/dist/src/codegen/core/example.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/example.js +155 -140
- package/dist/src/codegen/core/example.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/gomod.d.ts +1 -1
- package/dist/src/codegen/core/gomod.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/gomod.js +8 -8
- package/dist/src/codegen/core/gomod.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/helpers.d.ts +5 -5
- package/dist/src/codegen/core/helpers.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/helpers.js +308 -284
- package/dist/src/codegen/core/helpers.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/imports.d.ts +1 -1
- package/dist/src/codegen/core/imports.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/imports.js +19 -18
- package/dist/src/codegen/core/imports.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/interfaces.d.ts +1 -1
- package/dist/src/codegen/core/interfaces.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/interfaces.js +5 -5
- package/dist/src/codegen/core/interfaces.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/license.d.ts +1 -1
- package/dist/src/codegen/core/license.d.ts.map +1 -0
- package/dist/src/codegen/core/license.js.map +1 -0
- package/dist/src/codegen/core/metadata.d.ts +3 -0
- package/dist/src/codegen/core/metadata.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/metadata.js +1 -1
- package/dist/src/codegen/core/metadata.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/models.d.ts +2 -2
- package/dist/src/codegen/core/models.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/models.js +215 -184
- package/dist/src/codegen/core/models.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/operations.d.ts +1 -1
- package/dist/src/codegen/core/operations.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/operations.js +383 -360
- package/dist/src/codegen/core/operations.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/options.d.ts +1 -1
- package/dist/src/codegen/core/options.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/options.js +11 -11
- package/dist/src/codegen/core/options.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/polymorphics.d.ts +1 -1
- package/dist/src/codegen/core/polymorphics.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/polymorphics.js +30 -30
- package/dist/src/codegen/core/polymorphics.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/responses.d.ts +1 -1
- package/dist/src/codegen/core/responses.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/responses.js +28 -28
- package/dist/src/codegen/core/responses.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/version.d.ts +1 -1
- package/dist/src/codegen/core/version.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/core/version.js +4 -4
- package/dist/src/codegen/core/version.js.map +1 -0
- package/dist/{codegen.go/src/core/xmlAdditionalProps.d.ts → src/codegen/core/xml-additional-props.d.ts} +2 -2
- package/dist/src/codegen/core/xml-additional-props.d.ts.map +1 -0
- package/dist/{codegen.go/src/core/xmlAdditionalProps.js → src/codegen/core/xml-additional-props.js} +11 -11
- package/dist/src/codegen/core/xml-additional-props.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/emitter.d.ts +2 -2
- package/dist/src/codegen/emitter.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/emitter.js +58 -54
- package/dist/src/codegen/emitter.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/factory.d.ts +1 -1
- package/dist/src/codegen/fake/factory.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/factory.js +22 -21
- package/dist/src/codegen/fake/factory.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/internal.d.ts +1 -1
- package/dist/src/codegen/fake/internal.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/internal.js +13 -13
- package/dist/src/codegen/fake/internal.js.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/servers.d.ts +1 -1
- package/dist/src/codegen/fake/servers.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/fake/servers.js +332 -300
- package/dist/src/codegen/fake/servers.js.map +1 -0
- package/dist/src/codegen/index.d.ts +4 -0
- package/dist/src/codegen/index.d.ts.map +1 -0
- package/dist/{codegen.go/src → src/codegen}/index.js +3 -3
- package/dist/src/codegen/index.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/client.d.ts +25 -25
- package/dist/src/codemodel/client.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/client.js +32 -32
- package/dist/src/codemodel/client.js.map +1 -0
- package/dist/{codemodel.go/src/codeModel.d.ts → src/codemodel/code-model.d.ts} +3 -3
- package/dist/src/codemodel/code-model.d.ts.map +1 -0
- package/dist/{codemodel.go/src/codeModel.js → src/codemodel/code-model.js} +1 -1
- package/dist/src/codemodel/code-model.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/errors.d.ts +5 -5
- package/dist/src/codemodel/errors.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/errors.js +1 -1
- package/dist/src/codemodel/errors.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/examples.d.ts +13 -13
- package/dist/src/codemodel/examples.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/examples.js +10 -10
- package/dist/src/codemodel/examples.js.map +1 -0
- package/dist/src/codemodel/index.d.ts +9 -0
- package/dist/src/codemodel/index.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/index.js +8 -8
- package/dist/src/codemodel/index.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/method.d.ts +1 -1
- package/dist/src/codemodel/method.d.ts.map +1 -0
- package/dist/src/codemodel/method.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/module.d.ts +8 -8
- package/dist/src/codemodel/module.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/module.js +12 -11
- package/dist/src/codemodel/module.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/param.d.ts +26 -26
- package/dist/src/codemodel/param.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/param.js +56 -53
- package/dist/src/codemodel/param.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/result.d.ts +15 -15
- package/dist/src/codemodel/result.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/result.js +27 -27
- package/dist/src/codemodel/result.js.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/type.d.ts +30 -30
- package/dist/src/codemodel/type.d.ts.map +1 -0
- package/dist/{codemodel.go/src → src/codemodel}/type.js +77 -76
- package/dist/src/codemodel/type.js.map +1 -0
- package/dist/{typespec-go/src → src}/emitter.d.ts +2 -3
- package/dist/src/emitter.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/emitter.js +56 -45
- package/dist/src/emitter.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/index.js +2 -2
- package/dist/src/index.js.map +1 -0
- package/dist/{typespec-go/src → src}/lib.d.ts +16 -16
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/lib.js +60 -61
- package/dist/src/lib.js.map +1 -0
- package/dist/src/naming/index.d.ts +3 -0
- package/dist/src/naming/index.d.ts.map +1 -0
- package/dist/{naming.go/src → src/naming}/index.js +2 -2
- package/dist/src/naming/index.js.map +1 -0
- package/dist/src/naming/mappings.d.ts.map +1 -0
- package/dist/src/naming/mappings.js +294 -0
- package/dist/src/naming/mappings.js.map +1 -0
- package/dist/src/naming/naming.d.ts.map +1 -0
- package/dist/{naming.go/src → src/naming}/naming.js +10 -10
- package/dist/src/naming/naming.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/adapter.d.ts +3 -3
- package/dist/src/tcgcadapter/adapter.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/adapter.js +35 -31
- package/dist/src/tcgcadapter/adapter.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/clients.d.ts +1 -1
- package/dist/src/tcgcadapter/clients.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/clients.js +360 -310
- package/dist/src/tcgcadapter/clients.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/errors.d.ts +2 -2
- package/dist/src/tcgcadapter/errors.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/errors.js +1 -1
- package/dist/src/tcgcadapter/errors.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/helpers.d.ts +3 -3
- package/dist/src/tcgcadapter/helpers.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/helpers.js +41 -30
- package/dist/src/tcgcadapter/helpers.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/metadata.d.ts +2 -2
- package/dist/src/tcgcadapter/metadata.d.ts.map +1 -0
- package/dist/src/tcgcadapter/metadata.js +47 -0
- package/dist/src/tcgcadapter/metadata.js.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/types.d.ts +2 -2
- package/dist/src/tcgcadapter/types.d.ts.map +1 -0
- package/dist/{typespec-go/src → src}/tcgcadapter/types.js +221 -193
- package/dist/src/tcgcadapter/types.js.map +1 -0
- package/package.json +77 -62
- package/dist/codegen.go/src/core/clientFactory.d.ts.map +0 -1
- package/dist/codegen.go/src/core/clientFactory.js.map +0 -1
- package/dist/codegen.go/src/core/cloudConfig.d.ts.map +0 -1
- package/dist/codegen.go/src/core/cloudConfig.js.map +0 -1
- package/dist/codegen.go/src/core/constants.d.ts.map +0 -1
- package/dist/codegen.go/src/core/constants.js.map +0 -1
- package/dist/codegen.go/src/core/errors.d.ts.map +0 -1
- package/dist/codegen.go/src/core/errors.js.map +0 -1
- package/dist/codegen.go/src/core/example.d.ts.map +0 -1
- package/dist/codegen.go/src/core/example.js.map +0 -1
- package/dist/codegen.go/src/core/gomod.d.ts.map +0 -1
- package/dist/codegen.go/src/core/gomod.js.map +0 -1
- package/dist/codegen.go/src/core/helpers.d.ts.map +0 -1
- package/dist/codegen.go/src/core/helpers.js.map +0 -1
- package/dist/codegen.go/src/core/imports.d.ts.map +0 -1
- package/dist/codegen.go/src/core/imports.js.map +0 -1
- package/dist/codegen.go/src/core/interfaces.d.ts.map +0 -1
- package/dist/codegen.go/src/core/interfaces.js.map +0 -1
- package/dist/codegen.go/src/core/license.d.ts.map +0 -1
- package/dist/codegen.go/src/core/license.js.map +0 -1
- package/dist/codegen.go/src/core/metadata.d.ts +0 -3
- package/dist/codegen.go/src/core/metadata.d.ts.map +0 -1
- package/dist/codegen.go/src/core/metadata.js.map +0 -1
- package/dist/codegen.go/src/core/models.d.ts.map +0 -1
- package/dist/codegen.go/src/core/models.js.map +0 -1
- package/dist/codegen.go/src/core/operations.d.ts.map +0 -1
- package/dist/codegen.go/src/core/operations.js.map +0 -1
- package/dist/codegen.go/src/core/options.d.ts.map +0 -1
- package/dist/codegen.go/src/core/options.js.map +0 -1
- package/dist/codegen.go/src/core/polymorphics.d.ts.map +0 -1
- package/dist/codegen.go/src/core/polymorphics.js.map +0 -1
- package/dist/codegen.go/src/core/responses.d.ts.map +0 -1
- package/dist/codegen.go/src/core/responses.js.map +0 -1
- package/dist/codegen.go/src/core/version.d.ts.map +0 -1
- package/dist/codegen.go/src/core/version.js.map +0 -1
- package/dist/codegen.go/src/core/xmlAdditionalProps.d.ts.map +0 -1
- package/dist/codegen.go/src/core/xmlAdditionalProps.js.map +0 -1
- package/dist/codegen.go/src/emitter.d.ts.map +0 -1
- package/dist/codegen.go/src/emitter.js.map +0 -1
- package/dist/codegen.go/src/fake/factory.d.ts.map +0 -1
- package/dist/codegen.go/src/fake/factory.js.map +0 -1
- package/dist/codegen.go/src/fake/internal.d.ts.map +0 -1
- package/dist/codegen.go/src/fake/internal.js.map +0 -1
- package/dist/codegen.go/src/fake/servers.d.ts.map +0 -1
- package/dist/codegen.go/src/fake/servers.js.map +0 -1
- package/dist/codegen.go/src/index.d.ts +0 -4
- package/dist/codegen.go/src/index.d.ts.map +0 -1
- package/dist/codegen.go/src/index.js.map +0 -1
- package/dist/codemodel.go/src/client.d.ts.map +0 -1
- package/dist/codemodel.go/src/client.js.map +0 -1
- package/dist/codemodel.go/src/codeModel.d.ts.map +0 -1
- package/dist/codemodel.go/src/codeModel.js.map +0 -1
- package/dist/codemodel.go/src/errors.d.ts.map +0 -1
- package/dist/codemodel.go/src/errors.js.map +0 -1
- package/dist/codemodel.go/src/examples.d.ts.map +0 -1
- package/dist/codemodel.go/src/examples.js.map +0 -1
- package/dist/codemodel.go/src/index.d.ts +0 -9
- package/dist/codemodel.go/src/index.d.ts.map +0 -1
- package/dist/codemodel.go/src/index.js.map +0 -1
- package/dist/codemodel.go/src/method.d.ts.map +0 -1
- package/dist/codemodel.go/src/method.js.map +0 -1
- package/dist/codemodel.go/src/module.d.ts.map +0 -1
- package/dist/codemodel.go/src/module.js.map +0 -1
- package/dist/codemodel.go/src/param.d.ts.map +0 -1
- package/dist/codemodel.go/src/param.js.map +0 -1
- package/dist/codemodel.go/src/result.d.ts.map +0 -1
- package/dist/codemodel.go/src/result.js.map +0 -1
- package/dist/codemodel.go/src/type.d.ts.map +0 -1
- package/dist/codemodel.go/src/type.js.map +0 -1
- package/dist/naming.go/src/index.d.ts +0 -3
- package/dist/naming.go/src/index.d.ts.map +0 -1
- package/dist/naming.go/src/index.js.map +0 -1
- package/dist/naming.go/src/mappings.d.ts.map +0 -1
- package/dist/naming.go/src/mappings.js +0 -294
- package/dist/naming.go/src/mappings.js.map +0 -1
- package/dist/naming.go/src/naming.d.ts.map +0 -1
- package/dist/naming.go/src/naming.js.map +0 -1
- package/dist/typespec-go/src/emitter.d.ts.map +0 -1
- package/dist/typespec-go/src/emitter.js.map +0 -1
- package/dist/typespec-go/src/index.d.ts +0 -3
- package/dist/typespec-go/src/index.d.ts.map +0 -1
- package/dist/typespec-go/src/index.js.map +0 -1
- package/dist/typespec-go/src/lib.d.ts.map +0 -1
- package/dist/typespec-go/src/lib.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/adapter.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/adapter.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/clients.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/clients.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/errors.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/errors.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/helpers.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/helpers.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/metadata.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/metadata.js +0 -21
- package/dist/typespec-go/src/tcgcadapter/metadata.js.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/types.d.ts.map +0 -1
- package/dist/typespec-go/src/tcgcadapter/types.js.map +0 -1
- /package/dist/{codegen.go/src → src/codegen}/core/errors.js +0 -0
- /package/dist/{codegen.go/src → src/codegen}/core/license.js +0 -0
- /package/dist/{codemodel.go/src → src/codemodel}/method.js +0 -0
- /package/dist/{naming.go/src → src/naming}/mappings.d.ts +0 -0
- /package/dist/{naming.go/src → src/naming}/naming.d.ts +0 -0
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import * as go from
|
|
6
|
-
import * as naming from
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
5
|
+
import * as go from "../../codemodel/index.js";
|
|
6
|
+
import * as naming from "../../naming/naming.js";
|
|
7
|
+
import { CodegenError } from "../core/errors.js";
|
|
8
|
+
import * as helpers from "../core/helpers.js";
|
|
9
|
+
import { ImportManager } from "../core/imports.js";
|
|
10
|
+
import { fixUpMethodName } from "../core/operations.js";
|
|
11
|
+
import { generateServerInternal, RequiredHelpers } from "./internal.js";
|
|
12
12
|
// contains the generated content for all servers and the required helpers
|
|
13
13
|
export class ServerContent {
|
|
14
14
|
servers;
|
|
@@ -31,7 +31,7 @@ export class OperationGroupContent {
|
|
|
31
31
|
const requiredHelpers = new RequiredHelpers();
|
|
32
32
|
export function getServerName(client) {
|
|
33
33
|
// for the fake server, we use the suffix Server instead of Client
|
|
34
|
-
return naming.capitalize(client.name.replace(/[C|c]lient$/,
|
|
34
|
+
return naming.capitalize(client.name.replace(/[C|c]lient$/, "Server"));
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* Generates the contents for the *_server.go files.
|
|
@@ -50,10 +50,10 @@ export function generateServers(pkg, target) {
|
|
|
50
50
|
// the list of packages to import
|
|
51
51
|
const imports = new ImportManager(pkg);
|
|
52
52
|
// add standard imports
|
|
53
|
-
imports.add(
|
|
54
|
-
imports.add(
|
|
55
|
-
imports.add(
|
|
56
|
-
imports.add(
|
|
53
|
+
imports.add("errors");
|
|
54
|
+
imports.add("fmt");
|
|
55
|
+
imports.add("net/http");
|
|
56
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
57
57
|
const serverName = getServerName(client);
|
|
58
58
|
let content;
|
|
59
59
|
content = `// ${serverName} is a fake server for instances of the ${go.getTypeDeclaration(client, pkg)} type.\n`;
|
|
@@ -83,25 +83,25 @@ export function generateServers(pkg, target) {
|
|
|
83
83
|
}
|
|
84
84
|
let serverResponse;
|
|
85
85
|
switch (method.kind) {
|
|
86
|
-
case
|
|
87
|
-
case
|
|
86
|
+
case "lroMethod":
|
|
87
|
+
case "lroPageableMethod":
|
|
88
88
|
let respType = go.getTypeDeclaration(method.returns, pkg);
|
|
89
|
-
if (method.kind ===
|
|
89
|
+
if (method.kind === "lroPageableMethod") {
|
|
90
90
|
respType = `azfake.PagerResponder[${respType}]`;
|
|
91
91
|
}
|
|
92
92
|
serverResponse = `resp azfake.PollerResponder[${respType}], errResp azfake.ErrorResponder`;
|
|
93
93
|
break;
|
|
94
|
-
case
|
|
94
|
+
case "method":
|
|
95
95
|
serverResponse = `resp azfake.Responder[${go.getTypeDeclaration(method.returns, pkg)}], errResp azfake.ErrorResponder`;
|
|
96
96
|
break;
|
|
97
|
-
case
|
|
97
|
+
case "pageableMethod":
|
|
98
98
|
serverResponse = `resp azfake.PagerResponder[${go.getTypeDeclaration(method.returns, pkg)}]`;
|
|
99
99
|
break;
|
|
100
100
|
}
|
|
101
101
|
const operationName = fixUpMethodName(method);
|
|
102
102
|
content += `${indent.get()}// ${operationName} is the fake for method ${client.name}.${operationName}\n`;
|
|
103
103
|
const successCodes = new Array();
|
|
104
|
-
if (method.returns.result?.kind ===
|
|
104
|
+
if (method.returns.result?.kind === "anyResult") {
|
|
105
105
|
for (const httpStatus of getMethodStatusCodes(method)) {
|
|
106
106
|
const result = method.returns.result.httpStatusCodeType[httpStatus];
|
|
107
107
|
if (!result) {
|
|
@@ -120,26 +120,27 @@ export function generateServers(pkg, target) {
|
|
|
120
120
|
for (const statusCode of getMethodStatusCodes(method)) {
|
|
121
121
|
successCodes.push(`${helpers.formatStatusCode(statusCode)}`);
|
|
122
122
|
}
|
|
123
|
-
content += `${indent.get()}// HTTP status codes to indicate success: ${successCodes.join(
|
|
123
|
+
content += `${indent.get()}// HTTP status codes to indicate success: ${successCodes.join(", ")}\n`;
|
|
124
124
|
}
|
|
125
125
|
content += `${indent.get()}${operationName} func(${getAPIParametersSig(pkg, method, imports)}) (${serverResponse})\n\n`;
|
|
126
126
|
finalMethods.push(method);
|
|
127
127
|
switch (method.kind) {
|
|
128
|
-
case
|
|
129
|
-
case
|
|
128
|
+
case "lroMethod":
|
|
129
|
+
case "lroPageableMethod":
|
|
130
130
|
++countLROs;
|
|
131
131
|
break;
|
|
132
|
-
case
|
|
132
|
+
case "pageableMethod":
|
|
133
133
|
++countPagers;
|
|
134
134
|
break;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
content +=
|
|
137
|
+
content += "}\n\n";
|
|
138
138
|
///////////////////////////////////////////////////////////////////////////
|
|
139
139
|
const serverTransport = `${serverName}Transport`;
|
|
140
140
|
content += `// New${serverTransport} creates a new instance of ${serverTransport} with the provided implementation.\n`;
|
|
141
141
|
content += `// The returned ${serverTransport} instance is connected to an instance of ${go.getTypeDeclaration(client, pkg)} via the\n`;
|
|
142
|
-
content +=
|
|
142
|
+
content +=
|
|
143
|
+
"// azcore.ClientOptions.Transporter field in the client's constructor parameters.\n";
|
|
143
144
|
content += `func New${serverTransport}(srv *${serverName}) *${serverTransport} {\n`;
|
|
144
145
|
if (countLROs === 0 && countPagers === 0) {
|
|
145
146
|
content += `${indent.get()}return &${serverTransport}{srv: srv}\n}\n\n`;
|
|
@@ -151,15 +152,15 @@ export function generateServers(pkg, target) {
|
|
|
151
152
|
for (const method of finalMethods) {
|
|
152
153
|
let respType = go.getTypeDeclaration(method.returns, pkg);
|
|
153
154
|
switch (method.kind) {
|
|
154
|
-
case
|
|
155
|
-
case
|
|
156
|
-
if (method.kind ===
|
|
155
|
+
case "lroMethod":
|
|
156
|
+
case "lroPageableMethod":
|
|
157
|
+
if (method.kind === "lroPageableMethod") {
|
|
157
158
|
respType = `azfake.PagerResponder[${go.getTypeDeclaration(method.returns, pkg)}]`;
|
|
158
159
|
}
|
|
159
160
|
requiredHelpers.tracker = true;
|
|
160
161
|
content += `${indent.get()}${naming.uncapitalize(fixUpMethodName(method))}: newTracker[azfake.PollerResponder[${respType}]](),\n`;
|
|
161
162
|
break;
|
|
162
|
-
case
|
|
163
|
+
case "pageableMethod":
|
|
163
164
|
requiredHelpers.tracker = true;
|
|
164
165
|
content += `${indent.get()}${naming.uncapitalize(fixUpMethodName(method))}: newTracker[azfake.PagerResponder[${respType}]](),\n`;
|
|
165
166
|
break;
|
|
@@ -175,7 +176,7 @@ export function generateServers(pkg, target) {
|
|
|
175
176
|
// add server transports for client accessors
|
|
176
177
|
if (finalSubClients.length > 0) {
|
|
177
178
|
requiredHelpers.initServer = true;
|
|
178
|
-
imports.add(
|
|
179
|
+
imports.add("sync");
|
|
179
180
|
content += `${indent.get()}trMu sync.Mutex\n`;
|
|
180
181
|
for (const subClient of finalSubClients) {
|
|
181
182
|
const serverName = getServerName(subClient);
|
|
@@ -186,21 +187,21 @@ export function generateServers(pkg, target) {
|
|
|
186
187
|
// create state machines for any pager/poller operations
|
|
187
188
|
let respType = go.getTypeDeclaration(method.returns, pkg);
|
|
188
189
|
switch (method.kind) {
|
|
189
|
-
case
|
|
190
|
-
case
|
|
191
|
-
if (method.kind ===
|
|
190
|
+
case "lroMethod":
|
|
191
|
+
case "lroPageableMethod":
|
|
192
|
+
if (method.kind === "lroPageableMethod") {
|
|
192
193
|
respType = `azfake.PagerResponder[${go.getTypeDeclaration(method.returns, pkg)}]`;
|
|
193
194
|
}
|
|
194
195
|
requiredHelpers.tracker = true;
|
|
195
196
|
content += `${indent.get()}${naming.uncapitalize(fixUpMethodName(method))} *tracker[azfake.PollerResponder[${respType}]]\n`;
|
|
196
197
|
break;
|
|
197
|
-
case
|
|
198
|
+
case "pageableMethod":
|
|
198
199
|
requiredHelpers.tracker = true;
|
|
199
200
|
content += `${indent.get()}${naming.uncapitalize(fixUpMethodName(method))} *tracker[azfake.PagerResponder[${go.getTypeDeclaration(method.returns, pkg)}]]\n`;
|
|
200
201
|
break;
|
|
201
202
|
}
|
|
202
203
|
}
|
|
203
|
-
content +=
|
|
204
|
+
content += "}\n\n";
|
|
204
205
|
content += generateServerTransportDo(serverTransport, client, finalSubClients, finalMethods, indent);
|
|
205
206
|
content += generateServerTransportClientDispatch(serverTransport, finalSubClients, imports, indent);
|
|
206
207
|
content += generateServerTransportMethodDispatch(serverTransport, client, finalMethods, indent);
|
|
@@ -216,7 +217,7 @@ export function generateServers(pkg, target) {
|
|
|
216
217
|
text += content;
|
|
217
218
|
operations.push(new OperationGroupContent(serverName, text));
|
|
218
219
|
}
|
|
219
|
-
if (target ===
|
|
220
|
+
if (target === "azure-arm" && pkg.parent.clients.length > 0) {
|
|
220
221
|
// ARM server factory uses the initServer func
|
|
221
222
|
requiredHelpers.initServer = true;
|
|
222
223
|
}
|
|
@@ -226,8 +227,8 @@ function getTransportInterceptorVarName(client) {
|
|
|
226
227
|
return `${helpers.camelCase(getServerName(client))}TransportInterceptor`;
|
|
227
228
|
}
|
|
228
229
|
// method names for fakes dispatching
|
|
229
|
-
const dispatchMethodFake =
|
|
230
|
-
const dispatchToClientFake =
|
|
230
|
+
const dispatchMethodFake = "dispatchToMethodFake";
|
|
231
|
+
const dispatchToClientFake = "dispatchToClientFake";
|
|
231
232
|
function generateServerTransportDo(serverTransport, client, finalSubClients, finalMethods, indent) {
|
|
232
233
|
const receiverName = serverTransport[0].toLowerCase();
|
|
233
234
|
let content = `// Do implements the policy.Transporter interface for ${serverTransport}.\n`;
|
|
@@ -252,12 +253,12 @@ function generateServerTransportDo(serverTransport, client, finalSubClients, fin
|
|
|
252
253
|
else {
|
|
253
254
|
content += `${indent.get()}return ${receiverName}.${dispatchMethodFake}(req, method)\n`;
|
|
254
255
|
}
|
|
255
|
-
content +=
|
|
256
|
+
content += "}\n\n"; // end Do
|
|
256
257
|
return content;
|
|
257
258
|
}
|
|
258
259
|
function generateServerTransportClientDispatch(serverTransport, subClients, imports, indent) {
|
|
259
260
|
if (subClients.length === 0) {
|
|
260
|
-
return
|
|
261
|
+
return "";
|
|
261
262
|
}
|
|
262
263
|
/** gathers all children, not just immediate children, in breadth first order */
|
|
263
264
|
const getAllSubClientsForCase = function (client) {
|
|
@@ -290,7 +291,7 @@ function generateServerTransportClientDispatch(serverTransport, subClients, impo
|
|
|
290
291
|
return result;
|
|
291
292
|
};
|
|
292
293
|
const receiverName = serverTransport[0].toLowerCase();
|
|
293
|
-
imports.add(
|
|
294
|
+
imports.add("strings");
|
|
294
295
|
let content = `func (${receiverName} *${serverTransport}) ${dispatchToClientFake}(req *http.Request, client string) (*http.Response, error) {\n`;
|
|
295
296
|
content += `${indent.get()}var resp *http.Response\n${indent.get()}var err error\n\n`;
|
|
296
297
|
content += `${indent.get()}switch client {\n`;
|
|
@@ -299,7 +300,7 @@ function generateServerTransportClientDispatch(serverTransport, subClients, impo
|
|
|
299
300
|
const subClientsForCase = getAllSubClientsForCase(subClient);
|
|
300
301
|
const allClientNamesForCase = new Array(`"${subClient.name}"`);
|
|
301
302
|
allClientNamesForCase.push(...subClientsForCase.map((each) => `"${each.name}"`));
|
|
302
|
-
content += `${indent.get()}case ${allClientNamesForCase.join(
|
|
303
|
+
content += `${indent.get()}case ${allClientNamesForCase.join(", ")}:\n`;
|
|
303
304
|
const serverName = getServerName(subClient);
|
|
304
305
|
indent.push();
|
|
305
306
|
content += `${indent.get()}initServer(&${receiverName}.trMu, &${receiverName}.tr${serverName}, func() *${serverName}Transport {\n`;
|
|
@@ -316,7 +317,7 @@ function generateServerTransportClientDispatch(serverTransport, subClients, impo
|
|
|
316
317
|
}
|
|
317
318
|
function generateServerTransportMethodDispatch(serverTransport, client, finalMethods, indent) {
|
|
318
319
|
if (finalMethods.length === 0) {
|
|
319
|
-
return
|
|
320
|
+
return "";
|
|
320
321
|
}
|
|
321
322
|
const receiverName = serverTransport[0].toLowerCase();
|
|
322
323
|
let content = `func (${receiverName} *${serverTransport}) ${dispatchMethodFake}(req *http.Request, method string) (*http.Response, error) {\n`;
|
|
@@ -363,66 +364,66 @@ function generateServerTransportMethodDispatch(serverTransport, client, finalMet
|
|
|
363
364
|
*/
|
|
364
365
|
function generateServerTransportMethods(pkg, serverTransport, finalMethods, imports, indent) {
|
|
365
366
|
if (finalMethods.length === 0) {
|
|
366
|
-
return
|
|
367
|
+
return "";
|
|
367
368
|
}
|
|
368
369
|
imports.addForPkg(pkg.parent);
|
|
369
|
-
imports.add(
|
|
370
|
-
imports.add(
|
|
371
|
-
imports.add(
|
|
370
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/fake", "azfake");
|
|
371
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/fake/server");
|
|
372
|
+
imports.add("slices");
|
|
372
373
|
const receiverName = serverTransport[0].toLowerCase();
|
|
373
|
-
let content =
|
|
374
|
+
let content = "";
|
|
374
375
|
for (const method of finalMethods) {
|
|
375
376
|
content += `func (${receiverName} *${serverTransport}) dispatch${fixUpMethodName(method)}(req *http.Request) (*http.Response, error) {\n`;
|
|
376
377
|
content += `${indent.get()}if ${receiverName}.srv.${fixUpMethodName(method)} == nil {\n`;
|
|
377
378
|
content += `${indent.push().get()}return nil, &nonRetriableError{errors.New("fake for method ${fixUpMethodName(method)} not implemented")}\n`;
|
|
378
379
|
content += `${indent.pop().get()}}\n`;
|
|
379
380
|
switch (method.kind) {
|
|
380
|
-
case
|
|
381
|
-
case
|
|
381
|
+
case "lroMethod":
|
|
382
|
+
case "lroPageableMethod":
|
|
382
383
|
// must check LRO before pager as you can have paged LROs
|
|
383
384
|
content += dispatchForLROBody(pkg, receiverName, method, imports, indent);
|
|
384
385
|
break;
|
|
385
|
-
case
|
|
386
|
+
case "method": {
|
|
386
387
|
content += dispatchForOperationBody(pkg, receiverName, method, imports, indent);
|
|
387
388
|
content += `${indent.get()}respContent := server.GetResponseContent(respr)\n`;
|
|
388
389
|
const formattedStatusCodes = helpers.formatStatusCodes(method.httpStatusCodes);
|
|
389
390
|
content += `${indent.get()}if !slices.Contains([]int{${formattedStatusCodes}}, respContent.HTTPStatus) {\n`;
|
|
390
391
|
content += `${indent.push().get()}return nil, &nonRetriableError{fmt.Errorf("unexpected status code %d. acceptable values are ${formattedStatusCodes}", respContent.HTTPStatus)}\n`;
|
|
391
392
|
content += `${indent.pop().get()}}\n`;
|
|
392
|
-
if (!method.returns.result || method.returns.result.kind ===
|
|
393
|
+
if (!method.returns.result || method.returns.result.kind === "headAsBooleanResult") {
|
|
393
394
|
content += `${indent.get()}resp, err := server.NewResponse(respContent, req, nil)\n`;
|
|
394
395
|
}
|
|
395
|
-
else if (method.returns.result.kind ===
|
|
396
|
+
else if (method.returns.result.kind === "anyResult") {
|
|
396
397
|
content += `${indent.get()}resp, err := server.MarshalResponseAs${method.returns.result.format}(respContent, server.GetResponse(respr).${getResultFieldName(method.returns.result)}, req)\n`;
|
|
397
398
|
}
|
|
398
|
-
else if (method.returns.result.kind ===
|
|
399
|
+
else if (method.returns.result.kind === "binaryResult") {
|
|
399
400
|
content += `${indent.get()}resp, err := server.NewResponse(respContent, req, &server.ResponseOptions{\n`;
|
|
400
401
|
indent.push();
|
|
401
402
|
content += `${indent.get()}Body: server.GetResponse(respr).${getResultFieldName(method.returns.result)},\n`;
|
|
402
403
|
content += `${indent.get()}ContentType: req.Header.Get("Content-Type"),\n`;
|
|
403
404
|
content += `${indent.pop().get()}})\n`;
|
|
404
405
|
}
|
|
405
|
-
else if (method.returns.result.kind ===
|
|
406
|
-
if (method.returns.result.monomorphicType.kind ===
|
|
406
|
+
else if (method.returns.result.kind === "monomorphicResult") {
|
|
407
|
+
if (method.returns.result.monomorphicType.kind === "encodedBytes") {
|
|
407
408
|
const encoding = method.returns.result.monomorphicType.encoding;
|
|
408
409
|
content += `${indent.get()}resp, err := server.MarshalResponseAsByteArray(respContent, server.GetResponse(respr).${getResultFieldName(method.returns.result)}, runtime.Base64${encoding}Format, req)\n`;
|
|
409
410
|
}
|
|
410
|
-
else if (method.returns.result.monomorphicType.kind ===
|
|
411
|
-
imports.add(
|
|
412
|
-
imports.add(
|
|
411
|
+
else if (method.returns.result.monomorphicType.kind === "rawJSON") {
|
|
412
|
+
imports.add("bytes");
|
|
413
|
+
imports.add("io");
|
|
413
414
|
content += `${indent.get()}resp, err := server.NewResponse(respContent, req, &server.ResponseOptions{\n`;
|
|
414
415
|
indent.push();
|
|
415
416
|
content += `${indent.get()}Body: io.NopCloser(bytes.NewReader(server.GetResponse(respr).RawJSON)),\n`;
|
|
416
417
|
content += `${indent.get()}ContentType: "application/json",\n`;
|
|
417
418
|
content += `${indent.pop().get()}})\n`;
|
|
418
419
|
}
|
|
419
|
-
else if (method.returns.result.format ===
|
|
420
|
+
else if (method.returns.result.format === "Text") {
|
|
420
421
|
let contentToMarshal;
|
|
421
422
|
const respField = getResultFieldName(method.returns.result);
|
|
422
423
|
const getResponseField = `server.GetResponse(respr).${respField}`;
|
|
423
424
|
switch (method.returns.result.monomorphicType.kind) {
|
|
424
|
-
case
|
|
425
|
-
imports.add(
|
|
425
|
+
case "scalar": {
|
|
426
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
426
427
|
// create a local var that will hold the string-formatted scalar
|
|
427
428
|
contentToMarshal = `formatted${respField}`;
|
|
428
429
|
content += `${indent.get()}var ${contentToMarshal} *string\n`;
|
|
@@ -435,28 +436,30 @@ function generateServerTransportMethods(pkg, serverTransport, finalMethods, impo
|
|
|
435
436
|
})}\n`;
|
|
436
437
|
break;
|
|
437
438
|
}
|
|
438
|
-
case
|
|
439
|
+
case "string":
|
|
439
440
|
contentToMarshal = getResponseField;
|
|
440
441
|
break;
|
|
441
442
|
default:
|
|
442
|
-
throw new CodegenError(
|
|
443
|
+
throw new CodegenError("UnsupportedTsp", `unsupported text return kind ${method.returns.result.monomorphicType.kind} for method ${method.receiver.type.name}.${method.name}`);
|
|
443
444
|
}
|
|
444
445
|
content += `${indent.get()}resp, err := server.MarshalResponseAsText(respContent, ${contentToMarshal}, req)\n`;
|
|
445
446
|
}
|
|
446
447
|
else {
|
|
447
448
|
let respField = `.${getResultFieldName(method.returns.result)}`;
|
|
448
|
-
if (method.returns.result.format ===
|
|
449
|
-
|
|
449
|
+
if (method.returns.result.format === "XML" &&
|
|
450
|
+
method.returns.result.monomorphicType.kind === "slice") {
|
|
451
|
+
respField = "";
|
|
450
452
|
}
|
|
451
453
|
let responseField = `server.GetResponse(respr)${respField}`;
|
|
452
|
-
if (method.returns.result.monomorphicType.kind ===
|
|
453
|
-
imports.add(
|
|
454
|
+
if (method.returns.result.monomorphicType.kind === "time") {
|
|
455
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
454
456
|
responseField = `(*datetime.${method.returns.result.monomorphicType.format})(${responseField})`;
|
|
455
457
|
}
|
|
456
458
|
content += `${indent.get()}resp, err := server.MarshalResponseAs${method.returns.result.format}(respContent, ${responseField}, req)\n`;
|
|
457
459
|
}
|
|
458
460
|
}
|
|
459
|
-
else if (method.returns.result.kind ===
|
|
461
|
+
else if (method.returns.result.kind === "modelResult" ||
|
|
462
|
+
method.returns.result.kind === "polymorphicResult") {
|
|
460
463
|
const respField = `.${getResultFieldName(method.returns.result)}`;
|
|
461
464
|
const responseField = `server.GetResponse(respr)${respField}`;
|
|
462
465
|
content += `${indent.get()}resp, err := server.MarshalResponseAs${method.returns.result.format}(respContent, ${responseField}, req)\n`;
|
|
@@ -466,7 +469,7 @@ function generateServerTransportMethods(pkg, serverTransport, finalMethods, impo
|
|
|
466
469
|
content += `${indent.pop().get()}}\n`;
|
|
467
470
|
// propagate any header response values into the *http.Response
|
|
468
471
|
for (const header of method.returns.headers) {
|
|
469
|
-
if (header.kind ===
|
|
472
|
+
if (header.kind === "headerMapResponse") {
|
|
470
473
|
content += `${indent.get()}for k, v := range server.GetResponse(respr).${header.fieldName} {\n`;
|
|
471
474
|
content += `${indent.push().get()}if v != nil {\n`;
|
|
472
475
|
content += `${indent.push().get()}resp.Header.Set("${header.headerName}"+k, *v)\n`;
|
|
@@ -475,20 +478,20 @@ function generateServerTransportMethods(pkg, serverTransport, finalMethods, impo
|
|
|
475
478
|
}
|
|
476
479
|
else {
|
|
477
480
|
content += `${indent.get()}if val := server.GetResponse(respr).${header.fieldName}; val != nil {\n`;
|
|
478
|
-
content += `${indent.push().get()}resp.Header.Set("${header.headerName}", ${helpers.formatValue(
|
|
481
|
+
content += `${indent.push().get()}resp.Header.Set("${header.headerName}", ${helpers.formatValue("val", header.type, imports, true)})\n`;
|
|
479
482
|
content += `${indent.pop().get()}}\n`;
|
|
480
483
|
}
|
|
481
484
|
}
|
|
482
485
|
content += `${indent.get()}return resp, nil\n`;
|
|
483
486
|
break;
|
|
484
487
|
}
|
|
485
|
-
case
|
|
488
|
+
case "pageableMethod":
|
|
486
489
|
content += dispatchForPagerBody(pkg, receiverName, method, imports, indent);
|
|
487
490
|
break;
|
|
488
491
|
default:
|
|
489
492
|
method;
|
|
490
493
|
}
|
|
491
|
-
content +=
|
|
494
|
+
content += "}\n\n";
|
|
492
495
|
}
|
|
493
496
|
return content;
|
|
494
497
|
}
|
|
@@ -506,9 +509,9 @@ function generateServerTransportMethods(pkg, serverTransport, finalMethods, impo
|
|
|
506
509
|
function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
507
510
|
const methodParamGroups = helpers.getMethodParamGroups(method);
|
|
508
511
|
const numPathParams = methodParamGroups.pathParams.filter((each) => !go.isLiteralParameter(each.style)).length;
|
|
509
|
-
let content =
|
|
512
|
+
let content = "";
|
|
510
513
|
if (numPathParams > 0) {
|
|
511
|
-
imports.add(
|
|
514
|
+
imports.add("regexp");
|
|
512
515
|
content += `${indent.get()}const regexStr = \`${createPathParamsRegex(method, methodParamGroups.pathParams)}\`\n`;
|
|
513
516
|
content += `${indent.get()}regex := regexp.MustCompile(regexStr)\n`;
|
|
514
517
|
content += `${indent.get()}matches := regex.FindStringSubmatch(req.URL.EscapedPath())\n`;
|
|
@@ -518,7 +521,7 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
518
521
|
content += `${indent.push().get()}return nil, fmt.Errorf("failed to parse path %s", req.URL.Path)\n${indent.pop().get()}}\n`;
|
|
519
522
|
}
|
|
520
523
|
const allQueryParams = methodParamGroups.encodedQueryParams.concat(methodParamGroups.unencodedQueryParams);
|
|
521
|
-
if (allQueryParams.find((each) => each.location ===
|
|
524
|
+
if (allQueryParams.find((each) => each.location === "method" && !go.isLiteralParameter(each.style))) {
|
|
522
525
|
content += `${indent.get()}qp := req.URL.Query()\n`;
|
|
523
526
|
}
|
|
524
527
|
// note that these are mutually exclusive
|
|
@@ -528,32 +531,32 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
528
531
|
const partialBodyParams = methodParamGroups.partialBodyParams;
|
|
529
532
|
if (bodyParam) {
|
|
530
533
|
switch (bodyParam.bodyFormat) {
|
|
531
|
-
case
|
|
532
|
-
case
|
|
534
|
+
case "JSON":
|
|
535
|
+
case "XML":
|
|
533
536
|
if (bodyParam && !go.isLiteralParameter(bodyParam.style)) {
|
|
534
|
-
imports.add(
|
|
537
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/fake", "azfake");
|
|
535
538
|
switch (bodyParam.type.kind) {
|
|
536
|
-
case
|
|
539
|
+
case "encodedBytes":
|
|
537
540
|
content += `${indent.get()}body, err := server.UnmarshalRequestAsByteArray(req, runtime.Base64${bodyParam.type.encoding}Format)\n`;
|
|
538
541
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
539
542
|
break;
|
|
540
|
-
case
|
|
543
|
+
case "interface":
|
|
541
544
|
requiredHelpers.readRequestBody = true;
|
|
542
545
|
content += `${indent.get()}raw, err := readRequestBody(req)\n`;
|
|
543
546
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
544
547
|
content += `${indent.get()}body, err := unmarshal${bodyParam.type.name}(raw)\n`;
|
|
545
548
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
546
549
|
break;
|
|
547
|
-
case
|
|
548
|
-
imports.add(
|
|
550
|
+
case "rawJSON":
|
|
551
|
+
imports.add("io");
|
|
549
552
|
content += `${indent.get()}body, err := io.ReadAll(req.Body)\n`;
|
|
550
553
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
551
554
|
content += `${indent.get()}req.Body.Close()\n`;
|
|
552
555
|
break;
|
|
553
556
|
default: {
|
|
554
557
|
let bodyTypeName = go.getTypeDeclaration(bodyParam.type, pkg);
|
|
555
|
-
if (bodyParam.type.kind ===
|
|
556
|
-
imports.add(
|
|
558
|
+
if (bodyParam.type.kind === "time") {
|
|
559
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
557
560
|
bodyTypeName = `datetime.${bodyParam.type.format}`;
|
|
558
561
|
}
|
|
559
562
|
content += `${indent.get()}body, err := server.UnmarshalRequestAs${bodyParam.bodyFormat}[${bodyTypeName}](req)\n`;
|
|
@@ -562,9 +565,9 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
562
565
|
}
|
|
563
566
|
}
|
|
564
567
|
break;
|
|
565
|
-
case
|
|
568
|
+
case "Text":
|
|
566
569
|
if (bodyParam && !go.isLiteralParameter(bodyParam.style)) {
|
|
567
|
-
imports.add(
|
|
570
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/fake", "azfake");
|
|
568
571
|
content += `${indent.get()}body, err := server.UnmarshalRequestAsText(req)\n`;
|
|
569
572
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
570
573
|
}
|
|
@@ -573,9 +576,9 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
573
576
|
// nothing to do for binary media type
|
|
574
577
|
}
|
|
575
578
|
else if (multipartBodyParams.length > 0) {
|
|
576
|
-
imports.add(
|
|
577
|
-
imports.add(
|
|
578
|
-
imports.add(
|
|
579
|
+
imports.add("io");
|
|
580
|
+
imports.add("mime");
|
|
581
|
+
imports.add("mime/multipart");
|
|
579
582
|
content += `${indent.get()}_, params, err := mime.ParseMediaType(req.Header.Get("Content-Type"))\n`;
|
|
580
583
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
581
584
|
content += `${indent.get()}reader := multipart.NewReader(req.Body, params["boundary"])\n`;
|
|
@@ -594,39 +597,39 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
594
597
|
// i.e. the result from the parsing doesn't require further conversion (e.g. casting)
|
|
595
598
|
// otherwise the parsed value is in a local var named parsed.
|
|
596
599
|
const parsePrimitiveType = function (typeName, boolTarget) {
|
|
597
|
-
let parseErr =
|
|
600
|
+
let parseErr = "parseErr";
|
|
598
601
|
const parseResults = `parsed, ${parseErr}`;
|
|
599
|
-
let parsingCode
|
|
600
|
-
imports.add(
|
|
602
|
+
let parsingCode;
|
|
603
|
+
imports.add("strconv");
|
|
601
604
|
switch (typeName) {
|
|
602
|
-
case
|
|
605
|
+
case "bool":
|
|
603
606
|
if (boolTarget) {
|
|
604
607
|
// we reuse the err var declared earlier when calling reader.NextPart()
|
|
605
608
|
parsingCode = `${indent.get()}${boolTarget}, err = strconv.ParseBool(string(content))\n`;
|
|
606
|
-
parseErr =
|
|
609
|
+
parseErr = "err";
|
|
607
610
|
}
|
|
608
611
|
else {
|
|
609
612
|
parsingCode = `${indent.get()}${parseResults} := strconv.ParseBool(string(content))\n`;
|
|
610
613
|
}
|
|
611
614
|
break;
|
|
612
|
-
case
|
|
613
|
-
case
|
|
615
|
+
case "float32":
|
|
616
|
+
case "float64":
|
|
614
617
|
parsingCode = `${indent.get()}${parseResults} := strconv.ParseFloat(string(content), ${helpers.getBitSizeForNumber(typeName)})\n`;
|
|
615
618
|
break;
|
|
616
|
-
case
|
|
617
|
-
case
|
|
618
|
-
case
|
|
619
|
-
case
|
|
619
|
+
case "int8":
|
|
620
|
+
case "int16":
|
|
621
|
+
case "int32":
|
|
622
|
+
case "int64":
|
|
620
623
|
parsingCode = `${indent.get()}${parseResults} := strconv.ParseInt(string(content), 10, ${helpers.getBitSizeForNumber(typeName)})\n`;
|
|
621
624
|
break;
|
|
622
625
|
default:
|
|
623
|
-
throw new CodegenError(
|
|
626
|
+
throw new CodegenError("InternalError", `unhandled multipart parameter primitive type ${typeName}`);
|
|
624
627
|
}
|
|
625
628
|
parsingCode += `${indent.get()}if ${parseErr} != nil {\n${indent.push().get()}return nil, ${parseErr}\n${indent.pop().get()}}\n`;
|
|
626
629
|
return parsingCode;
|
|
627
630
|
};
|
|
628
631
|
const isModelType = function (type) {
|
|
629
|
-
return type.kind ===
|
|
632
|
+
return type.kind === "model" || type.kind === "polymorphicModel";
|
|
630
633
|
};
|
|
631
634
|
const emitCase = function (caseValue, paramVar, type, destIsByValue) {
|
|
632
635
|
let caseContent = `${indent.get()}case "${caseValue}":\n`;
|
|
@@ -635,61 +638,61 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
635
638
|
caseContent += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
636
639
|
let assignedValue;
|
|
637
640
|
if (isModelType(helpers.recursiveUnwrapMapSlice(type))) {
|
|
638
|
-
imports.add(
|
|
641
|
+
imports.add("encoding/json");
|
|
639
642
|
caseContent += `${indent.get()}if err = json.Unmarshal(content, &${paramVar}); err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
640
643
|
}
|
|
641
|
-
else if (type.kind ===
|
|
642
|
-
imports.add(
|
|
643
|
-
imports.add(
|
|
644
|
-
assignedValue =
|
|
644
|
+
else if (type.kind === "readSeekCloser") {
|
|
645
|
+
imports.add("bytes");
|
|
646
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming");
|
|
647
|
+
assignedValue = "streaming.NopCloser(bytes.NewReader(content))";
|
|
645
648
|
}
|
|
646
|
-
else if (type.kind ===
|
|
649
|
+
else if (type.kind === "constant") {
|
|
647
650
|
let from;
|
|
648
651
|
switch (type.type) {
|
|
649
|
-
case
|
|
650
|
-
case
|
|
651
|
-
case
|
|
652
|
-
case
|
|
653
|
-
case
|
|
652
|
+
case "bool":
|
|
653
|
+
case "float32":
|
|
654
|
+
case "float64":
|
|
655
|
+
case "int32":
|
|
656
|
+
case "int64":
|
|
654
657
|
caseContent += parsePrimitiveType(type.type);
|
|
655
|
-
from =
|
|
658
|
+
from = "parsed";
|
|
656
659
|
break;
|
|
657
|
-
case
|
|
658
|
-
from =
|
|
660
|
+
case "string":
|
|
661
|
+
from = "content";
|
|
659
662
|
break;
|
|
660
663
|
}
|
|
661
664
|
assignedValue = `${go.getTypeDeclaration(type, pkg)}(${from})`;
|
|
662
665
|
}
|
|
663
|
-
else if (type.kind ===
|
|
666
|
+
else if (type.kind === "scalar") {
|
|
664
667
|
switch (type.type) {
|
|
665
|
-
case
|
|
666
|
-
imports.add(
|
|
668
|
+
case "bool":
|
|
669
|
+
imports.add("strconv");
|
|
667
670
|
// ParseBool happens in place, so no need to set assignedValue
|
|
668
671
|
caseContent += parsePrimitiveType(type.type, paramVar);
|
|
669
672
|
break;
|
|
670
|
-
case
|
|
671
|
-
case
|
|
672
|
-
case
|
|
673
|
-
case
|
|
674
|
-
case
|
|
675
|
-
case
|
|
673
|
+
case "float32":
|
|
674
|
+
case "float64":
|
|
675
|
+
case "int8":
|
|
676
|
+
case "int16":
|
|
677
|
+
case "int32":
|
|
678
|
+
case "int64":
|
|
676
679
|
caseContent += parsePrimitiveType(type.type);
|
|
677
680
|
assignedValue = `${type.type}(parsed)`;
|
|
678
681
|
break;
|
|
679
682
|
default:
|
|
680
|
-
throw new CodegenError(
|
|
683
|
+
throw new CodegenError("InternalError", `unhandled multipart parameter primitive type ${type.type}`);
|
|
681
684
|
}
|
|
682
685
|
}
|
|
683
|
-
else if (type.kind ===
|
|
684
|
-
assignedValue =
|
|
686
|
+
else if (type.kind === "string") {
|
|
687
|
+
assignedValue = "string(content)";
|
|
685
688
|
}
|
|
686
|
-
else if (helpers.recursiveUnwrapMapSlice(type).kind ===
|
|
687
|
-
imports.add(
|
|
688
|
-
imports.add(
|
|
689
|
-
const bodyContent =
|
|
689
|
+
else if (helpers.recursiveUnwrapMapSlice(type).kind === "multipartContent") {
|
|
690
|
+
imports.add("bytes");
|
|
691
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming");
|
|
692
|
+
const bodyContent = "streaming.NopCloser(bytes.NewReader(content))";
|
|
690
693
|
const contentType = 'part.Header.Get("Content-Type")';
|
|
691
|
-
const filename =
|
|
692
|
-
if (type.kind ===
|
|
694
|
+
const filename = "part.FileName()";
|
|
695
|
+
if (type.kind === "slice") {
|
|
693
696
|
caseContent += `${indent.get()}${paramVar} = append(${paramVar}, streaming.MultipartContent{\n`;
|
|
694
697
|
indent.push();
|
|
695
698
|
caseContent += `${indent.get()}Body: ${bodyContent},\n`;
|
|
@@ -703,27 +706,27 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
703
706
|
caseContent += `${indent.get()}${paramVar}.Filename = ${filename}\n`;
|
|
704
707
|
}
|
|
705
708
|
}
|
|
706
|
-
else if (type.kind ===
|
|
707
|
-
if (type.elementType.kind ===
|
|
708
|
-
imports.add(
|
|
709
|
-
imports.add(
|
|
709
|
+
else if (type.kind === "slice") {
|
|
710
|
+
if (type.elementType.kind === "readSeekCloser") {
|
|
711
|
+
imports.add("bytes");
|
|
712
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming");
|
|
710
713
|
assignedValue = `append(${paramVar}, streaming.NopCloser(bytes.NewReader(content)))`;
|
|
711
714
|
}
|
|
712
715
|
else {
|
|
713
|
-
throw new CodegenError(
|
|
716
|
+
throw new CodegenError("InternalError", `unhandled multipart parameter array element kind ${type.elementType.kind}`);
|
|
714
717
|
}
|
|
715
718
|
}
|
|
716
|
-
else if (type.kind ===
|
|
717
|
-
imports.add(
|
|
719
|
+
else if (type.kind === "encodedBytes") {
|
|
720
|
+
imports.add("encoding/base64");
|
|
718
721
|
caseContent += `${indent.get()}${paramVar}, err = base64.${type.encoding}Encoding.DecodeString(string(content))\n`;
|
|
719
722
|
caseContent += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
720
723
|
}
|
|
721
724
|
else {
|
|
722
|
-
throw new CodegenError(
|
|
725
|
+
throw new CodegenError("InternalError", `unhandled multipart parameter kind ${type.kind}`);
|
|
723
726
|
}
|
|
724
727
|
if (assignedValue) {
|
|
725
728
|
if (!destIsByValue) {
|
|
726
|
-
imports.add(
|
|
729
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
727
730
|
assignedValue = `to.Ptr(${assignedValue})`;
|
|
728
731
|
}
|
|
729
732
|
caseContent += `${indent.get()}${paramVar} = ${assignedValue}\n`;
|
|
@@ -759,14 +762,14 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
759
762
|
content += `${indent.get()}case "${param.formDataName}":\n`;
|
|
760
763
|
let assignedValue;
|
|
761
764
|
switch (param.type.kind) {
|
|
762
|
-
case
|
|
765
|
+
case "constant":
|
|
763
766
|
assignedValue = `${go.getTypeDeclaration(param.type, pkg)}(req.FormValue(key))`;
|
|
764
767
|
break;
|
|
765
|
-
case
|
|
766
|
-
assignedValue =
|
|
768
|
+
case "string":
|
|
769
|
+
assignedValue = "req.FormValue(key)";
|
|
767
770
|
break;
|
|
768
771
|
default:
|
|
769
|
-
throw new CodegenError(
|
|
772
|
+
throw new CodegenError("InternalError", `unhandled form parameter kind ${param.type.kind}`);
|
|
770
773
|
}
|
|
771
774
|
content += `${indent.push().get()}${param.name} = ${assignedValue}\n`;
|
|
772
775
|
indent.pop();
|
|
@@ -792,7 +795,7 @@ function dispatchForOperationBody(pkg, receiverName, method, imports, indent) {
|
|
|
792
795
|
result.params.set(partialBodyParam.name, `${helpers.star(partialBodyParam.byValue)}body.${naming.capitalize(partialBodyParam.name)}`);
|
|
793
796
|
}
|
|
794
797
|
const apiCall = `:= ${receiverName}.srv.${fixUpMethodName(method)}(${populateApiParams(pkg, method, result.params, imports)})`;
|
|
795
|
-
if (method.kind ===
|
|
798
|
+
if (method.kind === "pageableMethod") {
|
|
796
799
|
content += `resp ${apiCall}\n`;
|
|
797
800
|
return content;
|
|
798
801
|
}
|
|
@@ -805,10 +808,10 @@ function getMethodStatusCodes(method) {
|
|
|
805
808
|
// NOTE: don't modify the original array!
|
|
806
809
|
const statusCodes = Array.from(method.httpStatusCodes);
|
|
807
810
|
switch (method.kind) {
|
|
808
|
-
case
|
|
809
|
-
case
|
|
811
|
+
case "lroMethod":
|
|
812
|
+
case "lroPageableMethod":
|
|
810
813
|
if (!statusCodes.includes(200)) {
|
|
811
|
-
// pollers always include 200 as an
|
|
814
|
+
// pollers always include 200 as an acceptable status code so we emulate that here
|
|
812
815
|
statusCodes.unshift(200);
|
|
813
816
|
}
|
|
814
817
|
if (!method.returns.result && !statusCodes.includes(204)) {
|
|
@@ -876,8 +879,8 @@ function dispatchForPagerBody(pkg, receiverName, method, imports, indent) {
|
|
|
876
879
|
indent.push();
|
|
877
880
|
content += `${indent.get()}${localVarName} = &resp\n`;
|
|
878
881
|
content += `${indent.get()}${operationStateMachine}.add(req, ${localVarName})\n`;
|
|
879
|
-
if (method.strategy?.kind ===
|
|
880
|
-
imports.add(
|
|
882
|
+
if (method.strategy?.kind === "nextLink") {
|
|
883
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
881
884
|
content += `${indent.get()}server.PagerResponderInjectNextLinks(${localVarName}, req, func(page *${go.getTypeDeclaration(method.returns, pkg)}, createLink func() string) {\n`;
|
|
882
885
|
content += `${indent.push().get()}page.${helpers.buildNextLinkPath(method.strategy)} = to.Ptr(createLink())\n`;
|
|
883
886
|
content += `${indent.pop().get()}})\n`;
|
|
@@ -902,7 +905,7 @@ function dispatchForPagerBody(pkg, receiverName, method, imports, indent) {
|
|
|
902
905
|
}
|
|
903
906
|
function sanitizeRegexpCaptureGroupName(name) {
|
|
904
907
|
// dash '-' characters are not allowed so replace them with '_'
|
|
905
|
-
return name.replace(
|
|
908
|
+
return name.replace("-", "_");
|
|
906
909
|
}
|
|
907
910
|
function createPathParamsRegex(method, pathParams) {
|
|
908
911
|
// "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{parentResourcePath}/{resourceType}/{resourceName}"
|
|
@@ -912,12 +915,12 @@ function createPathParamsRegex(method, pathParams) {
|
|
|
912
915
|
// escape any characters in the path that could be interpreted as regex tokens
|
|
913
916
|
// per RFC3986, these are the pchars that also double as regex tokens
|
|
914
917
|
// . $ * + ()
|
|
915
|
-
urlPath = urlPath.replace(/([.$*+()])/g,
|
|
918
|
+
urlPath = urlPath.replace(/([.$*+()])/g, "\\$1");
|
|
916
919
|
for (const param of pathParams) {
|
|
917
920
|
const toReplace = `{${param.pathSegment}}`;
|
|
918
921
|
let replaceWith = `(?P<${sanitizeRegexpCaptureGroupName(param.pathSegment)}>[!#&$-;=?-\\[\\]_a-zA-Z0-9~%@]+)`;
|
|
919
|
-
if (param.style ===
|
|
920
|
-
replaceWith +=
|
|
922
|
+
if (param.style === "optional" || param.style === "flag") {
|
|
923
|
+
replaceWith += "?";
|
|
921
924
|
}
|
|
922
925
|
urlPath = urlPath.replace(toReplace, replaceWith);
|
|
923
926
|
}
|
|
@@ -933,7 +936,7 @@ function createPathParamsRegex(method, pathParams) {
|
|
|
933
936
|
* @returns the parsing code and the params that contain the parsed values
|
|
934
937
|
*/
|
|
935
938
|
function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
936
|
-
let content =
|
|
939
|
+
let content = "";
|
|
937
940
|
const paramValues = new Map();
|
|
938
941
|
const createLocalVariableName = function (param, suffix) {
|
|
939
942
|
const paramName = `${naming.uncapitalize(param.name)}${suffix}`;
|
|
@@ -941,16 +944,16 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
941
944
|
return paramName;
|
|
942
945
|
};
|
|
943
946
|
const emitNumericConversion = function (src, type) {
|
|
944
|
-
imports.add(
|
|
945
|
-
let precision =
|
|
946
|
-
if (type ===
|
|
947
|
-
precision =
|
|
947
|
+
imports.add("strconv");
|
|
948
|
+
let precision = "32";
|
|
949
|
+
if (type === "float64" || type === "int64") {
|
|
950
|
+
precision = "64";
|
|
948
951
|
}
|
|
949
|
-
let parseType =
|
|
950
|
-
let base =
|
|
951
|
-
if (type ===
|
|
952
|
-
parseType =
|
|
953
|
-
base =
|
|
952
|
+
let parseType = "Int";
|
|
953
|
+
let base = "10, ";
|
|
954
|
+
if (type === "float32" || type === "float64") {
|
|
955
|
+
parseType = "Float";
|
|
956
|
+
base = "";
|
|
954
957
|
}
|
|
955
958
|
return `strconv.Parse${parseType}(${src}, ${base}${precision})`;
|
|
956
959
|
};
|
|
@@ -958,11 +961,11 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
958
961
|
// we track the params separately as it might be a subset of ParameterGroup.params
|
|
959
962
|
const paramGroups = new Map();
|
|
960
963
|
for (const param of consolidateHostParams(method.parameters)) {
|
|
961
|
-
if (param.location ===
|
|
964
|
+
if (param.location === "client" || go.isLiteralParameter(param.style)) {
|
|
962
965
|
// client params and parameter literals aren't passed to APIs
|
|
963
966
|
continue;
|
|
964
967
|
}
|
|
965
|
-
if (param.kind ===
|
|
968
|
+
if (param.kind === "resumeTokenParam") {
|
|
966
969
|
// skip the ResumeToken param as we don't send that back to the caller
|
|
967
970
|
continue;
|
|
968
971
|
}
|
|
@@ -977,11 +980,11 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
977
980
|
params.push(param);
|
|
978
981
|
}
|
|
979
982
|
switch (param.kind) {
|
|
980
|
-
case
|
|
981
|
-
case
|
|
982
|
-
case
|
|
983
|
-
case
|
|
984
|
-
case
|
|
983
|
+
case "bodyParam":
|
|
984
|
+
case "formBodyCollectionParam":
|
|
985
|
+
case "formBodyScalarParam":
|
|
986
|
+
case "multipartFormBodyParam":
|
|
987
|
+
case "partialBodyParam":
|
|
985
988
|
// body params will be unmarshalled, no need for parsing.
|
|
986
989
|
continue;
|
|
987
990
|
}
|
|
@@ -993,23 +996,27 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
993
996
|
let paramValue = getRawParamValue(param);
|
|
994
997
|
// path params are escaped, so we need to unescape them first.
|
|
995
998
|
if (go.isPathParameter(param)) {
|
|
996
|
-
imports.add(
|
|
997
|
-
let paramVar = createLocalVariableName(param,
|
|
998
|
-
if (go.isRequiredParameter(param.style) &&
|
|
999
|
+
imports.add("net/url");
|
|
1000
|
+
let paramVar = createLocalVariableName(param, "Unescaped");
|
|
1001
|
+
if (go.isRequiredParameter(param.style) &&
|
|
1002
|
+
param.type.kind === "constant" &&
|
|
1003
|
+
param.type.type === "string") {
|
|
999
1004
|
// for string-based enums, we perform the conversion as part of unescaping
|
|
1000
1005
|
requiredHelpers.parseWithCast = true;
|
|
1001
|
-
paramVar = createLocalVariableName(param,
|
|
1006
|
+
paramVar = createLocalVariableName(param, "Param");
|
|
1002
1007
|
content += `${indent.get()}${paramVar}, err := parseWithCast(${paramValue}, func (v string) (${go.getTypeDeclaration(param.type, pkg)}, error) {\n`;
|
|
1003
1008
|
content += `${indent.push().get()}p, unescapeErr := url.PathUnescape(v)\n`;
|
|
1004
1009
|
content += `${indent.get()}if unescapeErr != nil {\n${indent.push().get()}return "", unescapeErr\n${indent.pop().get()}}\n`;
|
|
1005
1010
|
content += `${indent.get()}return ${go.getTypeDeclaration(param.type, pkg)}(p), nil\n${indent.pop().get()}})\n`;
|
|
1006
1011
|
}
|
|
1007
1012
|
else {
|
|
1008
|
-
if (go.isRequiredParameter(param.style) &&
|
|
1013
|
+
if (go.isRequiredParameter(param.style) &&
|
|
1014
|
+
(param.type.kind === "string" ||
|
|
1015
|
+
(param.type.kind === "slice" && param.type.elementType.kind === "string"))) {
|
|
1009
1016
|
// by convention, if the value is in its "final form" (i.e. no parsing required)
|
|
1010
1017
|
// then its var is to have the "Param" suffix. the only case is string, everything
|
|
1011
1018
|
// else requires some amount of parsing/conversion.
|
|
1012
|
-
paramVar = createLocalVariableName(param,
|
|
1019
|
+
paramVar = createLocalVariableName(param, "Param");
|
|
1013
1020
|
}
|
|
1014
1021
|
content += `${indent.get()}${paramVar}, err := url.PathUnescape(${paramValue})\n`;
|
|
1015
1022
|
}
|
|
@@ -1017,30 +1024,32 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1017
1024
|
paramValue = paramVar;
|
|
1018
1025
|
}
|
|
1019
1026
|
// parse params as required
|
|
1020
|
-
if (param.kind ===
|
|
1027
|
+
if (param.kind === "headerCollectionParam" ||
|
|
1028
|
+
param.kind === "pathCollectionParam" ||
|
|
1029
|
+
param.kind === "queryCollectionParam") {
|
|
1021
1030
|
// any element type other than string will require some form of conversion/parsing
|
|
1022
|
-
if (param.type.elementType.kind !==
|
|
1023
|
-
if (param.collectionFormat !==
|
|
1031
|
+
if (param.type.elementType.kind !== "string") {
|
|
1032
|
+
if (param.collectionFormat !== "multi") {
|
|
1024
1033
|
requiredHelpers.splitHelper = true;
|
|
1025
|
-
const elementsParam = createLocalVariableName(param,
|
|
1034
|
+
const elementsParam = createLocalVariableName(param, "Elements");
|
|
1026
1035
|
content += `${indent.get()}${elementsParam} := splitHelper(${paramValue}, "${helpers.getDelimiterForCollectionFormat(param.collectionFormat)}")\n`;
|
|
1027
1036
|
paramValue = elementsParam;
|
|
1028
1037
|
}
|
|
1029
|
-
const paramVar = createLocalVariableName(param,
|
|
1038
|
+
const paramVar = createLocalVariableName(param, "Param");
|
|
1030
1039
|
let elementFormat;
|
|
1031
1040
|
switch (param.type.elementType.kind) {
|
|
1032
|
-
case
|
|
1033
|
-
case
|
|
1041
|
+
case "constant":
|
|
1042
|
+
case "scalar":
|
|
1034
1043
|
elementFormat = param.type.elementType.type;
|
|
1035
1044
|
break;
|
|
1036
|
-
case
|
|
1045
|
+
case "encodedBytes":
|
|
1037
1046
|
elementFormat = param.type.elementType.encoding;
|
|
1038
1047
|
break;
|
|
1039
|
-
case
|
|
1048
|
+
case "time":
|
|
1040
1049
|
elementFormat = param.type.elementType.format;
|
|
1041
1050
|
break;
|
|
1042
1051
|
default:
|
|
1043
|
-
throw new CodegenError(
|
|
1052
|
+
throw new CodegenError("InternalError", `unhandled element kind ${param.type.elementType.kind}`);
|
|
1044
1053
|
}
|
|
1045
1054
|
const toType = go.getTypeDeclaration(param.type.elementType, pkg);
|
|
1046
1055
|
content += `${indent.get()}${paramVar} := make([]${toType}, len(${paramValue}))\n`;
|
|
@@ -1048,76 +1057,82 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1048
1057
|
indent.push();
|
|
1049
1058
|
let fromVar;
|
|
1050
1059
|
// TODO: consolidate with non-collection parsing code
|
|
1051
|
-
if (elementFormat ===
|
|
1052
|
-
imports.add(
|
|
1053
|
-
fromVar =
|
|
1060
|
+
if (elementFormat === "bool") {
|
|
1061
|
+
imports.add("strconv");
|
|
1062
|
+
fromVar = "parsedBool";
|
|
1054
1063
|
content += `${indent.get()}${fromVar}, parseErr := strconv.ParseBool(${paramValue}[i])\n`;
|
|
1055
1064
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return nil, parseErr\n${indent.pop().get()}}\n`;
|
|
1056
1065
|
}
|
|
1057
|
-
else if (elementFormat ===
|
|
1066
|
+
else if (elementFormat === "float32" ||
|
|
1067
|
+
elementFormat === "float64" ||
|
|
1068
|
+
elementFormat === "int32" ||
|
|
1069
|
+
elementFormat === "int64") {
|
|
1058
1070
|
fromVar = `parsed${naming.capitalize(elementFormat)}`;
|
|
1059
1071
|
content += `${indent.get()}${fromVar}, parseErr := ${emitNumericConversion(`${paramValue}[i]`, elementFormat)}\n`;
|
|
1060
1072
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return nil, parseErr\n${indent.pop().get()}}\n`;
|
|
1061
1073
|
}
|
|
1062
|
-
else if (elementFormat ===
|
|
1074
|
+
else if (elementFormat === "string") {
|
|
1063
1075
|
// we're casting an enum string value to its const type
|
|
1064
1076
|
// TODO: what about enums that aren't strings?
|
|
1065
1077
|
fromVar = `${paramValue}[i]`;
|
|
1066
1078
|
}
|
|
1067
|
-
else if (elementFormat ===
|
|
1068
|
-
imports.add(
|
|
1079
|
+
else if (elementFormat === "Std" || elementFormat === "URL") {
|
|
1080
|
+
imports.add("encoding/base64");
|
|
1069
1081
|
fromVar = `parsed${naming.capitalize(elementFormat)}`;
|
|
1070
1082
|
content += `${indent.get()}${fromVar}, parseErr := base64.${elementFormat}Encoding.DecodeString(${paramValue}[i])\n`;
|
|
1071
1083
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return nil, parseErr\n${indent.pop().get()}}\n`;
|
|
1072
1084
|
}
|
|
1073
|
-
else if (elementFormat ===
|
|
1074
|
-
|
|
1085
|
+
else if (elementFormat === "RFC1123" ||
|
|
1086
|
+
elementFormat === "RFC3339" ||
|
|
1087
|
+
elementFormat === "RFC7231" ||
|
|
1088
|
+
elementFormat === "Unix") {
|
|
1089
|
+
imports.add("time");
|
|
1075
1090
|
fromVar = `parsed${naming.capitalize(elementFormat)}`;
|
|
1076
|
-
if (elementFormat ===
|
|
1077
|
-
imports.add(
|
|
1091
|
+
if (elementFormat === "Unix") {
|
|
1092
|
+
imports.add("strconv");
|
|
1078
1093
|
content += `${indent.get()}p, parseErr := strconv.ParseInt(${paramValue}[i], 10, 64)\n`;
|
|
1079
1094
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return nil, parseErr\n${indent.pop().get()}}\n`;
|
|
1080
1095
|
content += `${indent.get()}${fromVar} := time.Unix(p, 0).UTC()\n`;
|
|
1081
1096
|
}
|
|
1082
1097
|
else {
|
|
1083
|
-
let format =
|
|
1084
|
-
if (elementFormat ===
|
|
1085
|
-
format =
|
|
1098
|
+
let format = "time.RFC3339Nano";
|
|
1099
|
+
if (elementFormat === "RFC1123" || elementFormat === "RFC7231") {
|
|
1100
|
+
format = "time.RFC1123";
|
|
1086
1101
|
}
|
|
1087
1102
|
content += `${indent.get()}${fromVar}, parseErr := time.Parse(${format}, ${paramValue}[i])\n`;
|
|
1088
1103
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return nil, parseErr\n${indent.pop().get()}}\n`;
|
|
1089
1104
|
}
|
|
1090
1105
|
}
|
|
1091
1106
|
else {
|
|
1092
|
-
throw new CodegenError(
|
|
1107
|
+
throw new CodegenError("InternalError", `unhandled element format ${elementFormat}`);
|
|
1093
1108
|
}
|
|
1094
1109
|
// TODO: remove cast in some cases
|
|
1095
1110
|
content += `${indent.get()}${paramVar}[i] = ${toType}(${fromVar})\n${indent.pop().get()}}\n`;
|
|
1096
1111
|
}
|
|
1097
|
-
else if (!go.isRequiredParameter(param.style) && param.collectionFormat !==
|
|
1112
|
+
else if (!go.isRequiredParameter(param.style) && param.collectionFormat !== "multi") {
|
|
1098
1113
|
// for slices of strings that are required, the call to splitHelper(...) is inlined into
|
|
1099
1114
|
// the invocation of the fake e.g. srv.FakeFunc(splitHelper...). but if it's optional, we
|
|
1100
1115
|
// need to create a local first which will later be copied into the optional param group.
|
|
1101
1116
|
requiredHelpers.splitHelper = true;
|
|
1102
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1117
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")} := splitHelper(${paramValue}, "${helpers.getDelimiterForCollectionFormat(param.collectionFormat)}")\n`;
|
|
1103
1118
|
}
|
|
1104
1119
|
}
|
|
1105
|
-
else if (param.type.kind ===
|
|
1106
|
-
imports.add(
|
|
1120
|
+
else if (param.type.kind === "scalar" && param.type.type === "bool") {
|
|
1121
|
+
imports.add("strconv");
|
|
1107
1122
|
let from = `strconv.ParseBool(${paramValue})`;
|
|
1108
1123
|
if (!go.isRequiredParameter(param.style)) {
|
|
1109
1124
|
requiredHelpers.parseOptional = true;
|
|
1110
1125
|
from = `parseOptional(${paramValue}, strconv.ParseBool)`;
|
|
1111
1126
|
}
|
|
1112
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1127
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${from}\n`;
|
|
1113
1128
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
1114
1129
|
}
|
|
1115
|
-
else if (param.type.kind ===
|
|
1116
|
-
imports.add(
|
|
1117
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1130
|
+
else if (param.type.kind === "encodedBytes") {
|
|
1131
|
+
imports.add("encoding/base64");
|
|
1132
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := base64.${param.type.encoding}Encoding.DecodeString(${paramValue})\n`;
|
|
1118
1133
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
1119
1134
|
}
|
|
1120
|
-
else if (param.type.kind ===
|
|
1135
|
+
else if (param.type.kind === "time") {
|
|
1121
1136
|
const formatMap = {
|
|
1122
1137
|
PlainDate: helpers.plainDateFormat,
|
|
1123
1138
|
PlainTime: helpers.plainTimeFormat,
|
|
@@ -1125,7 +1140,7 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1125
1140
|
RFC3339: helpers.RFC3339Format,
|
|
1126
1141
|
RFC7231: helpers.RFC1123Format,
|
|
1127
1142
|
};
|
|
1128
|
-
imports.add(
|
|
1143
|
+
imports.add("time");
|
|
1129
1144
|
if (param.type.format in formatMap) {
|
|
1130
1145
|
const format = formatMap[param.type.format];
|
|
1131
1146
|
let from = `time.Parse(${format}, ${paramValue})`;
|
|
@@ -1133,56 +1148,62 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1133
1148
|
requiredHelpers.parseOptional = true;
|
|
1134
1149
|
from = `parseOptional(${paramValue}, func(v string) (time.Time, error) { return time.Parse(${format}, v) })`;
|
|
1135
1150
|
}
|
|
1136
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1151
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${from}\n`;
|
|
1137
1152
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
1138
1153
|
}
|
|
1139
1154
|
else {
|
|
1140
|
-
imports.add(
|
|
1155
|
+
imports.add("strconv");
|
|
1141
1156
|
let parser;
|
|
1142
1157
|
if (!go.isRequiredParameter(param.style)) {
|
|
1143
1158
|
requiredHelpers.parseOptional = true;
|
|
1144
|
-
parser =
|
|
1159
|
+
parser = "parseOptional";
|
|
1145
1160
|
}
|
|
1146
1161
|
else {
|
|
1147
1162
|
requiredHelpers.parseWithCast = true;
|
|
1148
|
-
parser =
|
|
1163
|
+
parser = "parseWithCast";
|
|
1149
1164
|
}
|
|
1150
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1165
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${parser}(${paramValue}, func (v string) (time.Time, error) {\n`;
|
|
1151
1166
|
content += `${indent.push().get()}p, parseErr := strconv.ParseInt(v, 10, 64)\n`;
|
|
1152
1167
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return time.Time{}, parseErr\n${indent.pop().get()}}\n`;
|
|
1153
1168
|
content += `${indent.get()}return time.Unix(p, 0).UTC(), nil\n${indent.pop().get()}})\n`;
|
|
1154
1169
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
1155
1170
|
}
|
|
1156
1171
|
}
|
|
1157
|
-
else if (param.type.kind ===
|
|
1172
|
+
else if (param.type.kind === "scalar" &&
|
|
1173
|
+
(param.type.type === "float32" ||
|
|
1174
|
+
param.type.type === "float64" ||
|
|
1175
|
+
param.type.type === "int32" ||
|
|
1176
|
+
param.type.type === "int64")) {
|
|
1158
1177
|
let parser;
|
|
1159
1178
|
if (!go.isRequiredParameter(param.style)) {
|
|
1160
1179
|
requiredHelpers.parseOptional = true;
|
|
1161
|
-
parser =
|
|
1180
|
+
parser = "parseOptional";
|
|
1162
1181
|
}
|
|
1163
1182
|
else {
|
|
1164
1183
|
requiredHelpers.parseWithCast = true;
|
|
1165
|
-
parser =
|
|
1184
|
+
parser = "parseWithCast";
|
|
1166
1185
|
}
|
|
1167
|
-
if (param.type.type ===
|
|
1168
|
-
|
|
1169
|
-
|
|
1186
|
+
if (param.type.type === "float32" ||
|
|
1187
|
+
param.type.type === "int32" ||
|
|
1188
|
+
!go.isRequiredParameter(param.style)) {
|
|
1189
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${parser}(${paramValue}, func(v string) (${param.type.type}, error) {\n`;
|
|
1190
|
+
content += `${indent.push().get()}p, parseErr := ${emitNumericConversion("v", param.type.type)}\n`;
|
|
1170
1191
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return 0, parseErr\n${indent.pop().get()}}\n`;
|
|
1171
|
-
let result =
|
|
1172
|
-
if (param.type.type ===
|
|
1192
|
+
let result = "p";
|
|
1193
|
+
if (param.type.type === "float32" || param.type.type === "int32") {
|
|
1173
1194
|
result = `${param.type.type}(${result})`;
|
|
1174
1195
|
}
|
|
1175
1196
|
content += `${indent.get()}return ${result}, nil\n${indent.pop().get()}})\n`;
|
|
1176
1197
|
}
|
|
1177
1198
|
else {
|
|
1178
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1199
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${emitNumericConversion(paramValue, param.type.type)}\n`;
|
|
1179
1200
|
}
|
|
1180
1201
|
content += `${indent.get()}if err != nil {\n${indent.push().get()}return nil, err\n${indent.pop().get()}}\n`;
|
|
1181
1202
|
}
|
|
1182
|
-
else if (param.kind ===
|
|
1183
|
-
imports.add(
|
|
1184
|
-
imports.add(
|
|
1185
|
-
const localVar = createLocalVariableName(param,
|
|
1203
|
+
else if (param.kind === "headerMapParam") {
|
|
1204
|
+
imports.add("strings");
|
|
1205
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
1206
|
+
const localVar = createLocalVariableName(param, "Param");
|
|
1186
1207
|
content += `${indent.get()}var ${localVar} map[string]*string\n`;
|
|
1187
1208
|
content += `${indent.get()}for hh := range ${paramValue} {\n`;
|
|
1188
1209
|
const headerPrefix = param.headerName;
|
|
@@ -1192,30 +1213,30 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1192
1213
|
content += `${indent.get()}${localVar}[hh[len("${headerPrefix}"):]] = to.Ptr(getHeaderValue(req.Header, hh))\n`;
|
|
1193
1214
|
content += `${indent.pop().get()}}\n${indent.pop().get()}}\n`;
|
|
1194
1215
|
}
|
|
1195
|
-
else if (param.type.kind ===
|
|
1216
|
+
else if (param.type.kind === "constant" && param.type.type !== "string") {
|
|
1196
1217
|
let parseHelper;
|
|
1197
1218
|
if (!go.isRequiredParameter(param.style)) {
|
|
1198
1219
|
requiredHelpers.parseOptional = true;
|
|
1199
|
-
parseHelper =
|
|
1220
|
+
parseHelper = "parseOptional";
|
|
1200
1221
|
}
|
|
1201
1222
|
else {
|
|
1202
1223
|
requiredHelpers.parseWithCast = true;
|
|
1203
|
-
parseHelper =
|
|
1224
|
+
parseHelper = "parseWithCast";
|
|
1204
1225
|
}
|
|
1205
1226
|
let parse;
|
|
1206
1227
|
let zeroValue;
|
|
1207
|
-
if (param.type.type ===
|
|
1208
|
-
imports.add(
|
|
1209
|
-
parse =
|
|
1210
|
-
zeroValue =
|
|
1228
|
+
if (param.type.type === "bool") {
|
|
1229
|
+
imports.add("strconv");
|
|
1230
|
+
parse = "strconv.ParseBool(v)";
|
|
1231
|
+
zeroValue = "false";
|
|
1211
1232
|
}
|
|
1212
1233
|
else {
|
|
1213
1234
|
// emitNumericConversion adds the necessary import of strconv
|
|
1214
|
-
parse = emitNumericConversion(
|
|
1215
|
-
zeroValue =
|
|
1235
|
+
parse = emitNumericConversion("v", param.type.type);
|
|
1236
|
+
zeroValue = "0";
|
|
1216
1237
|
}
|
|
1217
1238
|
const toConstType = go.getTypeDeclaration(param.type, pkg);
|
|
1218
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1239
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")}, err := ${parseHelper}(${paramValue}, func(v string) (${toConstType}, error) {\n`;
|
|
1219
1240
|
content += `${indent.push().get()}p, parseErr := ${parse}\n`;
|
|
1220
1241
|
content += `${indent.get()}if parseErr != nil {\n${indent.push().get()}return ${zeroValue}, parseErr\n${indent.pop().get()}}\n`;
|
|
1221
1242
|
content += `${indent.get()}return ${toConstType}(p), nil\n${indent.pop().get()}})\n`;
|
|
@@ -1224,11 +1245,11 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1224
1245
|
else if (!go.isRequiredParameter(param.style)) {
|
|
1225
1246
|
// we check this last as it's a superset of the previous conditions
|
|
1226
1247
|
requiredHelpers.getOptional = true;
|
|
1227
|
-
if (param.type.kind ===
|
|
1248
|
+
if (param.type.kind === "constant" || param.type.kind === "etag") {
|
|
1228
1249
|
imports.addForType(param.type);
|
|
1229
1250
|
paramValue = `${go.getTypeDeclaration(param.type, pkg)}(${paramValue})`;
|
|
1230
1251
|
}
|
|
1231
|
-
content += `${indent.get()}${createLocalVariableName(param,
|
|
1252
|
+
content += `${indent.get()}${createLocalVariableName(param, "Param")} := getOptional(${paramValue})\n`;
|
|
1232
1253
|
}
|
|
1233
1254
|
}
|
|
1234
1255
|
// create the param groups and populate their values
|
|
@@ -1252,21 +1273,21 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1252
1273
|
if (params) {
|
|
1253
1274
|
for (const param of params) {
|
|
1254
1275
|
// check array before body in case the body is just an array
|
|
1255
|
-
if (param.type.kind ===
|
|
1276
|
+
if (param.type.kind === "slice") {
|
|
1256
1277
|
paramNilCheck.push(`len(${getFinalParamValue(pkg, param, paramValues)}) > 0`);
|
|
1257
1278
|
}
|
|
1258
|
-
else if (param.kind ===
|
|
1259
|
-
if (param.bodyFormat ===
|
|
1260
|
-
imports.add(
|
|
1261
|
-
paramNilCheck.push(
|
|
1279
|
+
else if (param.kind === "bodyParam") {
|
|
1280
|
+
if (param.bodyFormat === "binary") {
|
|
1281
|
+
imports.add("io");
|
|
1282
|
+
paramNilCheck.push("req.Body != nil");
|
|
1262
1283
|
}
|
|
1263
1284
|
else {
|
|
1264
|
-
imports.add(
|
|
1265
|
-
paramNilCheck.push(
|
|
1285
|
+
imports.add("reflect");
|
|
1286
|
+
paramNilCheck.push("!reflect.ValueOf(body).IsZero()");
|
|
1266
1287
|
}
|
|
1267
1288
|
}
|
|
1268
|
-
else if (go.isFormBodyParameter(param) || param.kind ===
|
|
1269
|
-
imports.add(
|
|
1289
|
+
else if (go.isFormBodyParameter(param) || param.kind === "multipartFormBodyParam") {
|
|
1290
|
+
imports.add("reflect");
|
|
1270
1291
|
paramNilCheck.push(`!reflect.ValueOf(${param.name}).IsZero()`);
|
|
1271
1292
|
}
|
|
1272
1293
|
else {
|
|
@@ -1274,14 +1295,18 @@ function parseHeaderPathQueryParams(pkg, method, imports, indent) {
|
|
|
1274
1295
|
}
|
|
1275
1296
|
}
|
|
1276
1297
|
}
|
|
1277
|
-
content += `${indent.get()}if ${paramNilCheck.join(
|
|
1298
|
+
content += `${indent.get()}if ${paramNilCheck.join(" || ")} {\n`;
|
|
1278
1299
|
content += `${indent.push().get()}${naming.uncapitalize(paramGroup.name)} = &${go.getTypeDeclaration(paramGroup, pkg)}{\n`;
|
|
1279
1300
|
if (params) {
|
|
1280
1301
|
indent.push();
|
|
1281
1302
|
for (const param of params) {
|
|
1282
|
-
let byRef =
|
|
1283
|
-
if (param.byValue ||
|
|
1284
|
-
|
|
1303
|
+
let byRef = "&";
|
|
1304
|
+
if (param.byValue ||
|
|
1305
|
+
(!go.isRequiredParameter(param.style) &&
|
|
1306
|
+
param.kind !== "bodyParam" &&
|
|
1307
|
+
!go.isFormBodyParameter(param) &&
|
|
1308
|
+
param.kind !== "multipartFormBodyParam")) {
|
|
1309
|
+
byRef = "";
|
|
1285
1310
|
}
|
|
1286
1311
|
content += `${indent.get()}${naming.capitalize(param.name)}: ${byRef}${getFinalParamValue(pkg, param, paramValues)},\n`;
|
|
1287
1312
|
}
|
|
@@ -1311,18 +1336,18 @@ function populateApiParams(pkg, method, paramValues, imports) {
|
|
|
1311
1336
|
const params = new Array();
|
|
1312
1337
|
// for non-paged APIs, first param is always the context. use the one
|
|
1313
1338
|
// from the HTTP request. be careful to properly handle paged LROs
|
|
1314
|
-
if (method.kind !==
|
|
1315
|
-
params.push(
|
|
1339
|
+
if (method.kind !== "pageableMethod") {
|
|
1340
|
+
params.push("req.Context()");
|
|
1316
1341
|
}
|
|
1317
1342
|
// now create the API call sig
|
|
1318
1343
|
for (const param of helpers.getMethodParameters(method, consolidateHostParams)) {
|
|
1319
|
-
if (param.kind ===
|
|
1344
|
+
if (param.kind === "paramGroup") {
|
|
1320
1345
|
if (param.groupName === method.optionalParamsGroup.groupName) {
|
|
1321
1346
|
// this is the optional params type. in some cases we just pass nil
|
|
1322
|
-
const countParams = param.params.filter((each) => each.kind !==
|
|
1347
|
+
const countParams = param.params.filter((each) => each.kind !== "resumeTokenParam").length;
|
|
1323
1348
|
if (countParams === 0) {
|
|
1324
1349
|
// if the options param is empty or only contains the resume token param just pass nil
|
|
1325
|
-
params.push(
|
|
1350
|
+
params.push("nil");
|
|
1326
1351
|
continue;
|
|
1327
1352
|
}
|
|
1328
1353
|
}
|
|
@@ -1334,47 +1359,47 @@ function populateApiParams(pkg, method, paramValues, imports) {
|
|
|
1334
1359
|
imports.addForType(param.type);
|
|
1335
1360
|
params.push(getFinalParamValue(pkg, param, paramValues));
|
|
1336
1361
|
}
|
|
1337
|
-
return params.join(
|
|
1362
|
+
return params.join(", ");
|
|
1338
1363
|
}
|
|
1339
1364
|
// getRawParamValue returns the "raw" value for the specified parameter.
|
|
1340
1365
|
// depending on the type, the value might require parsing before it can be passed to the fake.
|
|
1341
1366
|
function getRawParamValue(param) {
|
|
1342
1367
|
switch (param.kind) {
|
|
1343
|
-
case
|
|
1344
|
-
if (param.bodyFormat ===
|
|
1345
|
-
return
|
|
1368
|
+
case "bodyParam":
|
|
1369
|
+
if (param.bodyFormat === "binary") {
|
|
1370
|
+
return "req.Body.(io.ReadSeekCloser)";
|
|
1346
1371
|
}
|
|
1347
1372
|
// JSON/XML/text bodies have been deserialized into a local named body
|
|
1348
|
-
return
|
|
1349
|
-
case
|
|
1350
|
-
case
|
|
1351
|
-
case
|
|
1352
|
-
case
|
|
1373
|
+
return "body";
|
|
1374
|
+
case "formBodyCollectionParam":
|
|
1375
|
+
case "formBodyScalarParam":
|
|
1376
|
+
case "multipartFormBodyParam":
|
|
1377
|
+
case "partialBodyParam":
|
|
1353
1378
|
// multipart form data values have been read and assigned
|
|
1354
1379
|
// to local params with the same name.
|
|
1355
1380
|
return param.name;
|
|
1356
|
-
case
|
|
1357
|
-
case
|
|
1381
|
+
case "headerCollectionParam":
|
|
1382
|
+
case "headerScalarParam":
|
|
1358
1383
|
// use req
|
|
1359
1384
|
requiredHelpers.getHeaderValue = true;
|
|
1360
1385
|
return `getHeaderValue(req.Header, "${param.headerName}")`;
|
|
1361
|
-
case
|
|
1362
|
-
return
|
|
1363
|
-
case
|
|
1364
|
-
case
|
|
1386
|
+
case "headerMapParam":
|
|
1387
|
+
return "req.Header";
|
|
1388
|
+
case "pathCollectionParam":
|
|
1389
|
+
case "pathScalarParam":
|
|
1365
1390
|
// path params are in the matches slice
|
|
1366
1391
|
return `matches[regex.SubexpIndex("${sanitizeRegexpCaptureGroupName(param.pathSegment)}")]`;
|
|
1367
|
-
case
|
|
1368
|
-
case
|
|
1392
|
+
case "queryCollectionParam":
|
|
1393
|
+
case "queryScalarParam":
|
|
1369
1394
|
// use qp
|
|
1370
|
-
if (param.kind ===
|
|
1395
|
+
if (param.kind === "queryCollectionParam" && param.collectionFormat === "multi") {
|
|
1371
1396
|
return `qp["${param.queryParameter}"]`;
|
|
1372
1397
|
}
|
|
1373
1398
|
return `qp.Get("${param.queryParameter}")`;
|
|
1374
|
-
case
|
|
1375
|
-
return
|
|
1399
|
+
case "uriParam":
|
|
1400
|
+
return "req.URL.Host";
|
|
1376
1401
|
default:
|
|
1377
|
-
throw new CodegenError(
|
|
1402
|
+
throw new CodegenError("InternalError", `unhandled parameter ${param.name}`);
|
|
1378
1403
|
}
|
|
1379
1404
|
}
|
|
1380
1405
|
/**
|
|
@@ -1394,26 +1419,33 @@ function getFinalParamValue(pkg, param, paramValues) {
|
|
|
1394
1419
|
paramValue = getRawParamValue(param);
|
|
1395
1420
|
}
|
|
1396
1421
|
// there are a few corner-cases that require some fix-ups
|
|
1397
|
-
if ((param.kind ===
|
|
1422
|
+
if ((param.kind === "bodyParam" ||
|
|
1423
|
+
go.isFormBodyParameter(param) ||
|
|
1424
|
+
param.kind === "multipartFormBodyParam") &&
|
|
1425
|
+
param.type.kind === "time") {
|
|
1398
1426
|
// time types in the body have been unmarshalled into our time helpers thus require a cast to time.Time
|
|
1399
1427
|
return `time.Time(${paramValue})`;
|
|
1400
1428
|
}
|
|
1401
1429
|
else if (go.isRequiredParameter(param.style)) {
|
|
1402
1430
|
// optional params are always in their "final" form
|
|
1403
|
-
if (param.kind ===
|
|
1431
|
+
if (param.kind === "headerCollectionParam" ||
|
|
1432
|
+
param.kind === "pathCollectionParam" ||
|
|
1433
|
+
param.kind === "queryCollectionParam") {
|
|
1404
1434
|
// for required params that are collections of strings, we split them inline.
|
|
1405
1435
|
// not necessary for optional params as they're already in slice format.
|
|
1406
|
-
if (param.collectionFormat !==
|
|
1436
|
+
if (param.collectionFormat !== "multi" && param.type.elementType.kind === "string") {
|
|
1407
1437
|
requiredHelpers.splitHelper = true;
|
|
1408
1438
|
return `splitHelper(${paramValue}, "${helpers.getDelimiterForCollectionFormat(param.collectionFormat)}")`;
|
|
1409
1439
|
}
|
|
1410
1440
|
}
|
|
1411
|
-
else if ((go.isHeaderParameter(param) || go.isQueryParameter(param)) &&
|
|
1441
|
+
else if ((go.isHeaderParameter(param) || go.isQueryParameter(param)) &&
|
|
1442
|
+
param.type.kind === "constant" &&
|
|
1443
|
+
param.type.type === "string") {
|
|
1412
1444
|
// query params from req.URL.Query() are already decoded, so like headers we cast required, string-based enums inline
|
|
1413
1445
|
return `${go.getTypeDeclaration(param.type, pkg)}(${paramValue})`;
|
|
1414
1446
|
}
|
|
1415
1447
|
}
|
|
1416
|
-
else if (param.kind ===
|
|
1448
|
+
else if (param.kind === "partialBodyParam") {
|
|
1417
1449
|
// use the value from the unmarshaled, intermediate struct type
|
|
1418
1450
|
return `body.${naming.capitalize(param.name)}`;
|
|
1419
1451
|
}
|
|
@@ -1425,7 +1457,7 @@ function getFinalParamValue(pkg, param, paramValues) {
|
|
|
1425
1457
|
// there's no way to reliably split the host back up into its constituent parameters.
|
|
1426
1458
|
// so we just pass the full value as a single host parameter.
|
|
1427
1459
|
function consolidateHostParams(params) {
|
|
1428
|
-
if (!params.find((each) => each.kind ===
|
|
1460
|
+
if (!params.find((each) => each.kind === "uriParam")) {
|
|
1429
1461
|
// no host params
|
|
1430
1462
|
return params;
|
|
1431
1463
|
}
|
|
@@ -1433,7 +1465,7 @@ function consolidateHostParams(params) {
|
|
|
1433
1465
|
const consolidatedParams = new Array();
|
|
1434
1466
|
let hostParamAdded = false;
|
|
1435
1467
|
for (const param of params) {
|
|
1436
|
-
if (param.kind !==
|
|
1468
|
+
if (param.kind !== "uriParam") {
|
|
1437
1469
|
consolidatedParams.push(param);
|
|
1438
1470
|
}
|
|
1439
1471
|
else if (!hostParamAdded) {
|
|
@@ -1454,27 +1486,27 @@ function consolidateHostParams(params) {
|
|
|
1454
1486
|
function getAPIParametersSig(pkg, method, imports) {
|
|
1455
1487
|
const methodParams = helpers.getMethodParameters(method, consolidateHostParams);
|
|
1456
1488
|
const params = new Array();
|
|
1457
|
-
if (method.kind !==
|
|
1458
|
-
imports.add(
|
|
1459
|
-
params.push(
|
|
1489
|
+
if (method.kind !== "pageableMethod") {
|
|
1490
|
+
imports.add("context");
|
|
1491
|
+
params.push("ctx context.Context");
|
|
1460
1492
|
}
|
|
1461
1493
|
for (const methodParam of methodParams) {
|
|
1462
1494
|
let paramName = naming.uncapitalize(methodParam.name);
|
|
1463
|
-
if (methodParam.kind ===
|
|
1464
|
-
paramName =
|
|
1495
|
+
if (methodParam.kind === "uriParam") {
|
|
1496
|
+
paramName = "host";
|
|
1465
1497
|
}
|
|
1466
1498
|
params.push(`${paramName} ${helpers.formatParameterTypeName(pkg, methodParam)}`);
|
|
1467
1499
|
}
|
|
1468
|
-
return params.join(
|
|
1500
|
+
return params.join(", ");
|
|
1469
1501
|
}
|
|
1470
1502
|
// copied from generator/helpers.ts but without the XML-specific stuff
|
|
1471
1503
|
function getResultFieldName(result) {
|
|
1472
1504
|
switch (result.kind) {
|
|
1473
|
-
case
|
|
1505
|
+
case "anyResult":
|
|
1474
1506
|
return result.fieldName;
|
|
1475
|
-
case
|
|
1507
|
+
case "modelResult":
|
|
1476
1508
|
return result.modelType.name;
|
|
1477
|
-
case
|
|
1509
|
+
case "polymorphicResult":
|
|
1478
1510
|
return result.interface.name;
|
|
1479
1511
|
default:
|
|
1480
1512
|
return result.fieldName;
|