Browse Source

dynamite: Properly serialize and deserialize string arrays in objects

pull/166/head
jld3103 2 years ago
parent
commit
021092893c
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 56
      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

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

@ -1170,9 +1170,57 @@ TypeResult resolveObject(
]);
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 || hasExtraJsonKeyValues) {
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(
[],
@ -1180,9 +1228,9 @@ TypeResult resolveObject(
if (hasDifferentName) ...{
'name': refer("'$propertyName'"),
},
if (isJsonString) ...{
'fromJson': refer('${result.name}.fromJsonString'),
'toJson': refer('${result.name}.toJsonString'),
if (isJsonString || isJsonStringArray) ...{
'fromJson': refer(fromJson),
'toJson': refer(toJson),
},
if (hasExtraJsonKeyValues) ...{
for (final key in extraJsonKeyValues[propertyName]!.keys) ...{

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