Skip to content

Commit 2d927a7

Browse files
authored
Improve example value handling in C# generators (#11355)
* improve example value handling in C# generators * fix typo * update samples
1 parent 0cb88ce commit 2d927a7

File tree

33 files changed

+426
-344
lines changed

33 files changed

+426
-344
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 117 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,42 +1261,124 @@ protected boolean isValueType(CodegenProperty var) {
12611261
}
12621262

12631263
@Override
1264-
public void setParameterExampleValue(CodegenParameter codegenParameter) {
1265-
1266-
// set the example value
1267-
// if not specified in x-example, generate a default value
1268-
// TODO need to revise how to obtain the example value
1269-
if (codegenParameter.vendorExtensions != null && codegenParameter.vendorExtensions.containsKey("x-example")) {
1270-
codegenParameter.example = Json.pretty(codegenParameter.vendorExtensions.get("x-example"));
1271-
} else if (Boolean.TRUE.equals(codegenParameter.isBoolean)) {
1272-
codegenParameter.example = "true";
1273-
} else if (Boolean.TRUE.equals(codegenParameter.isLong)) {
1274-
codegenParameter.example = "789";
1275-
} else if (Boolean.TRUE.equals(codegenParameter.isInteger)) {
1276-
codegenParameter.example = "56";
1277-
} else if (Boolean.TRUE.equals(codegenParameter.isFloat)) {
1278-
codegenParameter.example = "3.4F";
1279-
} else if (Boolean.TRUE.equals(codegenParameter.isDouble)) {
1280-
codegenParameter.example = "1.2D";
1281-
} else if (Boolean.TRUE.equals(codegenParameter.isNumber)) {
1282-
codegenParameter.example = "8.14";
1283-
} else if (Boolean.TRUE.equals(codegenParameter.isBinary)) {
1284-
codegenParameter.example = "BINARY_DATA_HERE";
1285-
} else if (Boolean.TRUE.equals(codegenParameter.isByteArray)) {
1286-
codegenParameter.example = "BYTE_ARRAY_DATA_HERE";
1287-
} else if (Boolean.TRUE.equals(codegenParameter.isFile)) {
1288-
codegenParameter.example = "/path/to/file.txt";
1289-
} else if (Boolean.TRUE.equals(codegenParameter.isDate)) {
1290-
codegenParameter.example = "2013-10-20";
1291-
} else if (Boolean.TRUE.equals(codegenParameter.isDateTime)) {
1292-
codegenParameter.example = "2013-10-20T19:20:30+01:00";
1293-
} else if (Boolean.TRUE.equals(codegenParameter.isUuid)) {
1294-
codegenParameter.example = "38400000-8cf0-11bd-b23e-10b96e4ef00d";
1295-
} else if (Boolean.TRUE.equals(codegenParameter.isUri)) {
1296-
codegenParameter.example = "https://openapi-generator.tech";
1297-
} else if (Boolean.TRUE.equals(codegenParameter.isString)) {
1298-
codegenParameter.example = codegenParameter.paramName + "_example";
1264+
public void setParameterExampleValue(CodegenParameter p) {
1265+
String example;
1266+
1267+
boolean hasAllowableValues = p.allowableValues != null && !p.allowableValues.isEmpty();
1268+
if (hasAllowableValues) {
1269+
//support examples for inline enums
1270+
final List<Object> values = (List<Object>) p.allowableValues.get("values");
1271+
example = String.valueOf(values.get(0));
1272+
} else if (p.defaultValue == null) {
1273+
example = p.example;
1274+
} else {
1275+
example = p.defaultValue;
1276+
}
1277+
1278+
String type = p.baseType;
1279+
if (type == null) {
1280+
type = p.dataType;
1281+
}
1282+
1283+
if (p.isString) {
1284+
if (example == null) {
1285+
example = p.paramName + "_example";
1286+
}
1287+
example = "\"" + escapeText(example) + "\"";
1288+
} else if (p.isInteger || p.isShort) {
1289+
if (example == null) {
1290+
example = "56";
1291+
}
1292+
} else if (p.isLong) {
1293+
if (example == null) {
1294+
example = "789";
1295+
}
1296+
example = StringUtils.appendIfMissingIgnoreCase(example, "L");
1297+
} else if (p.isFloat) {
1298+
if (example == null) {
1299+
example = "3.4F";
1300+
}
1301+
example = StringUtils.appendIfMissingIgnoreCase(example, "F");
1302+
} else if (p.isDouble) {
1303+
if (example == null) {
1304+
example = "1.2D";
1305+
}
1306+
example = StringUtils.appendIfMissingIgnoreCase(example, "D");
1307+
} else if (p.isNumber) {
1308+
if (example == null) {
1309+
example = "8.14";
1310+
}
1311+
example = StringUtils.appendIfMissingIgnoreCase(example, "D");
1312+
} else if (p.isBoolean) {
1313+
if (example == null) {
1314+
example = "true";
1315+
}
1316+
} else if (p.isBinary || p.isFile) {
1317+
if (example == null) {
1318+
example = "/path/to/file.txt";
1319+
}
1320+
example = "new System.IO.MemoryStream(System.IO.File.ReadAllBytes(\"" + escapeText(example) + "\"))";
1321+
} else if (p.isByteArray) {
1322+
if (example == null) {
1323+
example = "BYTE_ARRAY_DATA_HERE";
1324+
}
1325+
example = "System.Text.Encoding.ASCII.GetBytes(\"" + escapeText(example) + "\")";
1326+
} else if (p.isDate) {
1327+
if (example == null) {
1328+
example = "DateTime.Parse(\"2013-10-20\")";
1329+
} else {
1330+
example = "DateTime.Parse(\"" + example + "\")";
1331+
}
1332+
} else if (p.isDateTime) {
1333+
if (example == null) {
1334+
example = "DateTime.Parse(\"2013-10-20T19:20:30+01:00\")";
1335+
} else {
1336+
example = "DateTime.Parse(\"" + example + "\")";
1337+
}
1338+
} else if (p.isDecimal) {
1339+
if (example == null) {
1340+
example = "8.9M";
1341+
}
1342+
example = StringUtils.appendIfMissingIgnoreCase(example, "M");
1343+
} else if (p.isUuid) {
1344+
if (example == null) {
1345+
example = "\"38400000-8cf0-11bd-b23e-10b96e4ef00d\"";
1346+
} else {
1347+
example = "\"" + example + "\"";
1348+
}
1349+
} else if (p.isUri) {
1350+
if (example == null) {
1351+
example = "new Uri(\"https://openapi-generator.tech\")";
1352+
} else {
1353+
example = "new Uri(\"" + example + "\")";
1354+
}
1355+
} else if (hasAllowableValues) {
1356+
//parameter is enum defined as a schema component
1357+
example = "(" + type + ") \"" + example + "\"";
1358+
} else if (!languageSpecificPrimitives.contains(type)) {
1359+
// type is a model class, e.g. User
1360+
example = "new " + type + "()";
1361+
}
1362+
1363+
if (example == null) {
1364+
example = "null";
1365+
} else if (Boolean.TRUE.equals(p.isArray)) {
1366+
if (p.items.defaultValue != null) {
1367+
String innerExample;
1368+
if ("String".equals(p.items.dataType)) {
1369+
innerExample = "\"" + p.items.defaultValue + "\"";
1370+
} else {
1371+
innerExample = p.items.defaultValue;
1372+
}
1373+
example = "new List<" + p.items.dataType + ">({" + innerExample + "})";
1374+
} else {
1375+
example = "new List<" + p.items.dataType + ">()";
1376+
}
1377+
} else if (Boolean.TRUE.equals(p.isMap)) {
1378+
example = "new Dictionary<String, " + p.items.dataType + ">";
12991379
}
1380+
1381+
p.example = example;
13001382
}
13011383

13021384
@Override

samples/client/others/csharp-netcore-complex-files/docs/MultipartApi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ namespace Example
103103
Configuration config = new Configuration();
104104
config.BasePath = "http://localhost";
105105
var apiInstance = new MultipartApi(config);
106-
var file = BINARY_DATA_HERE; // System.IO.Stream | a file
106+
var file = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | a file
107107
var marker = new MultipartMixedMarker(); // MultipartMixedMarker | (optional)
108108
109109
try
@@ -174,7 +174,7 @@ namespace Example
174174
Configuration config = new Configuration();
175175
config.BasePath = "http://localhost";
176176
var apiInstance = new MultipartApi(config);
177-
var file = BINARY_DATA_HERE; // System.IO.Stream | One file (optional)
177+
var file = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | One file (optional)
178178
179179
try
180180
{

samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/FakeApi.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ namespace Example
251251
Configuration config = new Configuration();
252252
config.BasePath = "http://petstore.swagger.io:80/v2";
253253
var apiInstance = new FakeApi(config);
254-
var body = 8.14; // decimal? | Input number as post body (optional)
254+
var body = 8.14D; // decimal? | Input number as post body (optional)
255255
256256
try
257257
{
@@ -321,7 +321,7 @@ namespace Example
321321
Configuration config = new Configuration();
322322
config.BasePath = "http://petstore.swagger.io:80/v2";
323323
var apiInstance = new FakeApi(config);
324-
var body = body_example; // string | Input string as post body (optional)
324+
var body = "body_example"; // string | Input string as post body (optional)
325325
326326
try
327327
{
@@ -523,7 +523,7 @@ namespace Example
523523
Configuration config = new Configuration();
524524
config.BasePath = "http://petstore.swagger.io:80/v2";
525525
var apiInstance = new FakeApi(config);
526-
var query = query_example; // string |
526+
var query = "query_example"; // string |
527527
var user = new User(); // User |
528528
529529
try
@@ -669,20 +669,20 @@ namespace Example
669669
config.Password = "YOUR_PASSWORD";
670670

671671
var apiInstance = new FakeApi(config);
672-
var number = 8.14; // decimal | None
672+
var number = 8.14D; // decimal | None
673673
var _double = 1.2D; // double | None
674-
var patternWithoutDelimiter = patternWithoutDelimiter_example; // string | None
675-
var _byte = BYTE_ARRAY_DATA_HERE; // byte[] | None
674+
var patternWithoutDelimiter = "patternWithoutDelimiter_example"; // string | None
675+
var _byte = System.Text.Encoding.ASCII.GetBytes("BYTE_ARRAY_DATA_HERE"); // byte[] | None
676676
var integer = 56; // int? | None (optional)
677677
var int32 = 56; // int? | None (optional)
678-
var int64 = 789; // long? | None (optional)
678+
var int64 = 789L; // long? | None (optional)
679679
var _float = 3.4F; // float? | None (optional)
680-
var _string = _string_example; // string | None (optional)
681-
var binary = BINARY_DATA_HERE; // System.IO.Stream | None (optional)
682-
var date = 2013-10-20; // DateTime? | None (optional)
683-
var dateTime = 2013-10-20T19:20:30+01:00; // DateTime? | None (optional) (default to "2010-02-01T10:20:10.111110+01:00")
684-
var password = password_example; // string | None (optional)
685-
var callback = callback_example; // string | None (optional)
680+
var _string = "_string_example"; // string | None (optional)
681+
var binary = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | None (optional)
682+
var date = DateTime.Parse("2013-10-20"); // DateTime? | None (optional)
683+
var dateTime = DateTime.Parse(""2010-02-01T10:20:10.111110+01:00""); // DateTime? | None (optional) (default to "2010-02-01T10:20:10.111110+01:00")
684+
var password = "password_example"; // string | None (optional)
685+
var callback = "callback_example"; // string | None (optional)
686686
687687
try
688688
{
@@ -767,13 +767,13 @@ namespace Example
767767
config.BasePath = "http://petstore.swagger.io:80/v2";
768768
var apiInstance = new FakeApi(config);
769769
var enumHeaderStringArray = new List<string>(); // List<string> | Header parameter enum test (string array) (optional)
770-
var enumHeaderString = enumHeaderString_example; // string | Header parameter enum test (string) (optional) (default to -efg)
770+
var enumHeaderString = "_abc"; // string | Header parameter enum test (string) (optional) (default to -efg)
771771
var enumQueryStringArray = new List<string>(); // List<string> | Query parameter enum test (string array) (optional)
772-
var enumQueryString = enumQueryString_example; // string | Query parameter enum test (string) (optional) (default to -efg)
773-
var enumQueryInteger = 56; // int? | Query parameter enum test (double) (optional)
774-
var enumQueryDouble = 1.2D; // double? | Query parameter enum test (double) (optional)
772+
var enumQueryString = "_abc"; // string | Query parameter enum test (string) (optional) (default to -efg)
773+
var enumQueryInteger = 1; // int? | Query parameter enum test (double) (optional)
774+
var enumQueryDouble = 1.1D; // double? | Query parameter enum test (double) (optional)
775775
var enumFormStringArray = new List<string>(); // List<string> | Form parameter enum test (string array) (optional) (default to $)
776-
var enumFormString = enumFormString_example; // string | Form parameter enum test (string) (optional) (default to -efg)
776+
var enumFormString = "_abc"; // string | Form parameter enum test (string) (optional) (default to -efg)
777777
778778
try
779779
{
@@ -856,10 +856,10 @@ namespace Example
856856
var apiInstance = new FakeApi(config);
857857
var requiredStringGroup = 56; // int | Required String in group parameters
858858
var requiredBooleanGroup = true; // bool | Required Boolean in group parameters
859-
var requiredInt64Group = 789; // long | Required Integer in group parameters
859+
var requiredInt64Group = 789L; // long | Required Integer in group parameters
860860
var stringGroup = 56; // int? | String in group parameters (optional)
861861
var booleanGroup = true; // bool? | Boolean in group parameters (optional)
862-
var int64Group = 789; // long? | Integer in group parameters (optional)
862+
var int64Group = 789L; // long? | Integer in group parameters (optional)
863863
864864
try
865865
{
@@ -1000,8 +1000,8 @@ namespace Example
10001000
Configuration config = new Configuration();
10011001
config.BasePath = "http://petstore.swagger.io:80/v2";
10021002
var apiInstance = new FakeApi(config);
1003-
var param = param_example; // string | field1
1004-
var param2 = param2_example; // string | field2
1003+
var param = "param_example"; // string | field1
1004+
var param2 = "param2_example"; // string | field2
10051005
10061006
try
10071007
{

samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/PetApi.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ namespace Example
112112
config.AccessToken = "YOUR_ACCESS_TOKEN";
113113

114114
var apiInstance = new PetApi(config);
115-
var petId = 789; // long | Pet id to delete
116-
var apiKey = apiKey_example; // string | (optional)
115+
var petId = 789L; // long | Pet id to delete
116+
var apiKey = "apiKey_example"; // string | (optional)
117117
118118
try
119119
{
@@ -339,7 +339,7 @@ namespace Example
339339
// config.AddApiKeyPrefix("api_key", "Bearer");
340340
341341
var apiInstance = new PetApi(config);
342-
var petId = 789; // long | ID of pet to return
342+
var petId = 789L; // long | ID of pet to return
343343
344344
try
345345
{
@@ -486,9 +486,9 @@ namespace Example
486486
config.AccessToken = "YOUR_ACCESS_TOKEN";
487487

488488
var apiInstance = new PetApi(config);
489-
var petId = 789; // long | ID of pet that needs to be updated
490-
var name = name_example; // string | Updated name of the pet (optional)
491-
var status = status_example; // string | Updated status of the pet (optional)
489+
var petId = 789L; // long | ID of pet that needs to be updated
490+
var name = "name_example"; // string | Updated name of the pet (optional)
491+
var status = "status_example"; // string | Updated status of the pet (optional)
492492
493493
try
494494
{
@@ -561,9 +561,9 @@ namespace Example
561561
config.AccessToken = "YOUR_ACCESS_TOKEN";
562562

563563
var apiInstance = new PetApi(config);
564-
var petId = 789; // long | ID of pet to update
565-
var additionalMetadata = additionalMetadata_example; // string | Additional data to pass to server (optional)
566-
var file = BINARY_DATA_HERE; // System.IO.Stream | file to upload (optional)
564+
var petId = 789L; // long | ID of pet to update
565+
var additionalMetadata = "additionalMetadata_example"; // string | Additional data to pass to server (optional)
566+
var file = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | file to upload (optional)
567567
568568
try
569569
{
@@ -637,9 +637,9 @@ namespace Example
637637
config.AccessToken = "YOUR_ACCESS_TOKEN";
638638

639639
var apiInstance = new PetApi(config);
640-
var petId = 789; // long | ID of pet to update
641-
var requiredFile = BINARY_DATA_HERE; // System.IO.Stream | file to upload
642-
var additionalMetadata = additionalMetadata_example; // string | Additional data to pass to server (optional)
640+
var petId = 789L; // long | ID of pet to update
641+
var requiredFile = new System.IO.MemoryStream(System.IO.File.ReadAllBytes("/path/to/file.txt")); // System.IO.Stream | file to upload
642+
var additionalMetadata = "additionalMetadata_example"; // string | Additional data to pass to server (optional)
643643
644644
try
645645
{

samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/StoreApi.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace Example
3535
Configuration config = new Configuration();
3636
config.BasePath = "http://petstore.swagger.io:80/v2";
3737
var apiInstance = new StoreApi(config);
38-
var orderId = orderId_example; // string | ID of the order that needs to be deleted
38+
var orderId = "orderId_example"; // string | ID of the order that needs to be deleted
3939
4040
try
4141
{
@@ -178,7 +178,7 @@ namespace Example
178178
Configuration config = new Configuration();
179179
config.BasePath = "http://petstore.swagger.io:80/v2";
180180
var apiInstance = new StoreApi(config);
181-
var orderId = 789; // long | ID of pet that needs to be fetched
181+
var orderId = 789L; // long | ID of pet that needs to be fetched
182182
183183
try
184184
{

samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/UserApi.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ namespace Example
245245
Configuration config = new Configuration();
246246
config.BasePath = "http://petstore.swagger.io:80/v2";
247247
var apiInstance = new UserApi(config);
248-
var username = username_example; // string | The name that needs to be deleted
248+
var username = "username_example"; // string | The name that needs to be deleted
249249
250250
try
251251
{
@@ -314,7 +314,7 @@ namespace Example
314314
Configuration config = new Configuration();
315315
config.BasePath = "http://petstore.swagger.io:80/v2";
316316
var apiInstance = new UserApi(config);
317-
var username = username_example; // string | The name that needs to be fetched. Use user1 for testing.
317+
var username = "username_example"; // string | The name that needs to be fetched. Use user1 for testing.
318318
319319
try
320320
{
@@ -385,8 +385,8 @@ namespace Example
385385
Configuration config = new Configuration();
386386
config.BasePath = "http://petstore.swagger.io:80/v2";
387387
var apiInstance = new UserApi(config);
388-
var username = username_example; // string | The user name for login
389-
var password = password_example; // string | The password for login in clear text
388+
var username = "username_example"; // string | The user name for login
389+
var password = "password_example"; // string | The password for login in clear text
390390
391391
try
392392
{
@@ -523,7 +523,7 @@ namespace Example
523523
Configuration config = new Configuration();
524524
config.BasePath = "http://petstore.swagger.io:80/v2";
525525
var apiInstance = new UserApi(config);
526-
var username = username_example; // string | name that need to be deleted
526+
var username = "username_example"; // string | name that need to be deleted
527527
var user = new User(); // User | Updated user object
528528
529529
try

0 commit comments

Comments
 (0)