@azure-tools/typespec-go 0.17.4 → 0.17.5-dev.5

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.
Files changed (56) hide show
  1. package/dist/src/codegen/core/example.js +11 -11
  2. package/dist/src/codegen/core/example.js.map +1 -1
  3. package/dist/src/codegen/core/helpers.d.ts +3 -8
  4. package/dist/src/codegen/core/helpers.d.ts.map +1 -1
  5. package/dist/src/codegen/core/helpers.js +28 -44
  6. package/dist/src/codegen/core/helpers.js.map +1 -1
  7. package/dist/src/codegen/core/imports.d.ts.map +1 -1
  8. package/dist/src/codegen/core/imports.js +3 -0
  9. package/dist/src/codegen/core/imports.js.map +1 -1
  10. package/dist/src/codegen/core/models.js +98 -96
  11. package/dist/src/codegen/core/models.js.map +1 -1
  12. package/dist/src/codegen/core/operations.js +4 -4
  13. package/dist/src/codegen/core/operations.js.map +1 -1
  14. package/dist/src/codegen/core/options.js +1 -5
  15. package/dist/src/codegen/core/options.js.map +1 -1
  16. package/dist/src/codegen/core/request-handler.d.ts.map +1 -1
  17. package/dist/src/codegen/core/request-handler.js +19 -15
  18. package/dist/src/codegen/core/request-handler.js.map +1 -1
  19. package/dist/src/codegen/core/response-handler.js +12 -10
  20. package/dist/src/codegen/core/response-handler.js.map +1 -1
  21. package/dist/src/codegen/core/responses.js +2 -10
  22. package/dist/src/codegen/core/responses.js.map +1 -1
  23. package/dist/src/codegen/core/unions.js +21 -16
  24. package/dist/src/codegen/core/unions.js.map +1 -1
  25. package/dist/src/codegen/fake/servers.js +81 -68
  26. package/dist/src/codegen/fake/servers.js.map +1 -1
  27. package/dist/src/codemodel/client.js +1 -1
  28. package/dist/src/codemodel/client.js.map +1 -1
  29. package/dist/src/codemodel/method.d.ts +1 -3
  30. package/dist/src/codemodel/method.d.ts.map +1 -1
  31. package/dist/src/codemodel/method.js +1 -2
  32. package/dist/src/codemodel/method.js.map +1 -1
  33. package/dist/src/codemodel/param.d.ts +40 -26
  34. package/dist/src/codemodel/param.d.ts.map +1 -1
  35. package/dist/src/codemodel/param.js +33 -33
  36. package/dist/src/codemodel/param.js.map +1 -1
  37. package/dist/src/codemodel/result.d.ts +11 -9
  38. package/dist/src/codemodel/result.d.ts.map +1 -1
  39. package/dist/src/codemodel/result.js +2 -4
  40. package/dist/src/codemodel/result.js.map +1 -1
  41. package/dist/src/codemodel/type.d.ts +62 -27
  42. package/dist/src/codemodel/type.d.ts.map +1 -1
  43. package/dist/src/codemodel/type.js +53 -21
  44. package/dist/src/codemodel/type.js.map +1 -1
  45. package/dist/src/tcgcadapter/clients.d.ts.map +1 -1
  46. package/dist/src/tcgcadapter/clients.js +41 -44
  47. package/dist/src/tcgcadapter/clients.js.map +1 -1
  48. package/dist/src/tcgcadapter/helpers.d.ts +2 -8
  49. package/dist/src/tcgcadapter/helpers.d.ts.map +1 -1
  50. package/dist/src/tcgcadapter/helpers.js +20 -18
  51. package/dist/src/tcgcadapter/helpers.js.map +1 -1
  52. package/dist/src/tcgcadapter/types.d.ts +5 -3
  53. package/dist/src/tcgcadapter/types.d.ts.map +1 -1
  54. package/dist/src/tcgcadapter/types.js +73 -27
  55. package/dist/src/tcgcadapter/types.js.map +1 -1
  56. package/package.json +23 -23
@@ -333,21 +333,22 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
333
333
  const modelDefs = new Array();
