Browse Source

Merge pull request #166 from provokateurin/fix/serialize-string-arrays-in-objects

dynamite: Properly serialize and deserialize string arrays in objects
pull/167/head
Kate 2 years ago committed by GitHub
parent
commit
dc496280ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 66
      packages/dynamite/lib/src/openapi_builder.dart
  2. 2
      packages/dynamite/lib/src/type_result/list.dart
  3. 2
      packages/dynamite/lib/src/type_result/object.dart

66
packages/dynamite/lib/src/openapi_builder.dart

@ -1171,21 +1171,71 @@ TypeResult resolveObject(
'/// ${propertySchema.description!}',
],
]);
if (_toDartName(propertyName) != propertyName ||
propertySchema.isJsonString ||
extraJsonKeyValues != null) {
final hasDifferentName = _toDartName(propertyName) != propertyName;
final isJsonString = propertySchema.isJsonString;
final isJsonStringArray = result is TypeResultList && (propertySchema.items?.isJsonString ?? false);
final hasExtraJsonKeyValues =
extraJsonKeyValues != null && extraJsonKeyValues.containsKey(propertyName);
if (hasDifferentName || isJsonString || isJsonStringArray || hasExtraJsonKeyValues) {
var fromJson = '${result.name}.fromJsonString';
var toJson = '${result.name}.toJsonString';
if (isJsonStringArray) {
fromJson = '_${_toDartName('${identifier}FromJsonString')}';
if (!state.resolvedTypes.contains(fromJson)) {
state.resolvedTypes.add(fromJson);
state.output.add(
Method(
(final b) => b
..name = fromJson
..returns = refer(result.name)
..lambda = true
..requiredParameters.addAll([
Parameter(
(final b) => b
..name = 'data'
..type = refer('String'),
),
])
..body = Code('${result.deserialize(result.decode('data'))};'),
),
);
}
toJson = '_${_toDartName('${identifier}ToJsonString')}';
if (!state.resolvedTypes.contains(toJson)) {
state.resolvedTypes.add(toJson);
state.output.add(
Method(
(final b) => b
..name = toJson
..returns = refer('List<String>?')
..lambda = true
..requiredParameters.addAll([
Parameter(
(final b) => b
..name = 'data'
..type = refer(_makeNullable(result.name, true)),
),
])
..body = Code(
'data == null ? null : ${result.encode(result.serialize('data'), mimeType: 'application/json', onlyChildren: true)};',
),
),
);
}
}
b.annotations.add(
refer('JsonKey').call(
[],
{
if (_toDartName(propertyName) != propertyName) ...{
if (hasDifferentName) ...{
'name': refer("'$propertyName'"),
},
if (propertySchema.isJsonString) ...{
'fromJson': refer('${result.name}.fromJsonString'),
'toJson': refer('${result.name}.toJsonString'),
if (isJsonString || isJsonStringArray) ...{
'fromJson': refer(fromJson),
'toJson': refer(toJson),
},
if (extraJsonKeyValues != null && extraJsonKeyValues.containsKey(propertyName)) ...{
if (hasExtraJsonKeyValues) ...{
for (final key in extraJsonKeyValues[propertyName]!.keys) ...{
key: refer(extraJsonKeyValues[propertyName]![key]!),
},

2
packages/dynamite/lib/src/type_result/list.dart

@ -20,7 +20,7 @@ class TypeResultList extends TypeResult {
final String? mimeType,
}) {
if (onlyChildren) {
return '$object.map((final e) => ${subType.encode('e')}).toList()';
return '$object.map((final e) => ${subType.encode('e', mimeType: mimeType)}).toList()';
}
switch (mimeType) {

2
packages/dynamite/lib/src/type_result/object.dart

@ -11,7 +11,7 @@ class TypeResultObject extends TypeResult {
@override
String serialize(final String object) {
if (fromJsonString) {
return '$object.toJsonString()';
return '$name.toJsonString($object)';
}
return '$object.toJson()';
}

Loading…
Cancel
Save