Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,12 @@ private void configureModelRequiredValidation(CodegenModel model, List<Map<Strin
decodeVarsByBaseName.put(v.baseName, v);
}
List<CodegenProperty> decodeVars = new ArrayList<>(decodeVarsByBaseName.values());
for (CodegenProperty v : decodeVars) {
clearModelFlagForPrimitives(v);
}
for (CodegenProperty v : model.vars) {
clearModelFlagForPrimitives(v);
}
model.vendorExtensions.put("decodeVars", decodeVars);

List<CodegenProperty> presenceCheckRequiredVars = decodeVars.stream()
Expand Down Expand Up @@ -377,6 +383,42 @@ private void configureModelRequiredValidation(CodegenModel model, List<Map<Strin
}
}

/**
* oneOf/anyOf nullable enums often end up as Go {@code *string} while still marked
* {@code isModel=true}, which makes go-server templates emit non-existent Assertstring* helpers.
*/
private void clearModelFlagForPrimitives(CodegenProperty property) {
if (property == null) {
return;
}
if (isGoPrimitiveProperty(property)) {
property.isModel = false;
property.isPrimitiveType = true;
}
clearModelFlagForPrimitives(property.items);
clearModelFlagForPrimitives(property.mostInnerItems);
}

private boolean isGoPrimitiveProperty(CodegenProperty property) {
if (property.isPrimitiveType || property.isString || property.isNumber || property.isInteger
|| property.isLong || property.isBoolean || property.isFloat || property.isDouble
|| property.isByteArray || property.isBinary || property.isFile
|| property.isDate || property.isDateTime || property.isUuid) {
return true;
}
if (languageSpecificPrimitives().contains(property.baseType)) {
return true;
}
String dataType = property.dataType;
if (dataType == null) {
return false;
}
if (dataType.startsWith("*")) {
dataType = dataType.substring(1);
}
return languageSpecificPrimitives().contains(dataType);
}

@Override
public ModelsMap postProcessModels(ModelsMap objs) {
// The superclass determines the list of required golang imports. The actual list of imports
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,17 +117,21 @@ func Assert{{classname}}Required(obj {{classname}}) error {
{{/isArray}}
{{/isNullable}}
{{#isModel}}
{{^isPrimitiveType}}
{{#isNullable}} {{/isNullable}} if err := Assert{{baseType}}Required({{#isNullable}}*{{/isNullable}}obj.{{name}}); err != nil {
{{#isNullable}} {{/isNullable}} return err
{{#isNullable}} {{/isNullable}} }
{{/isPrimitiveType}}
{{/isModel}}
{{#isArray}}
{{#items.isModel}}
{{^items.isPrimitiveType}}
{{#isNullable}} {{/isNullable}} for _, el := range {{#isNullable}}*{{/isNullable}}obj.{{name}} {
{{#isNullable}} {{/isNullable}} if err := Assert{{items.baseType}}Required(el); err != nil {
{{#isNullable}} {{/isNullable}} return err
{{#isNullable}} {{/isNullable}} }
{{#isNullable}} {{/isNullable}} }
{{/items.isPrimitiveType}}
{{/items.isModel}}
{{^items.isModel}}
{{#mostInnerItems.isModel}}
Expand Down Expand Up @@ -186,17 +190,21 @@ func Assert{{classname}}Constraints(obj {{classname}}) error {
{{/isArray}}
{{/isNullable}}
{{#isModel}}
{{^isPrimitiveType}}
{{#isNullable}} {{/isNullable}} if err := Assert{{baseType}}Constraints({{#isNullable}}*{{/isNullable}}obj.{{name}}); err != nil {
{{#isNullable}} {{/isNullable}} return err
{{#isNullable}} {{/isNullable}} }
{{/isPrimitiveType}}
{{/isModel}}
{{#isArray}}
{{#items.isModel}}
{{^items.isPrimitiveType}}
{{#isNullable}} {{/isNullable}} for _, el := range {{#isNullable}}*{{/isNullable}}obj.{{name}} {
{{#isNullable}} {{/isNullable}} if err := Assert{{items.baseType}}Constraints(el); err != nil {
{{#isNullable}} {{/isNullable}} return err
{{#isNullable}} {{/isNullable}} }
{{#isNullable}} {{/isNullable}} }
{{/items.isPrimitiveType}}
{{/items.isModel}}
{{^items.isModel}}
{{#mostInnerItems.isModel}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,4 +272,23 @@ public void verifyReadOnlyRequiredFieldsNotEnforced() throws IOException {
"if err := AssertMetaRequired(obj.Meta); err != nil {");
}

@Test
public void verifyNoAssertstringRequiredForPrimitiveTypedModels() throws IOException {
File output = Files.createTempDirectory("test").toFile();
output.deleteOnExit();

final CodegenConfigurator configurator = createDefaultCodegenConfigurator(output)
.setInputSpec("src/test/resources/3_0/go-server/assert-primitive-model.yaml");

DefaultGenerator generator = new DefaultGenerator();
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
files.forEach(File::deleteOnExit);

java.nio.file.Path modelPath = Paths.get(output + "/go/model_thing.go");
TestUtils.assertFileExists(modelPath);
TestUtils.assertFileNotContains(modelPath, "AssertstringRequired");
TestUtils.assertFileNotContains(modelPath, "AssertstringConstraints");
TestUtils.assertFileContains(modelPath, "func AssertThingRequired(obj Thing) error {\n\treturn nil");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
openapi: 3.0.1
info:
version: 1.0.0
title: composed nullable enum must not emit primitive Assert helpers
paths:
/thing:
post:
operationId: createThing
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Thing'
responses:
'201':
description: created
components:
schemas:
Mode:
type: string
enum: [On, Off]
Thing:
type: object
properties:
mode:
nullable: true
oneOf:
- $ref: '#/components/schemas/Mode'
- enum: [null]
tags:
type: array
items:
$ref: '#/components/schemas/Mode'
nullable: true
Loading