forked from loafle/openapi-generator-original
[abstract-csharp] Make data types overridable (#15814)
* added new vendor extenion * moved code to methods to enable overriding * fixed tests * renamed method to setTypeMapping * removed commented code * moved code to make diff easier to understand * removed commented code
This commit is contained in:
@@ -95,11 +95,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
protected Boolean zeroBasedEnums = null;
|
||||
protected static final String zeroBasedEnumVendorExtension = "x-zero-based-enum";
|
||||
|
||||
// nullable type
|
||||
protected Set<String> nullableType = new HashSet<>();
|
||||
|
||||
protected Set<String> valueTypes = new HashSet<>();
|
||||
|
||||
private final Logger LOGGER = LoggerFactory.getLogger(AbstractCSharpCodegen.class);
|
||||
|
||||
// special property keywords not allowed as these are the function names in the model files
|
||||
@@ -201,42 +196,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
instantiationTypes.put("list", "List");
|
||||
instantiationTypes.put("map", "Dictionary");
|
||||
|
||||
|
||||
// Nullable types here assume C# 2 support is not part of base
|
||||
typeMapping = new HashMap<>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool?");
|
||||
typeMapping.put("integer", "int?");
|
||||
typeMapping.put("UnsignedInteger", "uint?");
|
||||
typeMapping.put("UnsignedLong", "ulong?");
|
||||
typeMapping.put("long", "long?");
|
||||
typeMapping.put("float", "float?");
|
||||
typeMapping.put("double", "double?");
|
||||
typeMapping.put("number", "decimal?");
|
||||
typeMapping.put("BigDecimal", "decimal?");
|
||||
typeMapping.put("DateTime", "DateTime?");
|
||||
typeMapping.put("date", "DateTime?");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid?");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
|
||||
// nullable type
|
||||
nullableType = new HashSet<>(
|
||||
Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
|
||||
"DateTime", "DateTimeOffset", "Guid")
|
||||
);
|
||||
// value Types
|
||||
valueTypes = new HashSet<>(
|
||||
Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double")
|
||||
);
|
||||
|
||||
this.setSortParamsByRequiredFlag(true);
|
||||
|
||||
// do it only on newer libraries to avoid breaking changes
|
||||
@@ -449,6 +408,8 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
writer.write(content);
|
||||
}
|
||||
});
|
||||
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -578,13 +539,13 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
property.isPrimitiveType = true;
|
||||
}
|
||||
|
||||
if (!property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
|
||||
if (!property.isContainer && (this.getNullableTypes().contains(property.dataType) || property.isEnum)) {
|
||||
property.vendorExtensions.put("x-csharp-value-type", true);
|
||||
}
|
||||
|
||||
property.vendorExtensions.put("x-is-value-type", isValueType(property));
|
||||
|
||||
if (property.isNullable && !property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
|
||||
if (property.isNullable && !property.isContainer && (this.getNullableTypes().contains(property.dataType) || property.isEnum)) {
|
||||
property.vendorExtensions.put("x-nullable-value-type", true);
|
||||
}
|
||||
|
||||
@@ -851,7 +812,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
private void patchParameter(CodegenParameter parameter) {
|
||||
parameter.paramName = escapeReservedWord(parameter.paramName);
|
||||
|
||||
if (parameter.isNullable && !parameter.isContainer && (nullableType.contains(parameter.dataType) || parameter.isEnum)) {
|
||||
if (parameter.isNullable && !parameter.isContainer && (this.getNullableTypes().contains(parameter.dataType) || parameter.isEnum)) {
|
||||
parameter.vendorExtensions.put("x-nullable-value-type", true);
|
||||
}
|
||||
|
||||
@@ -865,7 +826,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
}
|
||||
|
||||
// TODO: move this into patchParamter
|
||||
private void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
for (CodegenParameter parameter : parameters) {
|
||||
CodegenModel model = null;
|
||||
for (ModelMap modelHashMap : allModels) {
|
||||
@@ -886,13 +847,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
}
|
||||
}
|
||||
|
||||
if (!parameter.isContainer && nullableType.contains(parameter.dataType)) {
|
||||
if (!parameter.isContainer && this.getNullableTypes().contains(parameter.dataType)) {
|
||||
parameter.vendorExtensions.put("x-csharp-value-type", true);
|
||||
}
|
||||
|
||||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1380,7 +1337,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
*/
|
||||
|
||||
protected boolean isValueType(CodegenProperty var) {
|
||||
return (valueTypes.contains(var.dataType) || var.isEnum);
|
||||
return (this.getValueTypes().contains(var.dataType) || var.isEnum);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1511,19 +1468,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
p.example = example;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessParameter(CodegenParameter parameter) {
|
||||
super.postProcessParameter(parameter);
|
||||
|
||||
// TODO: instead of appending the ?
|
||||
// use isNullable, OptionalParameterLambda, or RequiredParameterLambda
|
||||
if (!parameter.required && (nullReferenceTypesFlag || nullableType.contains(parameter.dataType))) {
|
||||
parameter.dataType = parameter.dataType.endsWith("?")
|
||||
? parameter.dataType
|
||||
: parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessFile(File file, String fileType) {
|
||||
if (file == null) {
|
||||
@@ -1577,4 +1521,38 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
|
||||
return pattern;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected Set<String> getNullableTypes() {
|
||||
throw new RuntimeException("This method should no longer be used.");
|
||||
}
|
||||
|
||||
protected Set<String> getValueTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double", "DateTime", "DateTimeOffset", "Guid"));
|
||||
}
|
||||
|
||||
protected void setTypeMapping() {
|
||||
typeMapping = new HashMap<>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("UnsignedInteger", "uint");
|
||||
typeMapping.put("UnsignedLong", "ulong");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("BigDecimal", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,11 +33,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
import static java.util.UUID.randomUUID;
|
||||
|
||||
@@ -136,17 +132,6 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
cliOptions.clear();
|
||||
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
|
||||
setSupportNullable(Boolean.TRUE);
|
||||
|
||||
// CLI options
|
||||
@@ -310,11 +295,58 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
|
||||
addOption(modelClassModifier.getOpt(), modelClassModifier.getDescription(), modelClassModifier.getOptValue());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
protected Set<String> getNullableTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
|
||||
"DateTime", "DateTimeOffset", "Guid"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Set<String> getValueTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodegenType getTag() {
|
||||
return CodegenType.SERVER;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setTypeMapping() {
|
||||
super.setTypeMapping();
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessParameter(CodegenParameter parameter) {
|
||||
super.postProcessParameter(parameter);
|
||||
|
||||
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
super.updateCodegenParametersEnum(parameters, allModels);
|
||||
|
||||
for (CodegenParameter parameter : parameters) {
|
||||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "aspnetcore";
|
||||
@@ -443,6 +475,8 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
supportingFiles.add(new SupportingFile("Authentication" + File.separator + "ApiAuthentication.mustache", packageFolder + File.separator + "Authentication", "ApiAuthentication.cs"));
|
||||
supportingFiles.add(new SupportingFile("Formatters" + File.separator + "InputFormatterStream.mustache", packageFolder + File.separator + "Formatters", "InputFormatterStream.cs"));
|
||||
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
public void setPackageGuid(String packageGuid) {
|
||||
@@ -562,7 +596,7 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
|
||||
@Override
|
||||
public String getNullableType(Schema p, String type) {
|
||||
if (languageSpecificPrimitives.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && (nullableType.contains(type) || nullReferenceTypesFlag)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && (this.getNullableTypes().contains(type) || nullReferenceTypesFlag)) {
|
||||
return type + "?";
|
||||
} else {
|
||||
return type;
|
||||
|
||||
@@ -157,31 +157,6 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
)
|
||||
);
|
||||
|
||||
// mapped non-nullable type without ?
|
||||
typeMapping = new HashMap<String, String>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("UnsignedInteger", "uint");
|
||||
typeMapping.put("UnsignedLong", "ulong");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("decimal", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
|
||||
setSupportNullable(Boolean.TRUE);
|
||||
hideGenerationTimestamp = Boolean.TRUE;
|
||||
supportsInheritance = true;
|
||||
@@ -364,6 +339,62 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
setLibrary(RESTSHARP);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
protected Set<String> getNullableTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
|
||||
"DateTime", "DateTimeOffset", "Guid"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Set<String> getValueTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setTypeMapping() {
|
||||
typeMapping = new HashMap<>();
|
||||
// mapped non-nullable type without ?
|
||||
typeMapping = new HashMap<String, String>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("UnsignedInteger", "uint");
|
||||
typeMapping.put("UnsignedLong", "ulong");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("decimal", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
|
||||
if (HTTPCLIENT.equals(getLibrary())) {
|
||||
typeMapping.put("file", "FileParameter");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
super.updateCodegenParametersEnum(parameters, allModels);
|
||||
|
||||
for (CodegenParameter parameter : parameters) {
|
||||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apiDocFileFolder() {
|
||||
if (GENERICHOST.equals(getLibrary())) {
|
||||
@@ -558,7 +589,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
@Override
|
||||
public String getNullableType(Schema p, String type) {
|
||||
if (languageSpecificPrimitives.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && this.getNullableTypes().contains(type)) {
|
||||
return type + "?";
|
||||
} else {
|
||||
return type;
|
||||
@@ -607,6 +638,11 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
public void postProcessParameter(CodegenParameter parameter) {
|
||||
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
|
||||
postProcessEmitDefaultValue(parameter.vendorExtensions);
|
||||
|
||||
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
|
||||
super.postProcessParameter(parameter);
|
||||
}
|
||||
|
||||
@@ -832,7 +868,6 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
if (HTTPCLIENT.equals(getLibrary())) {
|
||||
supportingFiles.add(new SupportingFile("FileParameter.mustache", clientPackageDir, "FileParameter.cs"));
|
||||
typeMapping.put("file", "FileParameter");
|
||||
addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir);
|
||||
additionalProperties.put("apiDocPath", apiDocPath);
|
||||
additionalProperties.put("modelDocPath", modelDocPath);
|
||||
@@ -869,6 +904,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
// include the spec in the output
|
||||
supportingFiles.add(new SupportingFile("openapi.mustache", "api", "openapi.yaml"));
|
||||
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
public void setClientPackage(String clientPackage) {
|
||||
@@ -1609,8 +1645,8 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
|
||||
protected boolean isValueType(CodegenProperty var) {
|
||||
// this is temporary until x-csharp-value-type is removed
|
||||
return this.getLibrary().equals("generichost")
|
||||
? nullableType.contains(var.dataType) || var.isEnum
|
||||
: valueTypes.contains(var.dataType) || var.isEnum;
|
||||
? this.getNullableTypes().contains(var.dataType) || var.isEnum
|
||||
: this.getValueTypes().contains(var.dataType) || var.isEnum;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,11 +32,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
import static java.util.UUID.randomUUID;
|
||||
|
||||
@@ -122,17 +118,6 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
cliOptions.clear();
|
||||
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
|
||||
setSupportNullable(Boolean.TRUE);
|
||||
|
||||
// CLI options
|
||||
@@ -265,6 +250,53 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
|
||||
addOption(modelClassModifier.getOpt(), modelClassModifier.getDescription(), modelClassModifier.getOptValue());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
protected Set<String> getNullableTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
|
||||
"DateTime", "DateTimeOffset", "Guid"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Set<String> getValueTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setTypeMapping() {
|
||||
super.setTypeMapping();
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postProcessParameter(CodegenParameter parameter) {
|
||||
super.postProcessParameter(parameter);
|
||||
|
||||
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
super.updateCodegenParametersEnum(parameters, allModels);
|
||||
|
||||
for (CodegenParameter parameter : parameters) {
|
||||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodegenType getTag() {
|
||||
return CodegenType.SERVER;
|
||||
@@ -350,6 +382,8 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
|
||||
supportingFiles.add(new SupportingFile("typeConverter.mustache", packageFolder + File.separator + "Converters", "CustomEnumConverter.cs"));
|
||||
supportingFiles.add(new SupportingFile("host.json.mustache", packageFolder, "host.json"));
|
||||
supportingFiles.add(new SupportingFile("local.settings.json.mustache", packageFolder, "local.settings.json"));
|
||||
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
public void setPackageGuid(String packageGuid) {
|
||||
@@ -468,7 +502,7 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
|
||||
@Override
|
||||
public String getNullableType(Schema p, String type) {
|
||||
if (languageSpecificPrimitives.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && (nullableType.contains(type) || nullReferenceTypesFlag)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && (this.getNullableTypes().contains(type) || nullReferenceTypesFlag)) {
|
||||
return type + "?";
|
||||
} else {
|
||||
return type;
|
||||
|
||||
@@ -135,29 +135,6 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
)
|
||||
);
|
||||
|
||||
// mapped non-nullable type without ?
|
||||
typeMapping = new HashMap<String, String>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("decimal", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
|
||||
setSupportNullable(Boolean.TRUE);
|
||||
hideGenerationTimestamp = Boolean.TRUE;
|
||||
supportsInheritance = true;
|
||||
@@ -324,6 +301,60 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
setLibrary(RESTSHARP);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
protected Set<String> getNullableTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
|
||||
"DateTime", "DateTimeOffset", "Guid"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Set<String> getValueTypes() {
|
||||
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setTypeMapping() {
|
||||
super.setTypeMapping();
|
||||
// mapped non-nullable type without ?
|
||||
typeMapping = new HashMap<String, String>();
|
||||
typeMapping.put("string", "string");
|
||||
typeMapping.put("binary", "byte[]");
|
||||
typeMapping.put("ByteArray", "byte[]");
|
||||
typeMapping.put("boolean", "bool");
|
||||
typeMapping.put("integer", "int");
|
||||
typeMapping.put("float", "float");
|
||||
typeMapping.put("long", "long");
|
||||
typeMapping.put("double", "double");
|
||||
typeMapping.put("number", "decimal");
|
||||
typeMapping.put("decimal", "decimal");
|
||||
typeMapping.put("DateTime", "DateTime");
|
||||
typeMapping.put("date", "DateTime");
|
||||
typeMapping.put("file", "System.IO.Stream");
|
||||
typeMapping.put("array", "List");
|
||||
typeMapping.put("list", "List");
|
||||
typeMapping.put("map", "Dictionary");
|
||||
typeMapping.put("object", "Object");
|
||||
typeMapping.put("UUID", "Guid");
|
||||
typeMapping.put("URI", "string");
|
||||
typeMapping.put("AnyType", "Object");
|
||||
|
||||
if (HTTPCLIENT.equals(getLibrary())) {
|
||||
typeMapping.put("file", "FileParameter");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
|
||||
super.updateCodegenParametersEnum(parameters, allModels);
|
||||
|
||||
for (CodegenParameter parameter : parameters) {
|
||||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apiDocFileFolder() {
|
||||
return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar);
|
||||
@@ -431,7 +462,7 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
@Override
|
||||
public String getNullableType(Schema p, String type) {
|
||||
if (languageSpecificPrimitives.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
|
||||
if (isSupportNullable() && ModelUtils.isNullable(p) && this.getNullableTypes().contains(type)) {
|
||||
return type + "?";
|
||||
} else {
|
||||
return type;
|
||||
@@ -476,6 +507,11 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
public void postProcessParameter(CodegenParameter parameter) {
|
||||
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
|
||||
postProcessEmitDefaultValue(parameter.vendorExtensions);
|
||||
|
||||
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
|
||||
parameter.dataType = parameter.dataType + "?";
|
||||
}
|
||||
|
||||
super.postProcessParameter(parameter);
|
||||
}
|
||||
|
||||
@@ -674,7 +710,6 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
if (HTTPCLIENT.equals(getLibrary())) {
|
||||
supportingFiles.add(new SupportingFile("FileParameter.mustache", clientPackageDir, "FileParameter.cs"));
|
||||
typeMapping.put("file", "FileParameter");
|
||||
}
|
||||
|
||||
supportingFiles.add(new SupportingFile("IApiAccessor.mustache", clientPackageDir, "IApiAccessor.cs"));
|
||||
@@ -725,6 +760,8 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
|
||||
|
||||
additionalProperties.put("apiDocPath", apiDocPath);
|
||||
additionalProperties.put("modelDocPath", modelDocPath);
|
||||
|
||||
this.setTypeMapping();
|
||||
}
|
||||
|
||||
public void setNetStandard(Boolean netStandard) {
|
||||
|
||||
@@ -52,6 +52,7 @@ public class CSharpClientCodegenTest {
|
||||
|
||||
Schema test1 = openAPI.getComponents().getSchemas().get("format_test");
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
CodegenModel cm1 = codegen.fromModel("format_test", test1);
|
||||
Assert.assertEquals(cm1.getClassname(), "FormatTest");
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ public class CSharpModelTest {
|
||||
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + openApiVersion + "_0/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml");
|
||||
codegen.setNullableReferenceTypes(nullableReferenceTypes);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
Schema schema = openAPI.getComponents().getSchemas().get("Enum_Test");
|
||||
final CodegenModel generated = codegen.fromModel("OuterEnum", schema);
|
||||
|
||||
@@ -68,6 +69,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel generated = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(generated.name, "sample");
|
||||
@@ -93,10 +95,11 @@ public class CSharpModelTest {
|
||||
final Schema schema = getArrayTestSchema();
|
||||
|
||||
final CSharpClientCodegen codegen = new CSharpClientCodegen();
|
||||
codegen.setUseCollection(true);
|
||||
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
codegen.setUseCollection(true);
|
||||
final CodegenModel generated = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(generated.name, "sample");
|
||||
@@ -118,11 +121,13 @@ public class CSharpModelTest {
|
||||
final Schema schema = getArrayTestSchema();
|
||||
|
||||
final CSharpClientCodegen codegen = new CSharpClientCodegen();
|
||||
codegen.setUseCollection(true);
|
||||
codegen.setReturnICollection(true);
|
||||
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
codegen.setUseCollection(true);
|
||||
codegen.setReturnICollection(true);
|
||||
|
||||
final CodegenModel generated = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(generated.name, "sample");
|
||||
@@ -161,6 +166,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -207,6 +213,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -256,6 +263,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -306,6 +314,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new AspNetServerCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -363,10 +372,11 @@ public class CSharpModelTest {
|
||||
.addProperties("subObject", new Schema().addProperties("name", new StringSchema()).nullable(true))
|
||||
.addRequiredItem("id");
|
||||
final DefaultCodegen codegen = new AspNetServerCodegen();
|
||||
codegen.additionalProperties().put(CodegenConstants.NULLABLE_REFERENCE_TYPES, true);
|
||||
codegen.processOpts();
|
||||
codegen.additionalProperties().put(CodegenConstants.NULLABLE_REFERENCE_TYPES, true);
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -424,6 +434,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", model);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -462,6 +473,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -488,6 +500,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -512,6 +525,7 @@ public class CSharpModelTest {
|
||||
.items(new Schema().$ref("#/components/schemas/Children")));
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -539,6 +553,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -566,6 +581,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
@@ -585,6 +601,7 @@ public class CSharpModelTest {
|
||||
final DefaultCodegen codegen = new CSharpClientCodegen();
|
||||
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
codegen.processOpts();
|
||||
final CodegenModel cm = codegen.fromModel("sample", schema);
|
||||
|
||||
Assert.assertEquals(cm.name, "sample");
|
||||
|
||||
@@ -46,6 +46,7 @@ public class CSharpOperationTest {
|
||||
|
||||
public String getOperationOptionalParameterDataType(final AbstractCSharpCodegen codegen, final int openApiVersion, final Boolean nullableReferenceTypes){
|
||||
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + openApiVersion + "_0/petstore-with-fake-endpoints-models-for-testing.yaml");
|
||||
codegen.processOpts();
|
||||
codegen.setNullableReferenceTypes(nullableReferenceTypes);
|
||||
codegen.setOpenAPI(openAPI);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user