@azure-tools/typespec-go 0.14.3 → 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 +212 -181
- 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 +208 -191
- 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,9 +2,9 @@
|
|
|
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 helpers from
|
|
7
|
-
import { ImportManager } from
|
|
5
|
+
import * as go from "../../codemodel/index.js";
|
|
6
|
+
import * as helpers from "./helpers.js";
|
|
7
|
+
import { ImportManager } from "./imports.js";
|
|
8
8
|
/**
|
|
9
9
|
* Creates the content for the models.go file.
|
|
10
10
|
*
|
|
@@ -16,8 +16,8 @@ import { ImportManager } from './imports.js';
|
|
|
16
16
|
export function generateModels(pkg, options, emitter) {
|
|
17
17
|
if (pkg.models.length === 0) {
|
|
18
18
|
return {
|
|
19
|
-
models:
|
|
20
|
-
serDe:
|
|
19
|
+
models: "",
|
|
20
|
+
serDe: "",
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
// this list of packages to import
|
|
@@ -36,7 +36,7 @@ export function generateModels(pkg, options, emitter) {
|
|
|
36
36
|
let needsJSONPopulateByteArray = false;
|
|
37
37
|
let needsJSONPopulateAny = false;
|
|
38
38
|
let needsJSONPopulateMultipart = false;
|
|
39
|
-
let serdeTextBody =
|
|
39
|
+
let serdeTextBody = "";
|
|
40
40
|
for (const modelDef of modelDefs) {
|
|
41
41
|
modelText += modelDef.text(indent);
|
|
42
42
|
modelDef.Methods.sort((a, b) => {
|
|
@@ -44,7 +44,7 @@ export function generateModels(pkg, options, emitter) {
|
|
|
44
44
|
});
|
|
45
45
|
for (const method of modelDef.Methods) {
|
|
46
46
|
if (method.desc.length > 0) {
|
|
47
|
-
modelText += `${helpers.comment(method.desc,
|
|
47
|
+
modelText += `${helpers.comment(method.desc, "// ", undefined, helpers.commentLength)}\n`;
|
|
48
48
|
}
|
|
49
49
|
modelText += method.text;
|
|
50
50
|
}
|
|
@@ -53,7 +53,7 @@ export function generateModels(pkg, options, emitter) {
|
|
|
53
53
|
});
|
|
54
54
|
for (const method of modelDef.SerDe.methods) {
|
|
55
55
|
if (method.desc.length > 0) {
|
|
56
|
-
serdeTextBody += `${helpers.comment(method.desc,
|
|
56
|
+
serdeTextBody += `${helpers.comment(method.desc, "// ", undefined, helpers.commentLength)}\n`;
|
|
57
57
|
}
|
|
58
58
|
serdeTextBody += method.text;
|
|
59
59
|
}
|
|
@@ -80,9 +80,9 @@ export function generateModels(pkg, options, emitter) {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
if (needsJSONPopulate) {
|
|
83
|
-
serdeImports.add(
|
|
84
|
-
serdeImports.add(
|
|
85
|
-
serdeTextBody +=
|
|
83
|
+
serdeImports.add("reflect");
|
|
84
|
+
serdeImports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore");
|
|
85
|
+
serdeTextBody += "func populate(m map[string]any, k string, v any) {\n";
|
|
86
86
|
serdeTextBody += `${indent.get()}if v == nil {\n`;
|
|
87
87
|
serdeTextBody += `${indent.push().get()}return\n`;
|
|
88
88
|
serdeTextBody += `${indent.pop().get()}} else if azcore.IsNullValue(v) {\n`;
|
|
@@ -90,13 +90,14 @@ export function generateModels(pkg, options, emitter) {
|
|
|
90
90
|
serdeTextBody += `${indent.pop().get()}} else if !reflect.ValueOf(v).IsNil() {\n`;
|
|
91
91
|
serdeTextBody += `${indent.push().get()}m[k] = v\n`;
|
|
92
92
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
93
|
-
serdeTextBody +=
|
|
93
|
+
serdeTextBody += "}\n\n";
|
|
94
94
|
}
|
|
95
95
|
if (needsJSONPopulateTime) {
|
|
96
|
-
serdeImports.add(
|
|
97
|
-
serdeImports.add(
|
|
98
|
-
serdeImports.add(
|
|
99
|
-
serdeTextBody +=
|
|
96
|
+
serdeImports.add("time");
|
|
97
|
+
serdeImports.add("reflect");
|
|
98
|
+
serdeImports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore");
|
|
99
|
+
serdeTextBody +=
|
|
100
|
+
"func populateTime[T dateTimeConstraints](m map[string]any, k string, t *time.Time) {\n";
|
|
100
101
|
serdeTextBody += `${indent.get()}if t == nil {\n`;
|
|
101
102
|
serdeTextBody += `${indent.push().get()}return\n`;
|
|
102
103
|
serdeTextBody += `${indent.pop().get()}} else if azcore.IsNullValue(t) {\n`;
|
|
@@ -107,11 +108,11 @@ export function generateModels(pkg, options, emitter) {
|
|
|
107
108
|
serdeTextBody += `${indent.get()}m[k] = (*T)(&newTime)\n`;
|
|
108
109
|
indent.pop();
|
|
109
110
|
serdeTextBody += `${indent.get()}}\n`;
|
|
110
|
-
serdeTextBody +=
|
|
111
|
+
serdeTextBody += "}\n\n";
|
|
111
112
|
}
|
|
112
113
|
if (needsJSONPopulateAny) {
|
|
113
|
-
serdeImports.add(
|
|
114
|
-
serdeTextBody +=
|
|
114
|
+
serdeImports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore");
|
|
115
|
+
serdeTextBody += "func populateAny(m map[string]any, k string, v any) {\n";
|
|
115
116
|
serdeTextBody += `${indent.get()}if v == nil {\n`;
|
|
116
117
|
serdeTextBody += `${indent.push().get()}return\n`;
|
|
117
118
|
serdeTextBody += `${indent.pop().get()}} else if azcore.IsNullValue(v) {\n`;
|
|
@@ -119,12 +120,13 @@ export function generateModels(pkg, options, emitter) {
|
|
|
119
120
|
serdeTextBody += `${indent.pop().get()}} else {\n`;
|
|
120
121
|
serdeTextBody += `${indent.push().get()}m[k] = v\n`;
|
|
121
122
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
122
|
-
serdeTextBody +=
|
|
123
|
+
serdeTextBody += "}\n\n";
|
|
123
124
|
}
|
|
124
125
|
if (needsJSONPopulateByteArray) {
|
|
125
|
-
serdeImports.add(
|
|
126
|
-
serdeImports.add(
|
|
127
|
-
serdeTextBody +=
|
|
126
|
+
serdeImports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore");
|
|
127
|
+
serdeImports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
128
|
+
serdeTextBody +=
|
|
129
|
+
"func populateByteArray[T any](m map[string]any, k string, b []T, convert func() any) {\n";
|
|
128
130
|
serdeTextBody += `${indent.get()}if azcore.IsNullValue(b) {\n`;
|
|
129
131
|
serdeTextBody += `${indent.push().get()}m[k] = nil\n`;
|
|
130
132
|
serdeTextBody += `${indent.pop().get()}} else if len(b) == 0 {\n`;
|
|
@@ -132,11 +134,11 @@ export function generateModels(pkg, options, emitter) {
|
|
|
132
134
|
serdeTextBody += `${indent.pop().get()}} else {\n`;
|
|
133
135
|
serdeTextBody += `${indent.push().get()}m[k] = convert()\n`;
|
|
134
136
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
135
|
-
serdeTextBody +=
|
|
137
|
+
serdeTextBody += "}\n\n";
|
|
136
138
|
}
|
|
137
139
|
if (needsJSONUnpopulate) {
|
|
138
|
-
serdeImports.add(
|
|
139
|
-
serdeTextBody +=
|
|
140
|
+
serdeImports.add("fmt");
|
|
141
|
+
serdeTextBody += "func unpopulate(data json.RawMessage, fn string, v any) error {\n";
|
|
140
142
|
serdeTextBody += `${indent.get()}if data == nil || string(data) == "null" {\n`;
|
|
141
143
|
serdeTextBody += `${indent.push().get()}return nil\n`;
|
|
142
144
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
@@ -144,12 +146,13 @@ export function generateModels(pkg, options, emitter) {
|
|
|
144
146
|
serdeTextBody += `${indent.push().get()}return fmt.Errorf("struct field %s: %v", fn, err)\n`;
|
|
145
147
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
146
148
|
serdeTextBody += `${indent.get()}return nil\n`;
|
|
147
|
-
serdeTextBody +=
|
|
149
|
+
serdeTextBody += "}\n\n";
|
|
148
150
|
}
|
|
149
151
|
if (needsJSONUnpopulateTime) {
|
|
150
|
-
serdeImports.add(
|
|
151
|
-
serdeImports.add(
|
|
152
|
-
serdeTextBody +=
|
|
152
|
+
serdeImports.add("fmt");
|
|
153
|
+
serdeImports.add("time");
|
|
154
|
+
serdeTextBody +=
|
|
155
|
+
"func unpopulateTime[T dateTimeConstraints](data json.RawMessage, fn string, t **time.Time) error {\n";
|
|
153
156
|
serdeTextBody += `${indent.get()}if data == nil || string(data) == "null" {\n`;
|
|
154
157
|
serdeTextBody += `${indent.push().get()}return nil\n`;
|
|
155
158
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
@@ -160,35 +163,35 @@ export function generateModels(pkg, options, emitter) {
|
|
|
160
163
|
serdeTextBody += `${indent.get()}newTime := time.Time(aux)\n`;
|
|
161
164
|
serdeTextBody += `${indent.get()}*t = &newTime\n`;
|
|
162
165
|
serdeTextBody += `${indent.get()}return nil\n`;
|
|
163
|
-
serdeTextBody +=
|
|
166
|
+
serdeTextBody += "}\n\n";
|
|
164
167
|
}
|
|
165
168
|
if (needsJSONPopulateMultipart) {
|
|
166
|
-
serdeImports.add(
|
|
167
|
-
serdeTextBody +=
|
|
169
|
+
serdeImports.add("encoding/json");
|
|
170
|
+
serdeTextBody += "func populateMultipartJSON(m map[string]any, k string, v any) error {\n";
|
|
168
171
|
serdeTextBody += `${indent.get()}data, err := json.Marshal(v)\n`;
|
|
169
172
|
serdeTextBody += `${indent.get()}if err != nil {\n`;
|
|
170
173
|
serdeTextBody += `${indent.push().get()}return err\n`;
|
|
171
174
|
serdeTextBody += `${indent.pop().get()}}\n`;
|
|
172
175
|
serdeTextBody += `${indent.get()}m[k] = data\n`;
|
|
173
176
|
serdeTextBody += `${indent.get()}return nil\n`;
|
|
174
|
-
serdeTextBody +=
|
|
177
|
+
serdeTextBody += "}\n\n";
|
|
175
178
|
}
|
|
176
179
|
if (needsJSONUnpopulateTime || needsJSONPopulateTime) {
|
|
177
|
-
const formats = new Array(
|
|
180
|
+
const formats = new Array("datetime.PlainDate", "datetime.PlainTime", "datetime.RFC3339", "datetime.Unix");
|
|
178
181
|
serdeTextBody += `type dateTimeConstraints interface {\n`;
|
|
179
182
|
// rfc1123 and rfc7231 are mutually exclusive based on the emitter
|
|
180
183
|
switch (emitter) {
|
|
181
|
-
case
|
|
182
|
-
formats.push(
|
|
184
|
+
case "openapi":
|
|
185
|
+
formats.push("datetime.RFC1123");
|
|
183
186
|
break;
|
|
184
|
-
case
|
|
185
|
-
formats.push(
|
|
187
|
+
case "tsp":
|
|
188
|
+
formats.push("datetime.RFC7231");
|
|
186
189
|
break;
|
|
187
190
|
}
|
|
188
|
-
serdeTextBody += `${indent.get()}${formats.sort().join(
|
|
189
|
-
serdeTextBody +=
|
|
191
|
+
serdeTextBody += `${indent.get()}${formats.sort().join(" | ")}\n`;
|
|
192
|
+
serdeTextBody += "}\n\n";
|
|
190
193
|
}
|
|
191
|
-
let serdeText =
|
|
194
|
+
let serdeText = "";
|
|
192
195
|
if (serdeTextBody.length > 0) {
|
|
193
196
|
serdeText = helpers.contentPreamble(pkg);
|
|
194
197
|
serdeText += serdeImports.text();
|
|
@@ -215,61 +218,65 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
|
|
|
215
218
|
for (const field of model.fields) {
|
|
216
219
|
const descriptionMods = new Array();
|
|
217
220
|
if (field.annotations.readOnly) {
|
|
218
|
-
descriptionMods.push(
|
|
221
|
+
descriptionMods.push("READ-ONLY");
|
|
219
222
|
}
|
|
220
|
-
else if (field.annotations.required &&
|
|
221
|
-
|
|
223
|
+
else if (field.annotations.required &&
|
|
224
|
+
(field.type.kind !== "literal" || model.usage === go.UsageFlags.Output)) {
|
|
225
|
+
descriptionMods.push("REQUIRED");
|
|
222
226
|
}
|
|
223
|
-
else if (field.type.kind ===
|
|
227
|
+
else if (field.type.kind === "literal") {
|
|
224
228
|
if (!field.annotations.required) {
|
|
225
|
-
descriptionMods.push(
|
|
229
|
+
descriptionMods.push("FLAG");
|
|
226
230
|
}
|
|
227
|
-
descriptionMods.push(
|
|
231
|
+
descriptionMods.push("CONSTANT");
|
|
228
232
|
}
|
|
229
|
-
if (field.type.kind ===
|
|
233
|
+
if (field.type.kind === "literal" && model.usage !== go.UsageFlags.Output) {
|
|
230
234
|
// add a comment with the const value for const properties that are sent over the wire
|
|
231
235
|
if (field.docs.description) {
|
|
232
|
-
field.docs.description +=
|
|
236
|
+
field.docs.description += "\n";
|
|
233
237
|
}
|
|
234
238
|
else {
|
|
235
|
-
field.docs.description =
|
|
239
|
+
field.docs.description = "";
|
|
236
240
|
}
|
|
237
241
|
field.docs.description += `Field has constant value ${helpers.formatLiteralValue(field.type, false)}, any specified value is ignored.`;
|
|
238
242
|
}
|
|
239
243
|
if (field.docs.description) {
|
|
240
244
|
descriptionMods.push(field.docs.description);
|
|
241
245
|
}
|
|
242
|
-
else if (field.type.kind ===
|
|
246
|
+
else if (field.type.kind === "rawJSON") {
|
|
243
247
|
// add a basic description if one isn't available
|
|
244
|
-
descriptionMods.push(
|
|
248
|
+
descriptionMods.push("The contents of this field are raw JSON.");
|
|
245
249
|
}
|
|
246
|
-
field.docs.description = descriptionMods.join(
|
|
250
|
+
field.docs.description = descriptionMods.join("; ");
|
|
247
251
|
}
|
|
248
252
|
const serDeFormat = helpers.getSerDeFormat(model, pkg);
|
|
249
253
|
const modelDef = new ModelDef(model, serDeFormat);
|
|
250
254
|
for (const field of modelDef.Model.fields) {
|
|
251
255
|
modelImports.addForType(field.type);
|
|
252
256
|
}
|
|
253
|
-
if (model.kind ===
|
|
254
|
-
serdeImports.add(
|
|
257
|
+
if (model.kind === "model" && serDeFormat === "XML" && !model.annotations.omitSerDeMethods) {
|
|
258
|
+
serdeImports.add("encoding/xml");
|
|
255
259
|
let needsDateTimeMarshalling = false;
|
|
256
260
|
let byteArrayFormat = false;
|
|
257
261
|
for (const field of model.fields) {
|
|
258
|
-
if (field.type.kind !==
|
|
262
|
+
if (field.type.kind !== "etag") {
|
|
259
263
|
// azcore.ETag un/marshals on its own so no need to
|
|
260
264
|
// import azcore as we don't explicitly reference the type
|
|
261
265
|
serdeImports.addForType(field.type);
|
|
262
266
|
}
|
|
263
|
-
if (field.type.kind ===
|
|
267
|
+
if (field.type.kind === "time") {
|
|
264
268
|
needsDateTimeMarshalling = true;
|
|
265
269
|
}
|
|
266
|
-
else if (field.type.kind ===
|
|
270
|
+
else if (field.type.kind === "encodedBytes") {
|
|
267
271
|
byteArrayFormat = true;
|
|
268
272
|
}
|
|
269
273
|
}
|
|
270
274
|
// due to differences in XML marshallers/unmarshallers, we use different codegen than for JSON
|
|
271
275
|
const needsXMLDictionaryUnmarshalling = needsXMLDictionaryHelper(model);
|
|
272
|
-
if (needsDateTimeMarshalling ||
|
|
276
|
+
if (needsDateTimeMarshalling ||
|
|
277
|
+
model.xml?.name ||
|
|
278
|
+
needsXMLArrayMarshalling(model) ||
|
|
279
|
+
byteArrayFormat) {
|
|
273
280
|
generateXMLMarshaller(modelDef, serdeImports, indent);
|
|
274
281
|
if (needsDateTimeMarshalling || needsXMLDictionaryUnmarshalling || byteArrayFormat) {
|
|
275
282
|
generateXMLUnmarshaller(modelDef, serdeImports, indent);
|
|
@@ -282,7 +289,7 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
|
|
|
282
289
|
modelDefs.push(modelDef);
|
|
283
290
|
continue;
|
|
284
291
|
}
|
|
285
|
-
if (model.kind ===
|
|
292
|
+
if (model.kind === "polymorphicModel") {
|
|
286
293
|
generateDiscriminatorMarkerMethod(model.interface, modelDef, indent);
|
|
287
294
|
for (let parent = model.interface.parent; parent !== undefined; parent = parent.parent) {
|
|
288
295
|
generateDiscriminatorMarkerMethod(parent, modelDef, indent);
|
|
@@ -303,7 +310,7 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
|
|
|
303
310
|
function needsXMLDictionaryHelper(modelType) {
|
|
304
311
|
for (const field of modelType.fields) {
|
|
305
312
|
// additional properties uses an internal wrapper type with its own serde impl
|
|
306
|
-
if (field.type.kind ===
|
|
313
|
+
if (field.type.kind === "map" && !field.annotations.isAdditionalProperties) {
|
|
307
314
|
return true;
|
|
308
315
|
}
|
|
309
316
|
}
|
|
@@ -320,7 +327,7 @@ function needsXMLDictionaryHelper(modelType) {
|
|
|
320
327
|
*/
|
|
321
328
|
function needsXMLArrayMarshalling(modelType) {
|
|
322
329
|
for (const prop of modelType.fields) {
|
|
323
|
-
if (prop.type.kind ===
|
|
330
|
+
if (prop.type.kind === "slice") {
|
|
324
331
|
return true;
|
|
325
332
|
}
|
|
326
333
|
}
|
|
@@ -346,7 +353,11 @@ function generateDiscriminatorMarkerMethod(type, modelDef, indent) {
|
|
|
346
353
|
}
|
|
347
354
|
method += `${indent.pop().get()}}\n}\n\n`;
|
|
348
355
|
}
|
|
349
|
-
modelDef.Methods.push({
|
|
356
|
+
modelDef.Methods.push({
|
|
357
|
+
name: interfaceMethod,
|
|
358
|
+
desc: `${interfaceMethod} implements the ${type.name} interface for type ${modelDef.Model.name}.`,
|
|
359
|
+
text: method,
|
|
360
|
+
});
|
|
350
361
|
}
|
|
351
362
|
function generateToMultipartForm(modelDef, indent) {
|
|
352
363
|
const receiver = modelDef.receiverName();
|
|
@@ -354,15 +365,15 @@ function generateToMultipartForm(modelDef, indent) {
|
|
|
354
365
|
method += `${indent.get()}objectMap := make(map[string]any)\n`;
|
|
355
366
|
for (const field of modelDef.Model.fields) {
|
|
356
367
|
const fieldType = helpers.recursiveUnwrapMapSlice(field.type);
|
|
357
|
-
let star =
|
|
368
|
+
let star = "";
|
|
358
369
|
if (!field.byValue) {
|
|
359
|
-
star =
|
|
370
|
+
star = "*";
|
|
360
371
|
}
|
|
361
372
|
if (!field.byValue) {
|
|
362
373
|
method += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
|
|
363
374
|
indent.push();
|
|
364
375
|
}
|
|
365
|
-
if (fieldType.kind ===
|
|
376
|
+
if (fieldType.kind === "model" && !fieldType.annotations.multipartFormData) {
|
|
366
377
|
method += `${indent.get()}if err := populateMultipartJSON(objectMap, "${field.serializedName}", ${star}${receiver}.${field.name}); err != nil {\n`;
|
|
367
378
|
method += `${indent.push().get()}return nil, err\n`;
|
|
368
379
|
method += `${indent.pop().get()}}\n`;
|
|
@@ -376,7 +387,11 @@ function generateToMultipartForm(modelDef, indent) {
|
|
|
376
387
|
}
|
|
377
388
|
}
|
|
378
389
|
method += `${indent.get()}return objectMap, nil\n}\n\n`;
|
|
379
|
-
modelDef.SerDe.methods.push({
|
|
390
|
+
modelDef.SerDe.methods.push({
|
|
391
|
+
name: "toMultipartFormData",
|
|
392
|
+
desc: `toMultipartFormData converts ${modelDef.Model.name} to multipart/form data.`,
|
|
393
|
+
text: method,
|
|
394
|
+
});
|
|
380
395
|
}
|
|
381
396
|
/**
|
|
382
397
|
* generates the MarshalJSON method for the provided type.
|
|
@@ -387,20 +402,24 @@ function generateToMultipartForm(modelDef, indent) {
|
|
|
387
402
|
* @param indent the indentation helper currently in scope
|
|
388
403
|
*/
|
|
389
404
|
function generateJSONMarshaller(modelDef, imports, indent) {
|
|
390
|
-
if (modelDef.Model.kind ===
|
|
405
|
+
if (modelDef.Model.kind === "model" && modelDef.Model.fields.length === 0) {
|
|
391
406
|
// non-discriminated types without content don't need a custom marshaller.
|
|
392
407
|
// there is a case in network where child is allOf base and child has no properties.
|
|
393
408
|
return;
|
|
394
409
|
}
|
|
395
|
-
imports.add(
|
|
410
|
+
imports.add("encoding/json");
|
|
396
411
|
const typeName = modelDef.Model.name;
|
|
397
412
|
const receiver = modelDef.receiverName();
|
|
398
413
|
let marshaller = `func (${receiver} ${typeName}) MarshalJSON() ([]byte, error) {\n`;
|
|
399
414
|
marshaller += `${indent.get()}objectMap := make(map[string]any)\n`;
|
|
400
415
|
marshaller += generateJSONMarshallerBody(modelDef, receiver, imports, indent);
|
|
401
416
|
marshaller += `${indent.get()}return json.Marshal(objectMap)\n`;
|
|
402
|
-
marshaller +=
|
|
403
|
-
modelDef.SerDe.methods.push({
|
|
417
|
+
marshaller += "}\n\n";
|
|
418
|
+
modelDef.SerDe.methods.push({
|
|
419
|
+
name: "MarshalJSON",
|
|
420
|
+
desc: `MarshalJSON implements the json.Marshaller interface for type ${typeName}.`,
|
|
421
|
+
text: marshaller,
|
|
422
|
+
});
|
|
404
423
|
}
|
|
405
424
|
/**
|
|
406
425
|
* generates the contents of MarshalJSON that encode the target type
|
|
@@ -412,10 +431,10 @@ function generateJSONMarshaller(modelDef, imports, indent) {
|
|
|
412
431
|
* @returns the text for encoding the target type
|
|
413
432
|
*/
|
|
414
433
|
function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
415
|
-
let marshaller =
|
|
434
|
+
let marshaller = "";
|
|
416
435
|
let addlProps;
|
|
417
436
|
for (const field of modelDef.Model.fields) {
|
|
418
|
-
if (field.type.kind ===
|
|
437
|
+
if (field.type.kind === "map" && field.annotations.isAdditionalProperties) {
|
|
419
438
|
addlProps = field.type;
|
|
420
439
|
continue;
|
|
421
440
|
}
|
|
@@ -429,15 +448,15 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
|
429
448
|
marshaller += `${indent.get()}objectMap["${field.serializedName}"] = ${receiver}.${field.name}\n`;
|
|
430
449
|
}
|
|
431
450
|
}
|
|
432
|
-
else if (field.type.kind ===
|
|
433
|
-
imports.add(
|
|
451
|
+
else if (field.type.kind === "encodedBytes") {
|
|
452
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
434
453
|
marshaller += `${indent.get()}populateByteArray(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() any {\n`;
|
|
435
454
|
marshaller += `${indent.push().get()}return runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
|
|
436
455
|
marshaller += `${indent.pop().get()}})\n`;
|
|
437
456
|
modelDef.SerDe.needsJSONPopulateByteArray = true;
|
|
438
457
|
}
|
|
439
|
-
else if (field.type.kind ===
|
|
440
|
-
imports.add(
|
|
458
|
+
else if (field.type.kind === "slice" && field.type.elementType.kind === "encodedBytes") {
|
|
459
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
441
460
|
marshaller += `${indent.get()}populateByteArray(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() any {\n`;
|
|
442
461
|
marshaller += `${indent.push().get()}encodedValue := make([]string, len(${receiver}.${field.name}))\n`;
|
|
443
462
|
marshaller += `${indent.get()}for i := 0; i < len(${receiver}.${field.name}); i++ {\n`;
|
|
@@ -447,13 +466,13 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
|
447
466
|
marshaller += `${indent.pop().get()}})\n`;
|
|
448
467
|
modelDef.SerDe.needsJSONPopulateByteArray = true;
|
|
449
468
|
}
|
|
450
|
-
else if (field.type.kind ===
|
|
469
|
+
else if (field.type.kind === "slice" && field.type.elementType.kind === "time") {
|
|
451
470
|
const source = `${receiver}.${field.name}`;
|
|
452
|
-
let elementPtr =
|
|
471
|
+
let elementPtr = "*";
|
|
453
472
|
if (field.type.elementTypeByValue) {
|
|
454
|
-
elementPtr =
|
|
473
|
+
elementPtr = "";
|
|
455
474
|
}
|
|
456
|
-
imports.add(
|
|
475
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
457
476
|
marshaller += `${indent.get()}aux := make([]${elementPtr}datetime.${field.type.elementType.format}, len(${source}), len(${source}))\n`;
|
|
458
477
|
marshaller += `${indent.get()}for i := 0; i < len(${source}); i++ {\n`;
|
|
459
478
|
marshaller += `${indent.push().get()}aux[i] = (${elementPtr}datetime.${field.type.elementType.format})(${source}[i])\n`;
|
|
@@ -461,7 +480,7 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
|
461
480
|
marshaller += `${indent.get()}populate(objectMap, "${field.serializedName}", aux)\n`;
|
|
462
481
|
modelDef.SerDe.needsJSONPopulate = true;
|
|
463
482
|
}
|
|
464
|
-
else if (field.type.kind ===
|
|
483
|
+
else if (field.type.kind === "literal") {
|
|
465
484
|
const setter = `objectMap["${field.serializedName}"] = ${helpers.formatLiteralValue(field.type, true)}`;
|
|
466
485
|
if (!field.annotations.required) {
|
|
467
486
|
marshaller += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
|
|
@@ -472,40 +491,43 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
|
472
491
|
marshaller += `${indent.get()}${setter}\n`;
|
|
473
492
|
}
|
|
474
493
|
}
|
|
475
|
-
else if (field.type.kind ===
|
|
494
|
+
else if (field.type.kind === "rawJSON") {
|
|
476
495
|
marshaller += `${indent.get()}populate(objectMap, "${field.serializedName}", json.RawMessage(${receiver}.${field.name}))\n`;
|
|
477
496
|
modelDef.SerDe.needsJSONPopulate = true;
|
|
478
497
|
}
|
|
479
498
|
else {
|
|
480
499
|
if (field.defaultValue) {
|
|
481
|
-
imports.add(
|
|
500
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
482
501
|
marshaller += `${indent.get()}if ${receiver}.${field.name} == nil {\n`;
|
|
483
502
|
marshaller += `${indent.push().get()}${receiver}.${field.name} = to.Ptr(${helpers.formatLiteralValue(field.defaultValue, true)})\n`;
|
|
484
503
|
marshaller += `${indent.pop().get()}}\n`;
|
|
485
504
|
}
|
|
486
505
|
let populate;
|
|
487
|
-
if (field.type.kind ===
|
|
488
|
-
imports.add(
|
|
506
|
+
if (field.type.kind === "time") {
|
|
507
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
489
508
|
populate = `populateTime[datetime.${field.type.format}]`;
|
|
490
509
|
modelDef.SerDe.needsJSONPopulateTime = true;
|
|
491
510
|
}
|
|
492
|
-
else if (field.type.kind ===
|
|
493
|
-
populate =
|
|
511
|
+
else if (field.type.kind === "any") {
|
|
512
|
+
populate = "populateAny";
|
|
494
513
|
modelDef.SerDe.needsJSONPopulateAny = true;
|
|
495
514
|
}
|
|
496
515
|
else {
|
|
497
|
-
populate =
|
|
516
|
+
populate = "populate";
|
|
498
517
|
modelDef.SerDe.needsJSONPopulate = true;
|
|
499
518
|
}
|
|
500
|
-
if (field.type.kind ===
|
|
519
|
+
if (field.type.kind === "scalar" &&
|
|
520
|
+
(field.type.type.startsWith("uint") || field.type.type.startsWith("int")) &&
|
|
521
|
+
field.type.encodeAsString) {
|
|
501
522
|
// TODO: need to handle map and slice type with underlying int as string type
|
|
502
|
-
imports.add(
|
|
503
|
-
imports.add(
|
|
504
|
-
if ((field.type.type.startsWith(
|
|
505
|
-
|
|
523
|
+
imports.add("strconv");
|
|
524
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
|
|
525
|
+
if ((field.type.type.startsWith("uint") && field.type.type !== "uint64") ||
|
|
526
|
+
(field.type.type.startsWith("int") && field.type.type !== "int64")) {
|
|
527
|
+
marshaller += `${indent.get()}${populate}(objectMap, "${field.serializedName}", to.Ptr(strconv.${field.type.type.startsWith("int") ? "FormatInt" : "FormatUint"}(${field.type.type.startsWith("int") ? "int64" : "uint64"}(*${receiver}.${field.name}), 10)))\n`;
|
|
506
528
|
}
|
|
507
529
|
else {
|
|
508
|
-
marshaller += `${indent.get()}${populate}(objectMap, "${field.serializedName}", to.Ptr(strconv.${field.type.type.startsWith(
|
|
530
|
+
marshaller += `${indent.get()}${populate}(objectMap, "${field.serializedName}", to.Ptr(strconv.${field.type.type.startsWith("int") ? "FormatInt" : "FormatUint"}(*${receiver}.${field.name}, 10)))\n`;
|
|
509
531
|
}
|
|
510
532
|
}
|
|
511
533
|
else {
|
|
@@ -516,8 +538,8 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
|
|
|
516
538
|
if (addlProps) {
|
|
517
539
|
marshaller += `${indent.get()}if ${receiver}.AdditionalProperties != nil {\n`;
|
|
518
540
|
marshaller += `${indent.push().get()}for key, val := range ${receiver}.AdditionalProperties {\n`;
|
|
519
|
-
let assignment =
|
|
520
|
-
if (addlProps.valueType.kind ===
|
|
541
|
+
let assignment = "val";
|
|
542
|
+
if (addlProps.valueType.kind === "time") {
|
|
521
543
|
assignment = `(*${addlProps.valueType.format})(val)`;
|
|
522
544
|
}
|
|
523
545
|
marshaller += `${indent.push().get()}objectMap[key] = ${assignment}\n`;
|
|
@@ -541,8 +563,8 @@ function generateJSONUnmarshaller(modelDef, options, imports, indent) {
|
|
|
541
563
|
if (modelDef.Model.fields.length === 0) {
|
|
542
564
|
return;
|
|
543
565
|
}
|
|
544
|
-
imports.add(
|
|
545
|
-
imports.add(
|
|
566
|
+
imports.add("encoding/json");
|
|
567
|
+
imports.add("fmt");
|
|
546
568
|
const typeName = modelDef.Model.name;
|
|
547
569
|
const receiver = modelDef.receiverName();
|
|
548
570
|
let unmarshaller = `func (${receiver} *${typeName}) UnmarshalJSON(data []byte) error {\n`;
|
|
@@ -551,8 +573,12 @@ function generateJSONUnmarshaller(modelDef, options, imports, indent) {
|
|
|
551
573
|
unmarshaller += `${indent.push().get()}return fmt.Errorf("unmarshalling type %T: %s", ${receiver}, err.Error())\n`;
|
|
552
574
|
unmarshaller += `${indent.pop().get()}}\n`;
|
|
553
575
|
unmarshaller += generateJSONUnmarshallerBody(modelDef, receiver, options, imports, indent);
|
|
554
|
-
unmarshaller +=
|
|
555
|
-
modelDef.SerDe.methods.push({
|
|
576
|
+
unmarshaller += "}\n\n";
|
|
577
|
+
modelDef.SerDe.methods.push({
|
|
578
|
+
name: "UnmarshalJSON",
|
|
579
|
+
desc: `UnmarshalJSON implements the json.Unmarshaller interface for type ${typeName}.`,
|
|
580
|
+
text: unmarshaller,
|
|
581
|
+
});
|
|
556
582
|
}
|
|
557
583
|
/**
|
|
558
584
|
* generates the contents of UnmarshalJSON that decode the target type
|
|
@@ -573,17 +599,17 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
573
599
|
const emitAddlProps = function (addlProps) {
|
|
574
600
|
// indent is at the case body level when called
|
|
575
601
|
let addlPropsText = `${indent.get()}if ${receiver}.AdditionalProperties == nil {\n`;
|
|
576
|
-
let ref =
|
|
602
|
+
let ref = "";
|
|
577
603
|
if (!addlProps.valueTypeByValue) {
|
|
578
|
-
ref =
|
|
604
|
+
ref = "&";
|
|
579
605
|
}
|
|
580
606
|
addlPropsText += `${indent.push().get()}${receiver}.AdditionalProperties = ${go.getTypeDeclaration(addlProps, modelDef.Model.pkg)}{}\n`;
|
|
581
607
|
addlPropsText += `${indent.pop().get()}}\n`;
|
|
582
608
|
addlPropsText += `${indent.get()}if val != nil {\n`;
|
|
583
609
|
let auxType = go.getTypeDeclaration(addlProps.valueType, modelDef.Model.pkg);
|
|
584
610
|
let assignment = `${ref}aux`;
|
|
585
|
-
if (addlProps.valueType.kind ===
|
|
586
|
-
imports.add(
|
|
611
|
+
if (addlProps.valueType.kind === "time") {
|
|
612
|
+
imports.add("time");
|
|
587
613
|
auxType = addlProps.valueType.format;
|
|
588
614
|
assignment = `(*time.Time)(${assignment})`;
|
|
589
615
|
}
|
|
@@ -597,11 +623,11 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
597
623
|
};
|
|
598
624
|
const emitSwitchCase = function () {
|
|
599
625
|
// indent is at level 2 (for loop body) when called
|
|
600
|
-
let unmarshalBody =
|
|
626
|
+
let unmarshalBody = "";
|
|
601
627
|
let addlProps;
|
|
602
628
|
unmarshalBody += `${indent.get()}switch key {\n`;
|
|
603
629
|
for (const field of modelDef.Model.fields) {
|
|
604
|
-
if (field.type.kind ===
|
|
630
|
+
if (field.type.kind === "map" && field.annotations.isAdditionalProperties) {
|
|
605
631
|
addlProps = field.type;
|
|
606
632
|
continue;
|
|
607
633
|
}
|
|
@@ -611,17 +637,17 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
611
637
|
unmarshalBody += generateDiscriminatorUnmarshaller(modelDef.Model, field, receiver, indent);
|
|
612
638
|
needsErrCheck = true;
|
|
613
639
|
}
|
|
614
|
-
else if (field.type.kind ===
|
|
640
|
+
else if (field.type.kind === "time") {
|
|
615
641
|
unmarshalBody += `${indent.get()}err = unpopulateTime[datetime.${field.type.format}](val, "${field.name}", &${receiver}.${field.name})\n`;
|
|
616
642
|
modelDef.SerDe.needsJSONUnpopulateTime = true;
|
|
617
643
|
needsErrCheck = true;
|
|
618
644
|
}
|
|
619
|
-
else if (field.type.kind ===
|
|
620
|
-
imports.add(
|
|
621
|
-
imports.add(
|
|
622
|
-
let elementPtr =
|
|
645
|
+
else if (field.type.kind === "slice" && field.type.elementType.kind === "time") {
|
|
646
|
+
imports.add("time");
|
|
647
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
648
|
+
let elementPtr = "*";
|
|
623
649
|
if (field.type.elementTypeByValue) {
|
|
624
|
-
elementPtr =
|
|
650
|
+
elementPtr = "";
|
|
625
651
|
}
|
|
626
652
|
unmarshalBody += `${indent.get()}var aux []${elementPtr}datetime.${field.type.elementType.format}\n`;
|
|
627
653
|
unmarshalBody += `${indent.get()}err = unpopulate(val, "${field.name}", &aux)\n`;
|
|
@@ -631,15 +657,15 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
631
657
|
modelDef.SerDe.needsJSONUnpopulate = true;
|
|
632
658
|
needsErrCheck = true;
|
|
633
659
|
}
|
|
634
|
-
else if (field.type.kind ===
|
|
635
|
-
imports.add(
|
|
660
|
+
else if (field.type.kind === "encodedBytes") {
|
|
661
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
636
662
|
unmarshalBody += `${indent.get()}if val != nil && string(val) != "null" {\n`;
|
|
637
663
|
unmarshalBody += `${indent.push().get()}err = runtime.DecodeByteArray(string(val), &${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
|
|
638
664
|
unmarshalBody += `${indent.pop().get()}}\n`;
|
|
639
665
|
needsErrCheck = true;
|
|
640
666
|
}
|
|
641
|
-
else if (field.type.kind ===
|
|
642
|
-
imports.add(
|
|
667
|
+
else if (field.type.kind === "slice" && field.type.elementType.kind === "encodedBytes") {
|
|
668
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
643
669
|
unmarshalBody += `${indent.get()}var encodedValue []string\n`;
|
|
644
670
|
unmarshalBody += `${indent.get()}err = unpopulate(val, "${field.name}", &encodedValue)\n`;
|
|
645
671
|
unmarshalBody += `${indent.get()}if err == nil && len(encodedValue) > 0 {\n`;
|
|
@@ -653,22 +679,25 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
653
679
|
modelDef.SerDe.needsJSONUnpopulate = true;
|
|
654
680
|
needsErrCheck = true;
|
|
655
681
|
}
|
|
656
|
-
else if (field.type.kind ===
|
|
682
|
+
else if (field.type.kind === "rawJSON") {
|
|
657
683
|
unmarshalBody += `${indent.get()}if string(val) != "null" {\n`;
|
|
658
684
|
unmarshalBody += `${indent.push().get()}${receiver}.${field.name} = val\n`;
|
|
659
685
|
unmarshalBody += `${indent.pop().get()}}\n`;
|
|
660
686
|
}
|
|
661
|
-
else if (field.type.kind ===
|
|
687
|
+
else if (field.type.kind === "scalar" &&
|
|
688
|
+
(field.type.type.startsWith("uint") || field.type.type.startsWith("int")) &&
|
|
689
|
+
field.type.encodeAsString) {
|
|
662
690
|
// TODO: need to handle map and slice type with underlying int as string type
|
|
663
|
-
imports.add(
|
|
691
|
+
imports.add("strconv");
|
|
664
692
|
unmarshalBody += `${indent.get()}var aux string\n`;
|
|
665
693
|
unmarshalBody += `${indent.get()}err = unpopulate(val, "${field.name}", &aux)\n`;
|
|
666
694
|
unmarshalBody += `${indent.get()}if err == nil {\n`;
|
|
667
695
|
indent.push();
|
|
668
|
-
unmarshalBody += `${indent.get()}var v ${field.type.type.startsWith(
|
|
669
|
-
unmarshalBody += `${indent.get()}v, err = strconv.${field.type.type.startsWith(
|
|
696
|
+
unmarshalBody += `${indent.get()}var v ${field.type.type.startsWith("int") ? "int64" : "uint64"}\n`;
|
|
697
|
+
unmarshalBody += `${indent.get()}v, err = strconv.${field.type.type.startsWith("int") ? "ParseInt" : "ParseUint"}(aux, 10, 0)\n`;
|
|
670
698
|
unmarshalBody += `${indent.get()}if err == nil {\n`;
|
|
671
|
-
if ((field.type.type.startsWith(
|
|
699
|
+
if ((field.type.type.startsWith("uint") && field.type.type !== "uint64") ||
|
|
700
|
+
(field.type.type.startsWith("int") && field.type.type !== "int64")) {
|
|
672
701
|
unmarshalBody += `${indent.push().get()}${receiver}.${field.name} = to.Ptr(${field.type.type}(v))\n`;
|
|
673
702
|
}
|
|
674
703
|
else {
|
|
@@ -682,7 +711,7 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
682
711
|
}
|
|
683
712
|
else {
|
|
684
713
|
const unpopulateField = `err = unpopulate(val, "${field.name}", &${receiver}.${field.name})\n`;
|
|
685
|
-
if (field.type.kind ===
|
|
714
|
+
if (field.type.kind === "string" && field.annotations.unmarshalEmptyStringAsNil) {
|
|
686
715
|
unmarshalBody += `${indent.get()}${helpers.buildIfBlock(indent, {
|
|
687
716
|
condition: `string(val) != \`""\``,
|
|
688
717
|
body: (indent) => `${indent.get()}${unpopulateField}`,
|
|
@@ -734,11 +763,11 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
|
|
|
734
763
|
// recursively called for arrays and dictionaries.
|
|
735
764
|
function hasDiscriminatorInterface(item) {
|
|
736
765
|
switch (item.kind) {
|
|
737
|
-
case
|
|
766
|
+
case "interface":
|
|
738
767
|
return true;
|
|
739
|
-
case
|
|
768
|
+
case "map":
|
|
740
769
|
return hasDiscriminatorInterface(item.valueType);
|
|
741
|
-
case
|
|
770
|
+
case "slice":
|
|
742
771
|
return hasDiscriminatorInterface(item.elementType);
|
|
743
772
|
default:
|
|
744
773
|
return false;
|
|
@@ -747,14 +776,14 @@ function hasDiscriminatorInterface(item) {
|
|
|
747
776
|
// returns the text for unmarshalling a discriminated type
|
|
748
777
|
function generateDiscriminatorUnmarshaller(modelType, field, receiver, indent) {
|
|
749
778
|
const propertyName = field.name;
|
|
750
|
-
// these are the simple, non-nested cases (e.g.
|
|
751
|
-
if (field.type.kind ===
|
|
779
|
+
// these are the simple, non-nested cases (e.g. InterfaceType, []InterfaceType, map[string]InterfaceType)
|
|
780
|
+
if (field.type.kind === "interface") {
|
|
752
781
|
return `${indent.get()}${receiver}.${propertyName}, err = unmarshal${field.type.name}(val)\n`;
|
|
753
782
|
}
|
|
754
|
-
else if (field.type.kind ===
|
|
783
|
+
else if (field.type.kind === "slice" && field.type.elementType.kind === "interface") {
|
|
755
784
|
return `${indent.get()}${receiver}.${propertyName}, err = unmarshal${field.type.elementType.name}Array(val)\n`;
|
|
756
785
|
}
|
|
757
|
-
else if (field.type.kind ===
|
|
786
|
+
else if (field.type.kind === "map" && field.type.valueType.kind === "interface") {
|
|
758
787
|
return `${indent.get()}${receiver}.${propertyName}, err = unmarshal${field.type.valueType.name}Map(val)\n`;
|
|
759
788
|
}
|
|
760
789
|
// nested case (e.g. [][]InterfaceType, map[string]map[string]InterfaceType etc)
|
|
@@ -767,7 +796,7 @@ function generateDiscriminatorUnmarshaller(modelType, field, receiver, indent) {
|
|
|
767
796
|
// create a local instantiation of the final type
|
|
768
797
|
const finalTargetVar = field.serializedName;
|
|
769
798
|
let finalTargetCtor = recursiveGetDiscriminatorTypeName(modelType, field.type, false);
|
|
770
|
-
if (field.type.kind ===
|
|
799
|
+
if (field.type.kind === "slice") {
|
|
771
800
|
finalTargetCtor = `make(${finalTargetCtor}, len(${rawTargetVar}))`;
|
|
772
801
|
}
|
|
773
802
|
else {
|
|
@@ -786,18 +815,18 @@ function generateDiscriminatorUnmarshaller(modelType, field, receiver, indent) {
|
|
|
786
815
|
// !raw e.g. map[string]map[string]InterfaceType, [][]InterfaceType etc
|
|
787
816
|
function recursiveGetDiscriminatorTypeName(modelType, item, raw) {
|
|
788
817
|
// when raw is true, stop recursing at the level before the leaf schema
|
|
789
|
-
if (item.kind ===
|
|
790
|
-
if (!raw || item.elementType.kind !==
|
|
818
|
+
if (item.kind === "slice") {
|
|
819
|
+
if (!raw || item.elementType.kind !== "interface") {
|
|
791
820
|
return `[]${recursiveGetDiscriminatorTypeName(modelType, item.elementType, raw)}`;
|
|
792
821
|
}
|
|
793
822
|
}
|
|
794
|
-
else if (item.kind ===
|
|
795
|
-
if (!raw || item.valueType.kind !==
|
|
823
|
+
else if (item.kind === "map") {
|
|
824
|
+
if (!raw || item.valueType.kind !== "interface") {
|
|
796
825
|
return `map[string]${recursiveGetDiscriminatorTypeName(modelType, item.valueType, raw)}`;
|
|
797
826
|
}
|
|
798
827
|
}
|
|
799
828
|
if (raw) {
|
|
800
|
-
return
|
|
829
|
+
return "json.RawMessage";
|
|
801
830
|
}
|
|
802
831
|
return go.getTypeDeclaration(item, modelType.pkg);
|
|
803
832
|
}
|
|
@@ -814,11 +843,11 @@ function recursiveGetDiscriminatorTypeName(modelType, item, raw) {
|
|
|
814
843
|
* @returns the text populating the discriminator
|
|
815
844
|
*/
|
|
816
845
|
function recursivePopulateDiscriminator(modelType, item, receiver, rawSrc, dest, indent, nesting) {
|
|
817
|
-
let text =
|
|
818
|
-
let interfaceName =
|
|
819
|
-
let targetType =
|
|
820
|
-
if (item.kind ===
|
|
821
|
-
if (item.elementType.kind !==
|
|
846
|
+
let text = "";
|
|
847
|
+
let interfaceName = "";
|
|
848
|
+
let targetType = "";
|
|
849
|
+
if (item.kind === "slice") {
|
|
850
|
+
if (item.elementType.kind !== "interface") {
|
|
822
851
|
if (nesting > 1) {
|
|
823
852
|
// at nestling level 1, the destination var was already created in generateDiscriminatorUnmarshaller()
|
|
824
853
|
text += `${indent.get()}${dest} = make(${recursiveGetDiscriminatorTypeName(modelType, item, false)}, len(${rawSrc}))\n`;
|
|
@@ -834,10 +863,10 @@ function recursivePopulateDiscriminator(modelType, item, receiver, rawSrc, dest,
|
|
|
834
863
|
}
|
|
835
864
|
// we're at leaf node - 1, so get the interface from the element's type
|
|
836
865
|
interfaceName = go.getTypeDeclaration(item.elementType, modelType.pkg);
|
|
837
|
-
targetType =
|
|
866
|
+
targetType = "Array";
|
|
838
867
|
}
|
|
839
|
-
else if (item.kind ===
|
|
840
|
-
if (item.valueType.kind !==
|
|
868
|
+
else if (item.kind === "map") {
|
|
869
|
+
if (item.valueType.kind !== "interface") {
|
|
841
870
|
if (nesting > 1) {
|
|
842
871
|
// at nestling level 1, the destination var was already created in generateDiscriminatorUnmarshaller()
|
|
843
872
|
text += `${indent.get()}${dest} = ${recursiveGetDiscriminatorTypeName(modelType, item, false)}{}\n`;
|
|
@@ -853,7 +882,7 @@ function recursivePopulateDiscriminator(modelType, item, receiver, rawSrc, dest,
|
|
|
853
882
|
}
|
|
854
883
|
// we're at leaf node - 1, so get the interface from the element's type
|
|
855
884
|
interfaceName = go.getTypeDeclaration(item.valueType, modelType.pkg);
|
|
856
|
-
targetType =
|
|
885
|
+
targetType = "Map";
|
|
857
886
|
}
|
|
858
887
|
text += `${indent.get()}${dest}, err = unmarshal${interfaceName}${targetType}(${rawSrc})\n`;
|
|
859
888
|
text += `${indent.get()}if err != nil {\n`;
|
|
@@ -878,16 +907,16 @@ function generateXMLMarshaller(modelDef, imports, indent) {
|
|
|
878
907
|
}
|
|
879
908
|
text += generateAliasType(modelDef.Model, receiver, true, imports, indent);
|
|
880
909
|
for (const field of modelDef.Model.fields) {
|
|
881
|
-
if (field.type.kind ===
|
|
910
|
+
if (field.type.kind === "slice") {
|
|
882
911
|
text += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
|
|
883
912
|
text += `${indent.push().get()}aux.${field.name} = &${receiver}.${field.name}\n`;
|
|
884
913
|
text += `${indent.pop().get()}}\n`;
|
|
885
914
|
}
|
|
886
|
-
else if (field.annotations.isAdditionalProperties || field.type.kind ===
|
|
915
|
+
else if (field.annotations.isAdditionalProperties || field.type.kind === "map") {
|
|
887
916
|
text += `${indent.get()}aux.${field.name} = (additionalProperties)(${receiver}.${field.name})\n`;
|
|
888
917
|
}
|
|
889
|
-
else if (field.type.kind ===
|
|
890
|
-
imports.add(
|
|
918
|
+
else if (field.type.kind === "encodedBytes") {
|
|
919
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
891
920
|
text += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
|
|
892
921
|
indent.push();
|
|
893
922
|
text += `${indent.get()}encoded${field.name} := runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
|
|
@@ -897,8 +926,8 @@ function generateXMLMarshaller(modelDef, imports, indent) {
|
|
|
897
926
|
}
|
|
898
927
|
}
|
|
899
928
|
text += `${indent.get()}return enc.EncodeElement(aux, start)\n`;
|
|
900
|
-
text +=
|
|
901
|
-
modelDef.SerDe.methods.push({ name:
|
|
929
|
+
text += "}\n\n";
|
|
930
|
+
modelDef.SerDe.methods.push({ name: "MarshalXML", desc: desc, text: text });
|
|
902
931
|
}
|
|
903
932
|
/**
|
|
904
933
|
* generates an implementation of UnmarshalXML for the provided type.
|
|
@@ -917,16 +946,16 @@ function generateXMLUnmarshaller(modelDef, imports, indent) {
|
|
|
917
946
|
text += `${indent.push().get()}return err\n`;
|
|
918
947
|
text += `${indent.pop().get()}}\n`;
|
|
919
948
|
for (const field of modelDef.Model.fields) {
|
|
920
|
-
if (field.type.kind ===
|
|
949
|
+
if (field.type.kind === "time") {
|
|
921
950
|
text += `${indent.get()}if aux.${field.name} != nil && !(*time.Time)(aux.${field.name}).IsZero() {\n`;
|
|
922
951
|
text += `${indent.push().get()}${receiver}.${field.name} = (*time.Time)(aux.${field.name})\n`;
|
|
923
952
|
text += `${indent.pop().get()}}\n`;
|
|
924
953
|
}
|
|
925
|
-
else if (field.annotations.isAdditionalProperties || field.type.kind ===
|
|
954
|
+
else if (field.annotations.isAdditionalProperties || field.type.kind === "map") {
|
|
926
955
|
text += `${indent.get()}${receiver}.${field.name} = (map[string]*string)(aux.${field.name})\n`;
|
|
927
956
|
}
|
|
928
|
-
else if (field.type.kind ===
|
|
929
|
-
imports.add(
|
|
957
|
+
else if (field.type.kind === "encodedBytes") {
|
|
958
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
|
|
930
959
|
text += `${indent.get()}if aux.${field.name} != nil {\n`;
|
|
931
960
|
indent.push();
|
|
932
961
|
text += `${indent.get()}if err := runtime.DecodeByteArray(*aux.${field.name}, &${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format); err != nil {\n`;
|
|
@@ -937,8 +966,8 @@ function generateXMLUnmarshaller(modelDef, imports, indent) {
|
|
|
937
966
|
}
|
|
938
967
|
}
|
|
939
968
|
text += `${indent.get()}return nil\n`;
|
|
940
|
-
text +=
|
|
941
|
-
modelDef.SerDe.methods.push({ name:
|
|
969
|
+
text += "}\n\n";
|
|
970
|
+
modelDef.SerDe.methods.push({ name: "UnmarshalXML", desc: desc, text: text });
|
|
942
971
|
}
|
|
943
972
|
/**
|
|
944
973
|
* generates an alias type used by custom XML marshaller/unmarshaller
|
|
@@ -954,33 +983,33 @@ function generateAliasType(modelType, receiver, forMarshal, imports, indent) {
|
|
|
954
983
|
text += `${indent.push().get()}*alias\n`;
|
|
955
984
|
for (const field of modelType.fields) {
|
|
956
985
|
const sn = getXMLSerialization(field);
|
|
957
|
-
if (field.type.kind ===
|
|
958
|
-
imports.add(
|
|
986
|
+
if (field.type.kind === "time") {
|
|
987
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
959
988
|
text += `${indent.get()}${field.name} *datetime.${field.type.format} \`xml:"${sn}"\`\n`;
|
|
960
989
|
}
|
|
961
|
-
else if (field.annotations.isAdditionalProperties || field.type.kind ===
|
|
990
|
+
else if (field.annotations.isAdditionalProperties || field.type.kind === "map") {
|
|
962
991
|
text += `${indent.get()}${field.name} additionalProperties \`xml:"${sn}"\`\n`;
|
|
963
992
|
}
|
|
964
|
-
else if (field.type.kind ===
|
|
993
|
+
else if (field.type.kind === "slice") {
|
|
965
994
|
text += `${indent.get()}${field.name} *${go.getTypeDeclaration(field.type, modelType.pkg)} \`xml:"${sn}"\`\n`;
|
|
966
995
|
}
|
|
967
|
-
else if (field.type.kind ===
|
|
996
|
+
else if (field.type.kind === "encodedBytes") {
|
|
968
997
|
text += `${indent.get()}${field.name} *string \`xml:"${sn}"\`\n`;
|
|
969
998
|
}
|
|
970
999
|
}
|
|
971
1000
|
text += `${indent.pop().get()}}{\n`;
|
|
972
1001
|
let rec = receiver;
|
|
973
1002
|
if (forMarshal) {
|
|
974
|
-
rec =
|
|
1003
|
+
rec = "&" + rec;
|
|
975
1004
|
}
|
|
976
1005
|
text += `${indent.push().get()}alias: (*alias)(${rec}),\n`;
|
|
977
1006
|
if (forMarshal) {
|
|
978
1007
|
// emit code to initialize time fields
|
|
979
1008
|
for (const field of modelType.fields) {
|
|
980
|
-
if (field.type.kind !==
|
|
1009
|
+
if (field.type.kind !== "time") {
|
|
981
1010
|
continue;
|
|
982
1011
|
}
|
|
983
|
-
imports.add(
|
|
1012
|
+
imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
|
|
984
1013
|
text += `${indent.get()}${field.name}: (*datetime.${field.type.format})(${receiver}.${field.name}),\n`;
|
|
985
1014
|
}
|
|
986
1015
|
}
|
|
@@ -1026,10 +1055,12 @@ class ModelDef {
|
|
|
1026
1055
|
text += `type ${this.Model.name} struct {\n`;
|
|
1027
1056
|
// group fields by required/optional/read-only in that order
|
|
1028
1057
|
this.Model.fields.sort((lhs, rhs) => {
|
|
1029
|
-
if ((lhs.annotations.required && !rhs.annotations.required) ||
|
|
1058
|
+
if ((lhs.annotations.required && !rhs.annotations.required) ||
|
|
1059
|
+
(!lhs.annotations.readOnly && rhs.annotations.readOnly)) {
|
|
1030
1060
|
return -1;
|
|
1031
1061
|
}
|
|
1032
|
-
else if ((rhs.annotations.readOnly && !lhs.annotations.readOnly) ||
|
|
1062
|
+
else if ((rhs.annotations.readOnly && !lhs.annotations.readOnly) ||
|
|
1063
|
+
(!rhs.annotations.readOnly && lhs.annotations.readOnly)) {
|
|
1033
1064
|
return 1;
|
|
1034
1065
|
}
|
|
1035
1066
|
else {
|
|
@@ -1043,31 +1074,31 @@ class ModelDef {
|
|
|
1043
1074
|
if (!first) {
|
|
1044
1075
|
// add an extra new-line between fields IFF the field
|
|
1045
1076
|
// has a comment and it's not the very first one.
|
|
1046
|
-
text +=
|
|
1077
|
+
text += "\n";
|
|
1047
1078
|
}
|
|
1048
1079
|
text += helpers.formatDocComment(field.docs);
|
|
1049
1080
|
}
|
|
1050
1081
|
let typeName = go.getTypeDeclaration(field.type, this.Model.pkg);
|
|
1051
|
-
if (field.type.kind ===
|
|
1082
|
+
if (field.type.kind === "literal") {
|
|
1052
1083
|
// for constants we use the underlying type name
|
|
1053
1084
|
typeName = go.getLiteralTypeDeclaration(field.type.type);
|
|
1054
1085
|
}
|
|
1055
1086
|
let serialization = field.serializedName;
|
|
1056
|
-
if (this.Format ===
|
|
1057
|
-
serialization +=
|
|
1087
|
+
if (this.Format === "JSON") {
|
|
1088
|
+
serialization += ",omitempty";
|
|
1058
1089
|
}
|
|
1059
|
-
else if (this.Format ===
|
|
1090
|
+
else if (this.Format === "XML") {
|
|
1060
1091
|
serialization = getXMLSerialization(field);
|
|
1061
1092
|
}
|
|
1062
|
-
let tag =
|
|
1093
|
+
let tag = "";
|
|
1063
1094
|
// only emit tags for XML; JSON uses custom marshallers/unmarshallers
|
|
1064
|
-
if (this.Format ===
|
|
1095
|
+
if (this.Format === "XML" && !field.annotations.isAdditionalProperties) {
|
|
1065
1096
|
tag = ` \`xml:"${serialization}"\``;
|
|
1066
1097
|
}
|
|
1067
1098
|
text += `${indent.get()}${field.name} ${helpers.star(field.byValue)}${typeName}${tag}\n`;
|
|
1068
1099
|
first = false;
|
|
1069
1100
|
}
|
|
1070
|
-
text +=
|
|
1101
|
+
text += "}\n\n";
|
|
1071
1102
|
return text;
|
|
1072
1103
|
}
|
|
1073
1104
|
/** returns the name to use for method receivers on this struct */
|
|
@@ -1086,19 +1117,19 @@ function getXMLSerialization(field) {
|
|
|
1086
1117
|
let serialization = field.serializedName;
|
|
1087
1118
|
// default to using the serialization name
|
|
1088
1119
|
if (field.xml?.name) {
|
|
1089
|
-
// xml can
|
|
1120
|
+
// xml can specify its own name, prefer that if available
|
|
1090
1121
|
serialization = field.xml.name;
|
|
1091
1122
|
}
|
|
1092
1123
|
else if (field.xml?.text) {
|
|
1093
1124
|
// type has the x-ms-text attribute applied so it should be character data, not a node (https://github.com/Azure/autorest/tree/main/docs/extensions#x-ms-text)
|
|
1094
1125
|
// see https://pkg.go.dev/encoding/xml#Unmarshal for what ,chardata actually means
|
|
1095
|
-
serialization =
|
|
1126
|
+
serialization = ",chardata";
|
|
1096
1127
|
}
|
|
1097
1128
|
if (field.xml?.attribute) {
|
|
1098
1129
|
// value comes from an xml attribute
|
|
1099
|
-
serialization +=
|
|
1130
|
+
serialization += ",attr";
|
|
1100
1131
|
}
|
|
1101
|
-
else if (field.type.kind ===
|
|
1132
|
+
else if (field.type.kind === "slice") {
|
|
1102
1133
|
// start with the serialized name of the element, preferring xml name if available
|
|
1103
1134
|
let inner = field.serializedName;
|
|
1104
1135
|
if (field.xml?.name) {
|