334
334
  for (const model of models) {
335
335
  for (const field of model.fields) {
336
+ const fieldType = go.unwrapPtr(field.type);
336
337
  const descriptionMods = new Array();
337
338
  if (field.annotations.readOnly) {
338
339
  descriptionMods.push("READ-ONLY");
339
340
  }
340
341
  else if (field.annotations.required &&
341
- (field.type.kind !== "literal" || model.usage === go.UsageFlags.Output)) {
342
+ (fieldType.kind !== "literal" || model.usage === go.UsageFlags.Output)) {
342
343
  descriptionMods.push("REQUIRED");
343
344
  }
344
- else if (field.type.kind === "literal") {
345
+ else if (fieldType.kind === "literal") {
345
346
  if (!field.annotations.required) {
346
347
  descriptionMods.push("FLAG");
347
348
  }
348
349
  descriptionMods.push("CONSTANT");
349
350
  }
350
- if (field.type.kind === "literal" && model.usage !== go.UsageFlags.Output) {
351
+ if (fieldType.kind === "literal" && model.usage !== go.UsageFlags.Output) {
351
352
  // add a comment with the const value for const properties that are sent over the wire
352
353
  if (field.docs.description) {
353
354
  field.docs.description += "\n";
@@ -355,9 +356,9 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
355
356
  else {
356
357
  field.docs.description = "";
357
358
  }
358
- field.docs.description += `Field has constant value ${helpers.formatLiteralValue(field.type, false)}, any specified value is ignored.`;
359
+ field.docs.description += `Field has constant value ${helpers.formatLiteralValue(fieldType, false)}, any specified value is ignored.`;
359
360
  }
360
- else if (field.type.kind === "rawJSON") {
361
+ else if (fieldType.kind === "rawJSON") {
361
362
  // raw JSON is emitted as []byte, so document that the field contains raw
362
363
  // JSON and that the caller is responsible for marshaling their data structure.
363
364
  if (field.docs.description) {
@@ -392,15 +393,16 @@ function generateModelDefs(modelImports, serdeImports, pkg, options, indent) {
392
393
  let needsDateTimeMarshalling = false;
393
394
  let byteArrayFormat = false;
394
395
  for (const field of model.fields) {
395
- if (field.type.kind !== "etag") {
396
+ const fieldType = go.unwrapPtr(field.type);
397
+ if (fieldType.kind !== "etag") {
396
398
  // azcore.ETag un/marshals on its own so no need to
397
399
  // import azcore as we don't explicitly reference the type
398
- serdeImports.addForType(field.type);
400
+ serdeImports.addForType(fieldType);
399
401
  }
400
- if (field.type.kind === "time") {
402
+ if (fieldType.kind === "time") {
401
403
  needsDateTimeMarshalling = true;
402
404
  }
403
- else if (field.type.kind === "encodedBytes") {
405
+ else if (fieldType.kind === "encodedBytes") {
404
406
  byteArrayFormat = true;
405
407
  }
406
408
  }
@@ -497,15 +499,12 @@ function generateToMultipartForm(modelDef, indent) {
497
499
  let method = `func (${receiver} ${modelDef.Model.name}) toMultipartFormData() (map[string]any, error) {\n`;
498
500
  method += `${indent.get()}objectMap := make(map[string]any)\n`;
499
501
  for (const field of modelDef.Model.fields) {
500
- const fieldType = helpers.recursiveUnwrapMapSlice(field.type);
501
- let star = "";
502
- if (!field.byValue) {
503
- star = "*";
504
- }
505
- if (!field.byValue) {
502
+ const star = helpers.deref(field.type);
503
+ if (field.type.kind === "ptr") {
506
504
  method += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
507
505
  indent.push();
508
506
  }
507
+ const fieldType = helpers.recursiveUnwrapMapSlice(field.type);
509
508
  if (fieldType.kind === "model" && !fieldType.annotations.multipartFormData) {
510
509
  method += `${indent.get()}if err := populateMultipartJSON(objectMap, "${field.serializedName}", ${star}${receiver}.${field.name}); err != nil {\n`;
511
510
  method += `${indent.push().get()}return nil, err\n`;
@@ -514,7 +513,7 @@ function generateToMultipartForm(modelDef, indent) {
514
513
  else {
515
514
  method += `${indent.get()}objectMap["${field.serializedName}"] = ${star}${receiver}.${field.name}\n`;
516
515
  }
517
- if (!field.byValue) {
516
+ if (field.type.kind === "ptr") {
518
517
  indent.pop();
519
518
  method += `${indent.get()}}\n`;
520
519
  }
@@ -571,6 +570,10 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
571
570
  addlProps = field.type;
572
571
  continue;
573
572
  }
573
+ // pointer-ness is captured in the code model, so dispatch on the unwrapped
574
+ // type and read isPtr to decide pointer-to-type emission.
575
+ const fieldType = go.unwrapPtr(field.type);
576
+ const deref = helpers.deref(field.type);
574
577
  if (field.annotations.isDiscriminator) {
575
578
  if (field.defaultValue) {
576
579
  marshaller += `${indent.get()}objectMap["${field.serializedName}"] = ${helpers.formatLiteralValue(field.defaultValue, true)}\n`;
@@ -581,31 +584,28 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
581
584
  marshaller += `${indent.get()}objectMap["${field.serializedName}"] = ${receiver}.${field.name}\n`;
582
585
  }
583
586
  }
584
- else if (field.type.kind === "encodedBytes") {
587
+ else if (fieldType.kind === "encodedBytes") {
585
588
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
586
589
  marshaller += `${indent.get()}populateByteArray(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() any {\n`;
587
- marshaller += `${indent.push().get()}return runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
590
+ marshaller += `${indent.push().get()}return runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${fieldType.encoding}Format)\n`;
588
591
  marshaller += `${indent.pop().get()}})\n`;
589
592
  modelDef.SerDe.needsJSONPopulateByteArray = true;
590
593
  }
591
- else if (go.isSlice(field.type, "encodedBytes")) {
594
+ else if (go.isSlice(fieldType, "encodedBytes")) {
592
595
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
593
596
  marshaller += `${indent.get()}populateByteArray(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() any {\n`;
594
597
  marshaller += `${indent.push().get()}encodedValue := make([]string, len(${receiver}.${field.name}))\n`;
595
598
  marshaller += `${indent.get()}for i := 0; i < len(${receiver}.${field.name}); i++ {\n`;
596
- marshaller += `${indent.push().get()}encodedValue[i] = runtime.EncodeByteArray(${receiver}.${field.name}[i], runtime.Base64${field.type.elementType.encoding}Format)\n`;
599
+ marshaller += `${indent.push().get()}encodedValue[i] = runtime.EncodeByteArray(${receiver}.${field.name}[i], runtime.Base64${fieldType.elementType.encoding}Format)\n`;
597
600
  marshaller += `${indent.pop().get()}}\n`;
598
601
  marshaller += `${indent.get()}return encodedValue\n`;
599
602
  marshaller += `${indent.pop().get()}})\n`;
600
603
  modelDef.SerDe.needsJSONPopulateByteArray = true;
601
604
  }
602
- else if (go.isSlice(field.type, "time")) {
605
+ else if (go.isSlice(fieldType, "time")) {
603
606
  const source = `${receiver}.${field.name}`;
604
- const elementType = field.type.elementType;
605
- let elementPtr = "*";
606
- if (field.type.elementTypeByValue) {
607
- elementPtr = "";
608
- }
607
+ const elementType = go.unwrapPtr(fieldType.elementType);
608
+ const elementPtr = helpers.deref(fieldType.elementType);
609
609
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
610
610
  marshaller += `${indent.get()}aux := make([]${elementPtr}datetime.${elementType.format}, len(${source}), len(${source}))\n`;
611
611
  marshaller += `${indent.get()}for i := 0; i < len(${source}); i++ {\n`;
@@ -626,8 +626,8 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
626
626
  marshaller += `${indent.get()}populate(objectMap, "${field.serializedName}", aux)\n`;
627
627
  modelDef.SerDe.needsJSONPopulate = true;
628
628
  }
629
- else if (field.type.kind === "literal") {
630
- const setter = `objectMap["${field.serializedName}"] = ${helpers.formatLiteralValue(field.type, true)}`;
629
+ else if (fieldType.kind === "literal") {
630
+ const setter = `objectMap["${field.serializedName}"] = ${helpers.formatLiteralValue(fieldType, true)}`;
631
631
  if (!field.annotations.required) {
632
632
  marshaller += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
633
633
  marshaller += `${indent.push().get()}${setter}\n`;
@@ -637,7 +637,7 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
637
637
  marshaller += `${indent.get()}${setter}\n`;
638
638
  }
639
639
  }
640
- else if (field.type.kind === "rawJSON") {
640
+ else if (fieldType.kind === "rawJSON") {
641
641
  marshaller += `${indent.get()}populate(objectMap, "${field.serializedName}", json.RawMessage(${receiver}.${field.name}))\n`;
642
642
  modelDef.SerDe.needsJSONPopulate = true;
643
643
  }
@@ -648,24 +648,24 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
648
648
  marshaller += `${indent.push().get()}${receiver}.${field.name} = to.Ptr(${helpers.formatLiteralValue(field.defaultValue, true)})\n`;
649
649
  marshaller += `${indent.pop().get()}}\n`;
650
650
  }
651
- if (go.isScalar(field.type, "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64") &&
652
- field.type.encodeAsString) {
651
+ if (go.isScalar(fieldType, "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64") &&
652
+ fieldType.encodeAsString) {
653
653
  imports.add("strconv");
654
654
  marshaller += `${indent.get()}populateAsString(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() string {\n`;
655
- const isSigned = field.type.type.startsWith("int");
656
- let fieldExpr = `*${receiver}.${field.name}`;
657
- if ((field.type.type.startsWith("uint") && field.type.type !== "uint64") ||
658
- (field.type.type.startsWith("int") && field.type.type !== "int64")) {
655
+ const isSigned = fieldType.type.startsWith("int");
656
+ let fieldExpr = `${deref}${receiver}.${field.name}`;
657
+ if ((fieldType.type.startsWith("uint") && fieldType.type !== "uint64") ||
658
+ (fieldType.type.startsWith("int") && fieldType.type !== "int64")) {
659
659
  fieldExpr = `${isSigned ? "int64" : "uint64"}(${fieldExpr})`;
660
660
  }
661
661
  marshaller += `${indent.push().get()}return strconv.${isSigned ? "FormatInt" : "FormatUint"}(${fieldExpr}, 10)\n`;
662
662
  marshaller += `${indent.pop().get()}})\n`;
663
663
  modelDef.SerDe.needsJSONPopulateAsString = true;
664
664
  }
665
- else if (go.isScalar(field.type, "bool") && field.type.encodeAsString) {
665
+ else if (go.isScalar(fieldType, "bool") && fieldType.encodeAsString) {
666
666
  imports.add("strconv");
667
667
  marshaller += `${indent.get()}populateAsString(objectMap, "${field.serializedName}", ${receiver}.${field.name}, func() string {\n`;
668
- marshaller += `${indent.push().get()}return strconv.FormatBool(*${receiver}.${field.name})\n`;
668
+ marshaller += `${indent.push().get()}return strconv.FormatBool(${deref}${receiver}.${field.name})\n`;
669
669
  marshaller += `${indent.pop().get()}})\n`;
670
670
  modelDef.SerDe.needsJSONPopulateAsString = true;
671
671
  }
@@ -673,19 +673,19 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
673
673
  let populate;
674
674
  // some helpers require extra args after the common ones
675
675
  let populateArgs = "";
676
- if (field.type.kind === "time") {
676
+ if (fieldType.kind === "time") {
677
677
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
678
- populate = `populateTime[datetime.${field.type.format}]`;
679
- populateArgs = `, ${field.type.utc}`;
678
+ populate = `populateTime[datetime.${fieldType.format}]`;
679
+ populateArgs = `, ${fieldType.utc}`;
680
680
  modelDef.SerDe.needsJSONPopulateTime = true;
681
681
  }
682
- else if (field.type.kind === "any") {
682
+ else if (fieldType.kind === "any") {
683
683
  populate = "populateAny";
684
684
  modelDef.SerDe.needsJSONPopulateAny = true;
685
685
  }
686
- else if (field.type.kind === "sliceArray") {
686
+ else if (fieldType.kind === "sliceArray") {
687
687
  populate = "populateStringArray";
688
- populateArgs = `, "${getSliceArrayDelimiter(field.type.delimiter)}"`;
688
+ populateArgs = `, "${getSliceArrayDelimiter(fieldType.delimiter)}"`;
689
689
  modelDef.SerDe.needsJSONPopulateStringArray = true;
690
690
  }
691
691
  else {
@@ -699,20 +699,20 @@ function generateJSONMarshallerBody(modelDef, receiver, imports, indent) {
699
699
  if (addlProps) {
700
700
  marshaller += `${indent.get()}if ${receiver}.AdditionalProperties != nil {\n`;
701
701
  marshaller += `${indent.push().get()}for key, val := range ${receiver}.AdditionalProperties {\n`;
702
- if (addlProps.valueType.kind === "time" && addlProps.valueType.utc) {
702
+ if (go.isPtr(addlProps.valueType, "time") && addlProps.valueType.ptrType.utc) {
703
703
  // normalize utc datetimes before casting the (pointer) map value
704
704
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
705
705
  marshaller += `${indent.push().get()}if val != nil {\n`;
706
706
  marshaller += `${indent.push().get()}utcTime := val.UTC()\n`;
707
- marshaller += `${indent.get()}objectMap[key] = (*datetime.${addlProps.valueType.format})(&utcTime)\n`;
707
+ marshaller += `${indent.get()}objectMap[key] = (*datetime.${addlProps.valueType.ptrType.format})(&utcTime)\n`;
708
708
  marshaller += `${indent.pop().get()}} else {\n`;
709
709
  marshaller += `${indent.push().get()}objectMap[key] = nil\n`;
710
710
  marshaller += `${indent.pop().get()}}\n`;
711
711
  }
712
712
  else {
713
713
  let assignment = "val";
714
- if (addlProps.valueType.kind === "time") {
715
- assignment = `(*${addlProps.valueType.format})(val)`;
714
+ if (go.isPtr(addlProps.valueType, "time")) {
715
+ assignment = `(*${addlProps.valueType.ptrType.format})(val)`;
716
716
  }
717
717
  marshaller += `${indent.push().get()}objectMap[key] = ${assignment}\n`;
718
718
  }
@@ -772,18 +772,15 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
772
772
  const emitAddlProps = function (addlProps) {
773
773
  // indent is at the case body level when called
774
774
  let addlPropsText = `${indent.get()}if ${receiver}.AdditionalProperties == nil {\n`;
775
- let ref = "";
776
- if (!addlProps.valueTypeByValue) {
777
- ref = "&";
778
- }
775
+ const ref = addlProps.valueType.kind === "ptr" ? "&" : "";
779
776
  addlPropsText += `${indent.push().get()}${receiver}.AdditionalProperties = ${go.getTypeDeclaration(addlProps, modelDef.Model.pkg)}{}\n`;
780
777
  addlPropsText += `${indent.pop().get()}}\n`;
781
778
  addlPropsText += `${indent.get()}if val != nil {\n`;
782
- let auxType = go.getTypeDeclaration(addlProps.valueType, modelDef.Model.pkg);
779
+ let auxType = go.getTypeDeclaration(go.unwrapPtr(addlProps.valueType), modelDef.Model.pkg);
783
780
  let assignment = `${ref}aux`;
784
- if (addlProps.valueType.kind === "time") {
781
+ if (go.isPtr(addlProps.valueType, "time")) {
785
782
  imports.add("time");
786
- auxType = addlProps.valueType.format;
783
+ auxType = addlProps.valueType.ptrType.format;
787
784
  assignment = `(*time.Time)(${assignment})`;
788
785
  }
789
786
  addlPropsText += `${indent.push().get()}var aux ${auxType}\n`;
@@ -804,30 +801,30 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
804
801
  addlProps = field.type;
805
802
  continue;
806
803
  }
804
+ // dispatch on the unwrapped type; pointer-ness is captured in the code model.
805
+ const fieldType = go.unwrapPtr(field.type);
807
806
  unmarshalBody += `${indent.get()}case "${field.serializedName}":\n`;
808
807
  indent.push(); // case body level
809
- if (hasDiscriminatorInterface(field.type)) {
808
+ if (hasDiscriminatorInterface(fieldType)) {
810
809
  unmarshalBody += generateDiscriminatorUnmarshaller(modelDef.Model, field, receiver, indent);
811
810
  needsErrCheck = true;
812
811
  }
813
- else if (field.type.kind === "sliceArray") {
814
- unmarshalBody += `${indent.get()}err = unpopulateStringArray(val, "${field.name}", &${receiver}.${field.name}, "${getSliceArrayDelimiter(field.type.delimiter)}")\n`;
812
+ else if (fieldType.kind === "sliceArray") {
813
+ unmarshalBody += `${indent.get()}err = unpopulateStringArray(val, "${field.name}", &${receiver}.${field.name}, "${getSliceArrayDelimiter(fieldType.delimiter)}")\n`;
815
814
  modelDef.SerDe.needsJSONUnpopulateStringArray = true;
816
815
  needsErrCheck = true;
817
816
  }
818
- else if (field.type.kind === "time") {
819
- unmarshalBody += `${indent.get()}err = unpopulateTime[datetime.${field.type.format}](val, "${field.name}", &${receiver}.${field.name})\n`;
817
+ else if (fieldType.kind === "time") {
818
+ unmarshalBody += `${indent.get()}err = unpopulateTime[datetime.${fieldType.format}](val, "${field.name}", &${receiver}.${field.name})\n`;
820
819
  modelDef.SerDe.needsJSONUnpopulateTime = true;
821
820
  needsErrCheck = true;
822
821
  }
823
- else if (go.isSlice(field.type, "time")) {
822
+ else if (go.isSlice(fieldType, "time")) {
824
823
  imports.add("time");
825
824
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
826
- let elementPtr = "*";
827
- if (field.type.elementTypeByValue) {
828
- elementPtr = "";
829
- }
830
- unmarshalBody += `${indent.get()}var aux []${elementPtr}datetime.${field.type.elementType.format}\n`;
825
+ const elementType = go.unwrapPtr(fieldType.elementType);
826
+ const elementPtr = helpers.deref(fieldType.elementType);
827
+ unmarshalBody += `${indent.get()}var aux []${elementPtr}datetime.${elementType.format}\n`;
831
828
  unmarshalBody += `${indent.get()}err = unpopulate(val, "${field.name}", &aux)\n`;
832
829
  unmarshalBody += `${indent.get()}for _, au := range aux {\n`;
833
830
  unmarshalBody += `${indent.push().get()}${receiver}.${field.name} = append(${receiver}.${field.name}, (${elementPtr}time.Time)(au))\n`;
@@ -835,14 +832,14 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
835
832
  modelDef.SerDe.needsJSONUnpopulate = true;
836
833
  needsErrCheck = true;
837
834
  }
838
- else if (field.type.kind === "encodedBytes") {
835
+ else if (fieldType.kind === "encodedBytes") {
839
836
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
840
837
  unmarshalBody += `${indent.get()}if val != nil && string(val) != "null" {\n`;
841
- unmarshalBody += `${indent.push().get()}err = runtime.DecodeByteArray(string(val), &${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
838
+ unmarshalBody += `${indent.push().get()}err = runtime.DecodeByteArray(string(val), &${receiver}.${field.name}, runtime.Base64${fieldType.encoding}Format)\n`;
842
839
  unmarshalBody += `${indent.pop().get()}}\n`;
843
840
  needsErrCheck = true;
844
841
  }
845
- else if (go.isSlice(field.type, "encodedBytes")) {
842
+ else if (go.isSlice(fieldType, "encodedBytes")) {
846
843
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
847
844
  unmarshalBody += `${indent.get()}var encodedValue []string\n`;
848
845
  unmarshalBody += `${indent.get()}err = unpopulate(val, "${field.name}", &encodedValue)\n`;
@@ -850,19 +847,19 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
850
847
  indent.push();
851
848
  unmarshalBody += `${indent.get()}${receiver}.${field.name} = make([][]byte, len(encodedValue))\n`;
852
849
  unmarshalBody += `${indent.get()}for i := 0; i < len(encodedValue) && err == nil; i++ {\n`;
853
- unmarshalBody += `${indent.push().get()}err = runtime.DecodeByteArray(encodedValue[i], &${receiver}.${field.name}[i], runtime.Base64${field.type.elementType.encoding}Format)\n`;
850
+ unmarshalBody += `${indent.push().get()}err = runtime.DecodeByteArray(encodedValue[i], &${receiver}.${field.name}[i], runtime.Base64${fieldType.elementType.encoding}Format)\n`;
854
851
  unmarshalBody += `${indent.pop().get()}}\n`;
855
852
  indent.pop();
856
853
  unmarshalBody += `${indent.get()}}\n`;
857
854
  modelDef.SerDe.needsJSONUnpopulate = true;
858
855
  needsErrCheck = true;
859
856
  }
860
- else if (field.type.kind === "rawJSON") {
857
+ else if (fieldType.kind === "rawJSON") {
861
858
  unmarshalBody += `${indent.get()}if string(val) != "null" {\n`;
862
859
  unmarshalBody += `${indent.push().get()}${receiver}.${field.name} = val\n`;
863
860
  unmarshalBody += `${indent.pop().get()}}\n`;
864
861
  }
865
- else if (go.isScalar(field.type, "bool") && field.type.encodeAsString) {
862
+ else if (go.isScalar(fieldType, "bool") && fieldType.encodeAsString) {
866
863
  imports.add("strconv");
867
864
  imports.add("strings");
868
865
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
@@ -877,13 +874,13 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
877
874
  modelDef.SerDe.needsJSONUnpopulateFromString = true;
878
875
  needsErrCheck = true;
879
876
  }
880
- else if (go.isScalar(field.type, "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64") &&
881
- field.type.encodeAsString) {
882
- const scalarType = field.type.type;
877
+ else if (go.isScalar(fieldType, "uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64") &&
878
+ fieldType.encodeAsString) {
879
+ const scalarType = fieldType.type;
883
880
  imports.add("strconv");
884
881
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/to");
885
882
  unmarshalBody += `${indent.get()}err = unpopulateFromString(val, "${field.name}", func(encodedValue string) error {\n`;
886
- unmarshalBody += `${indent.push().get()}v, parseErr := strconv.${field.type.type.startsWith("int") ? "ParseInt" : "ParseUint"}(encodedValue, 10, 0)\n`;
883
+ unmarshalBody += `${indent.push().get()}v, parseErr := strconv.${fieldType.type.startsWith("int") ? "ParseInt" : "ParseUint"}(encodedValue, 10, 0)\n`;
887
884
  unmarshalBody += `${indent.get()}${helpers.buildIfBlock(indent, {
888
885
  condition: "parseErr == nil",
889
886
  body: (indent) => {
@@ -902,7 +899,7 @@ function generateJSONUnmarshallerBody(modelDef, receiver, options, imports, inde
902
899
  }
903
900
  else {
904
901
  const unpopulateField = `err = unpopulate(val, "${field.name}", &${receiver}.${field.name})\n`;
905
- if (field.type.kind === "string" && field.annotations.unmarshalEmptyStringAsNil) {
902
+ if (fieldType.kind === "string" && field.annotations.unmarshalEmptyStringAsNil) {
906
903
  unmarshalBody += `${indent.get()}${helpers.buildIfBlock(indent, {
907
904
  condition: `string(val) != \`""\``,
908
905
  body: (indent) => `${indent.get()}${unpopulateField}`,
@@ -1116,19 +1113,20 @@ function generateXMLMarshaller(modelDef, imports, indent) {
1116
1113
  }
1117
1114
  text += generateAliasType(modelDef.Model, receiver, true, imports, indent);
1118
1115
  for (const field of modelDef.Model.fields) {
1119
- if (field.type.kind === "slice") {
1116
+ const fieldType = go.unwrapPtr(field.type);
1117
+ if (fieldType.kind === "slice") {
1120
1118
  text += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
1121
1119
  text += `${indent.push().get()}aux.${field.name} = &${receiver}.${field.name}\n`;
1122
1120
  text += `${indent.pop().get()}}\n`;
1123
1121
  }
1124
- else if (go.isAdditionalProperties(field) || field.type.kind === "map") {
1122
+ else if (go.isAdditionalProperties(field) || fieldType.kind === "map") {
1125
1123
  text += `${indent.get()}aux.${field.name} = (additionalProperties)(${receiver}.${field.name})\n`;
1126
1124
  }
1127
- else if (field.type.kind === "encodedBytes") {
1125
+ else if (fieldType.kind === "encodedBytes") {
1128
1126
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
1129
1127
  text += `${indent.get()}if ${receiver}.${field.name} != nil {\n`;
1130
1128
  indent.push();
1131
- text += `${indent.get()}encoded${field.name} := runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format)\n`;
1129
+ text += `${indent.get()}encoded${field.name} := runtime.EncodeByteArray(${receiver}.${field.name}, runtime.Base64${fieldType.encoding}Format)\n`;
1132
1130
  text += `${indent.get()}aux.${field.name} = &encoded${field.name}\n`;
1133
1131
  indent.pop();
1134
1132
  text += `${indent.get()}}\n`;
@@ -1155,19 +1153,20 @@ function generateXMLUnmarshaller(modelDef, imports, indent) {
1155
1153
  text += `${indent.push().get()}return err\n`;
1156
1154
  text += `${indent.pop().get()}}\n`;
1157
1155
  for (const field of modelDef.Model.fields) {
1158
- if (field.type.kind === "time") {
1156
+ const fieldType = go.unwrapPtr(field.type);
1157
+ if (fieldType.kind === "time") {
1159
1158
  text += `${indent.get()}if aux.${field.name} != nil && !(*time.Time)(aux.${field.name}).IsZero() {\n`;
1160
1159
  text += `${indent.push().get()}${receiver}.${field.name} = (*time.Time)(aux.${field.name})\n`;
1161
1160
  text += `${indent.pop().get()}}\n`;
1162
1161
  }
1163
- else if (go.isAdditionalProperties(field) || field.type.kind === "map") {
1162
+ else if (go.isAdditionalProperties(field) || fieldType.kind === "map") {
1164
1163
  text += `${indent.get()}${receiver}.${field.name} = (map[string]*string)(aux.${field.name})\n`;
1165
1164
  }
1166
- else if (field.type.kind === "encodedBytes") {
1165
+ else if (fieldType.kind === "encodedBytes") {
1167
1166
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime");
1168
1167
  text += `${indent.get()}if aux.${field.name} != nil {\n`;
1169
1168
  indent.push();
1170
- text += `${indent.get()}if err := runtime.DecodeByteArray(*aux.${field.name}, &${receiver}.${field.name}, runtime.Base64${field.type.encoding}Format); err != nil {\n`;
1169
+ text += `${indent.get()}if err := runtime.DecodeByteArray(*aux.${field.name}, &${receiver}.${field.name}, runtime.Base64${fieldType.encoding}Format); err != nil {\n`;
1171
1170
  text += `${indent.push().get()}return err\n`;
1172
1171
  text += `${indent.pop().get()}}\n`;
1173
1172
  indent.pop();
@@ -1191,18 +1190,19 @@ function generateAliasType(modelType, receiver, forMarshal, imports, indent) {
1191
1190
  text += `${indent.get()}aux := &struct {\n`;
1192
1191
  text += `${indent.push().get()}*alias\n`;
1193
1192
  for (const field of modelType.fields) {
1193
+ const fieldType = go.unwrapPtr(field.type);
1194
1194
  const sn = getXMLSerialization(field);
1195
- if (field.type.kind === "time") {
1195
+ if (fieldType.kind === "time") {
1196
1196
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
1197
- text += `${indent.get()}${field.name} *datetime.${field.type.format} \`xml:"${sn}"\`\n`;
1197
+ text += `${indent.get()}${field.name} *datetime.${fieldType.format} \`xml:"${sn}"\`\n`;
1198
1198
  }
1199
- else if (go.isAdditionalProperties(field) || field.type.kind === "map") {
1199
+ else if (go.isAdditionalProperties(field) || fieldType.kind === "map") {
1200
1200
  text += `${indent.get()}${field.name} additionalProperties \`xml:"${sn}"\`\n`;
1201
1201
  }
1202
- else if (field.type.kind === "slice") {
1203
- text += `${indent.get()}${field.name} *${go.getTypeDeclaration(field.type, modelType.pkg)} \`xml:"${sn}"\`\n`;
1202
+ else if (fieldType.kind === "slice") {
1203
+ text += `${indent.get()}${field.name} *${go.getTypeDeclaration(fieldType, modelType.pkg)} \`xml:"${sn}"\`\n`;
1204
1204
  }
1205
- else if (field.type.kind === "encodedBytes") {
1205
+ else if (fieldType.kind === "encodedBytes") {
1206
1206
  text += `${indent.get()}${field.name} *string \`xml:"${sn}"\`\n`;
1207
1207
  }
1208
1208
  }
@@ -1215,11 +1215,12 @@ function generateAliasType(modelType, receiver, forMarshal, imports, indent) {
1215
1215
  if (forMarshal) {
1216
1216
  // emit code to initialize time fields
1217
1217
  for (const field of modelType.fields) {
1218
- if (field.type.kind !== "time") {
1218
+ const fieldType = go.unwrapPtr(field.type);
1219
+ if (fieldType.kind !== "time") {
1219
1220
  continue;
1220
1221
  }
1221
1222
  imports.add("github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/datetime");
1222
- text += `${indent.get()}${field.name}: (*datetime.${field.type.format})(${receiver}.${field.name}),\n`;
1223
+ text += `${indent.get()}${field.name}: (*datetime.${fieldType.format})(${receiver}.${field.name}),\n`;
1223
1224
  }
1224
1225
  }
1225
1226
  text += `${indent.pop().get()}}\n`;
@@ -1296,9 +1297,10 @@ class ModelDef {
1296
1297
  text += helpers.formatDocComment(field.docs);
1297
1298
  }
1298
1299
  let typeName = go.getTypeDeclaration(field.type, this.Model.pkg);
1299
- if (field.type.kind === "literal") {
1300
- // for constants we use the underlying type name
1301
- typeName = go.getLiteralTypeDeclaration(field.type.type);
1300
+ const fieldType = go.unwrapPtr(field.type);
1301
+ if (fieldType.kind === "literal") {
1302
+ // for constants we use the underlying type name; getTypeDeclaration above emits the pointer.
1303
+ typeName = `${helpers.deref(field.type)}${go.getLiteralTypeDeclaration(fieldType.type)}`;
1302
1304
  }
1303
1305
  let serialization = field.serializedName;
1304
1306
  if (this.Format === "JSON") {
@@ -1312,7 +1314,7 @@ class ModelDef {
1312
1314
  if (this.Format === "XML" && !go.isAdditionalProperties(field)) {
1313
1315
  tag = ` \`xml:"${serialization}"\``;
1314
1316
  }
1315
- text += `${indent.get()}${field.name} ${helpers.star(field.byValue)}${typeName}${tag}\n`;
1317
+ text += `${indent.get()}${field.name} ${typeName}${tag}\n`;
1316
1318
  first = false;
1317
1319
  }
1318
1320
  text += "}\n\n";