Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix sending integer enums #379

Merged
merged 6 commits into from
Apr 12, 2022
Merged
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
32 changes: 25 additions & 7 deletions lib/src/code_generators/swagger_enums_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,12 @@ $enumsFromRequestBodies

final enumMap = '''
\n\tconst \$${enumName}Map = {
\t${getEnumValuesMapContent(enumName, enumValues: enumValues, enumValuesNames: [])}
\t${getEnumValuesMapContent(
enumName,
enumValues: enumValues,
enumValuesNames: [],
isInteger: isInteger,
)}
};
''';

Expand Down Expand Up @@ -267,9 +272,12 @@ $enumMap
return resultStrings.join(',\n');
}

String getEnumValuesMapContent(String enumName,
{required List<String> enumValues,
required List<String> enumValuesNames}) {
String getEnumValuesMapContent(
String enumName, {
required List<String> enumValues,
required List<String> enumValuesNames,
required bool isInteger,
}) {
final neededStrings = <String>[];
final fields = <String>[];

Expand All @@ -288,8 +296,13 @@ $enumMap
validatedValue = getValidatedEnumFieldName(validatedValue);

fields.add(validatedValue);
neededStrings.add(
'\t$enumName.$validatedValue: \'${value.replaceAll('\$', '\\\$')}\'');
if (isInteger) {
neededStrings.add(
'\t$enumName.$validatedValue: ${value.replaceAll('\$', '\\\$')}');
} else {
neededStrings.add(
'\t$enumName.$validatedValue: \'${value.replaceAll('\$', '\\\$')}\'');
}
}

return neededStrings.join(',\n');
Expand Down Expand Up @@ -366,7 +379,12 @@ $enumMap

final enumMap = '''
\n\tconst \$${enumName}Map = {
\t${getEnumValuesMapContent(enumName, enumValues: enumValues, enumValuesNames: enumValuesNamesList)}
\t${getEnumValuesMapContent(
enumName,
enumValues: enumValues,
enumValuesNames: enumValuesNamesList,
isInteger: isInteger,
)}
};
''';

Expand Down
18 changes: 13 additions & 5 deletions lib/src/code_generators/swagger_generator_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:swagger_dart_code_generator/src/code_generators/constants.dart';
import 'package:swagger_dart_code_generator/src/exception_words.dart';
import 'package:swagger_dart_code_generator/src/extensions/string_extension.dart';
import 'package:swagger_dart_code_generator/src/models/generator_options.dart';
import 'package:swagger_dart_code_generator/src/models/swagger_enum.dart';
import 'package:swagger_dart_code_generator/src/swagger_models/requests/swagger_request.dart';
import 'package:swagger_dart_code_generator/src/swagger_models/requests/swagger_request_parameter.dart';
import 'package:swagger_dart_code_generator/src/swagger_models/swagger_path.dart';
Expand Down Expand Up @@ -101,8 +102,8 @@ abstract class SwaggerGeneratorBase {
return jsonKey;
}

List<String> getEnumNamesFromRequests(Map<String, dynamic> map) {
final enumNames = <String>[];
List<SwaggerEnum> getEnumsFromRequests(Map<String, dynamic> map) {
final enums = <SwaggerEnum>[];
final swaggerRoot = SwaggerRoot.fromJson(map);

//Link defined parameters with requests
Expand All @@ -129,7 +130,7 @@ abstract class SwaggerGeneratorBase {
var name = generateRequestEnumName(
path, requestType, swaggerRequestParameter.name);

if (enumNames.contains(name)) {
if (enums.any((element) => element.name == name)) {
continue;
}

Expand All @@ -138,13 +139,20 @@ abstract class SwaggerGeneratorBase {
[];

if (enumValues.isNotEmpty) {
enumNames.add(name);
enums.add(
SwaggerEnum(
name: name,
isInteger: kIntegerTypes.contains(
swaggerRequestParameter.schema?.type,
),
),
);
}
}
});
});

return enumNames;
return enums;
}

SwaggerRequestParameter getOriginalOrOverriddenRequestParameter(
Expand Down
122 changes: 82 additions & 40 deletions lib/src/code_generators/swagger_models_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:collection/collection.dart';
import 'package:swagger_dart_code_generator/src/code_generators/constants.dart';
import 'package:swagger_dart_code_generator/src/code_generators/swagger_generator_base.dart';
import 'package:swagger_dart_code_generator/src/models/generator_options.dart';
import 'package:swagger_dart_code_generator/src/models/swagger_enum.dart';
import 'package:recase/recase.dart';
import 'package:swagger_dart_code_generator/src/extensions/string_extension.dart';
import 'package:swagger_dart_code_generator/src/exception_words.dart';
Expand Down Expand Up @@ -176,12 +177,12 @@ abstract class SwaggerModelsGenerator extends SwaggerGeneratorBase {

String generateBase(Map<String, dynamic> map, String fileName,
Map<String, dynamic> classes, bool generateFromJsonToJsonForRequests) {
final allEnumsNames = getAllEnumNames(map);
final allEnums = getAllEnums(map);
final allEnumListNames = getAllListEnumNames(map);

final generatedEnumFromJsonToJson = generateFromJsonToJsonForRequests
? genetateEnumFromJsonToJsonMethods(
allEnumsNames, options.enumsCaseSensitive)
? generateEnumFromJsonToJsonMethods(
allEnums, options.enumsCaseSensitive)
: '';

final classesFromResponses = getClassesFromResponses(map);
Expand All @@ -207,7 +208,7 @@ abstract class SwaggerModelsGenerator extends SwaggerGeneratorBase {
classes,
options.defaultValuesMap,
options.useDefaultNullForLists,
allEnumsNames,
allEnums.map((e) => e.name).toList(),
allEnumListNames,
);
}).join('\n');
Expand Down Expand Up @@ -977,47 +978,52 @@ abstract class SwaggerModelsGenerator extends SwaggerGeneratorBase {
}
}

String genetateEnumFromJsonToJsonMethods(
List<String> enumNames, bool enumsCaseSensitive) {
return enumNames
String generateEnumFromJsonToJsonMethods(
List<SwaggerEnum> swaggerEnums, bool enumsCaseSensitive) {
return swaggerEnums
.map((e) => generateEnumFromJsonToJson(e, enumsCaseSensitive))
.join('\n');
}

String generateEnumFromJsonToJson(String enumName, bool enumsCaseSensitive) {
String generateEnumFromJsonToJson(
SwaggerEnum swaggerEnum, bool enumsCaseSensitive) {
final neededName =
getValidatedClassName(enumName.replaceFirst('enums.', ''));
getValidatedClassName(swaggerEnum.name.replaceFirst('enums.', ''));

final toLowerCaseString = !enumsCaseSensitive ? '.toLowerCase()' : '';
final type = swaggerEnum.isInteger ? 'int' : 'String';
final defaultValue = swaggerEnum.isInteger ? 0 : '\'\'';

return '''
String? ${neededName.camelCase}ToJson(enums.$neededName? ${neededName.camelCase}) {
$type? ${neededName.camelCase}ToJson(enums.$neededName? ${neededName.camelCase}) {
return enums.\$${neededName}Map[${neededName.camelCase}];
}

enums.$neededName ${neededName.camelCase}FromJson(Object? ${neededName.camelCase}) {

${swaggerEnum.isInteger ? '''
if(${neededName.camelCase} is int)
{
return enums.\$${neededName}Map.entries
.firstWhere((element) => element.value$toLowerCaseString == ${neededName.camelCase}.toString(),
orElse: () => const MapEntry(enums.$neededName.swaggerGeneratedUnknown, ''))
.firstWhere((element) => element.value == ${neededName.camelCase},
orElse: () => const MapEntry(enums.$neededName.swaggerGeneratedUnknown, $defaultValue))
.key;
}

''' : '''
if(${neededName.camelCase} is String)
{
return enums.\$${neededName}Map.entries
.firstWhere((element) => element.value$toLowerCaseString == ${neededName.camelCase}$toLowerCaseString,
orElse: () => const MapEntry(enums.$neededName.swaggerGeneratedUnknown, ''))
orElse: () => const MapEntry(enums.$neededName.swaggerGeneratedUnknown, $defaultValue))
.key;

}
'''}

return enums.$neededName.swaggerGeneratedUnknown;
}

List<String> ${neededName.camelCase}ListToJson(

List<$type> ${neededName.camelCase}ListToJson(
List<enums.$neededName>? ${neededName.camelCase}) {

if(${neededName.camelCase} == null)
Expand Down Expand Up @@ -1265,8 +1271,11 @@ $allHashComponents;
return currentProperties;
}

List<String> getAllEnumNames(Map<String, dynamic> map) {
final results = getEnumNamesFromRequests(map);
List<String> getAllEnumNames(Map<String, dynamic> map) =>
getAllEnums(map).map((e) => e.name).toList(growable: false);

List<SwaggerEnum> getAllEnums(Map<String, dynamic> map) {
final results = getEnumsFromRequests(map);

final components = map['components'] as Map<String, dynamic>?;

Expand All @@ -1293,14 +1302,22 @@ $allHashComponents;
schemas.forEach((className, map) {
final mapMap = map as Map<String, dynamic>;
if (mapMap.containsKey('enum')) {
results.add(getValidatedClassName(className.capitalize));
_addEnum(
outResults: results,
name: getValidatedClassName(className.capitalize),
map: mapMap,
);
return;
}

if (mapMap['type'] == 'array' &&
mapMap['items'] != null &&
mapMap['items']['enum'] != null) {
results.add(getValidatedClassName(className.capitalize));
_addEnum(
outResults: results,
name: getValidatedClassName(className.capitalize),
map: mapMap,
);
return;
}

Expand Down Expand Up @@ -1347,12 +1364,12 @@ $allHashComponents;
return;
}

if (propertyValue.containsKey('enum') ||
(propertyValue['items'] != null &&
propertyValue['items']['enum'] != null)) {
results.add(getValidatedClassName(generateEnumName(
getValidatedClassName(className), propertyName)));
}
_addEnum(
outResults: results,
name: getValidatedClassName(
generateEnumName(getValidatedClassName(className), propertyName)),
map: propertyValue,
);
});
});

Expand All @@ -1364,7 +1381,11 @@ $allHashComponents;
final schema = firstContent == null ? null : firstContent['schema'];
if (schema != null &&
(schema as Map<String, dynamic>).containsKey('enum')) {
results.add(className.capitalize);
_addEnum(
outResults: results,
name: className,
map: schema,
);
return;
}
final properties = schema == null
Expand All @@ -1376,13 +1397,13 @@ $allHashComponents;
}

properties.forEach((propertyName, propertyValue) {
var property = propertyValue as Map<String, dynamic>;
final property = propertyValue as Map<String, dynamic>;

if (property.containsKey('enum') ||
(property['items'] != null &&
property['items']['enum'] != null)) {
results.add(generateEnumName(className, propertyName));
}
_addEnum(
outResults: results,
name: generateEnumName(className, propertyName),
map: property,
);
});
});
}
Expand All @@ -1395,7 +1416,11 @@ $allHashComponents;
final schema = firstContent == null ? null : firstContent['schema'];
if (schema != null &&
(schema as Map<String, dynamic>).containsKey('enum')) {
results.add(className.capitalize);
_addEnum(
outResults: results,
name: schema['name'] as String,
map: schema,
);
return;
}
final properties = schema == null
Expand All @@ -1409,22 +1434,39 @@ $allHashComponents;
properties.forEach((propertyName, propertyValue) {
var property = propertyValue as Map<String, dynamic>;

if (property.containsKey('enum') ||
(property['items'] != null &&
property['items']['enum'] != null)) {
results.add(generateEnumName(className, propertyName));
}
_addEnum(
outResults: results,
name: generateEnumName(className, propertyName),
map: property,
);
});
});
}

final resultsWithPrefix = results.map((element) {
return 'enums.$element';
return SwaggerEnum(
name: 'enums.${element.name}',
isInteger: element.isInteger,
);
}).toList();

return resultsWithPrefix;
}

void _addEnum({
required List<SwaggerEnum> outResults,
required String name,
required Map<String, dynamic> map,
}) {
final enums = map['enum'] ?? map['items']?['enum'];
if (enums is List) {
final isInteger =
kIntegerTypes.contains(map['type'] ?? map['items']?['type']) ||
enums.firstOrNull is int;
outResults.add(SwaggerEnum(name: name, isInteger: isInteger));
}
}

Map<String, dynamic> getRequestBodiesFromRequests(Map<String, dynamic> map) {
final paths = map['paths'] as Map<String, dynamic>? ?? {};
if (paths.isEmpty) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class SwaggerModelsGeneratorV2 extends SwaggerModelsGenerator {

@override
List<String> getAllListEnumNames(Map<String, dynamic> map) {
final results = getEnumNamesFromRequests(map);
final results = getEnumsFromRequests(map).map((e) => e.name).toList();

final definitions = map['definitions'] as Map<String, dynamic>?;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ class SwaggerModelsGeneratorV3 extends SwaggerModelsGenerator {

@override
List<String> getAllListEnumNames(Map<String, dynamic> map) {
final results = getEnumNamesFromRequests(map);
final results = getEnumsFromRequests(map).map((e) => e.name).toList();

final components = map['components'] as Map<String, dynamic>?;

Expand Down
Loading