Browse Source

dynamite: Make content strings work for other types than json

pull/169/head
jld3103 2 years ago
parent
commit
c2865ef506
No known key found for this signature in database
GPG Key ID: 9062417B9E8EB7B3
  1. 2
      packages/dynamite/lib/src/models/schema.dart
  2. 29
      packages/dynamite/lib/src/openapi_builder.dart
  3. 4
      packages/dynamite/lib/src/type_result/list.dart
  4. 8
      packages/dynamite/lib/src/type_result/object.dart

2
packages/dynamite/lib/src/models/schema.dart

@ -67,5 +67,5 @@ class Schema {
final Discriminator? discriminator;
bool get isJsonString => type == 'string' && contentMediaType == 'application/json' && contentSchema != null;
bool get isContentString => type == 'string' && (contentMediaType?.isNotEmpty ?? false) && contentSchema != null;
}

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

@ -603,7 +603,7 @@ class OpenAPIBuilder implements Builder {
if (nullable) {
code.write('if (${_toDartName(parameter.name)} != null) {');
}
final isPlainList = result is TypeResultList && !result.fromJsonString;
final isPlainList = result is TypeResultList && !result.fromContentString;
final value = result.encode(
result.serialize(_toDartName(parameter.name)),
onlyChildren: isPlainList && parameter.in_ == 'query',
@ -1039,7 +1039,7 @@ TypeResult resolveObject(
final Schema schema, {
required final Map<String, String>? extraJsonSerializableValues,
required final Map<String, Map<String, String>>? extraJsonKeyValues,
final bool fromJsonString = false,
final bool fromContentString = false,
}) {
if (!state.resolvedTypes.contains('${state.prefix}$identifier')) {
state.resolvedTypes.add('${state.prefix}$identifier');
@ -1181,14 +1181,15 @@ TypeResult resolveObject(
],
]);
final hasDifferentName = _toDartName(propertyName) != propertyName;
final isJsonString = propertySchema.isJsonString;
final isJsonStringArray = result is TypeResultList && (propertySchema.items?.isJsonString ?? false);
final isContentString = propertySchema.isContentString;
final isContentStringArray =
result is TypeResultList && (propertySchema.items?.isContentString ?? false);
final hasExtraJsonKeyValues =
extraJsonKeyValues != null && extraJsonKeyValues.containsKey(propertyName);
if (hasDifferentName || isJsonString || isJsonStringArray || hasExtraJsonKeyValues) {
if (hasDifferentName || isContentString || isContentStringArray || hasExtraJsonKeyValues) {
var fromJson = '${result.name}.fromJsonString';
var toJson = '${result.name}.toJsonString';
if (isJsonStringArray) {
if (isContentStringArray) {
fromJson = '_${_toDartName('${state.prefix}${identifier}FromJsonString')}';
if (!state.resolvedTypes.contains(fromJson)) {
state.resolvedTypes.add(fromJson);
@ -1240,7 +1241,7 @@ TypeResult resolveObject(
if (hasDifferentName) ...{
'name': refer("'$propertyName'"),
},
if (isJsonString || isJsonStringArray) ...{
if (isContentString || isContentStringArray) ...{
'fromJson': refer(fromJson),
'toJson': refer(toJson),
},
@ -1263,7 +1264,7 @@ TypeResult resolveObject(
}
return TypeResultObject(
'${state.prefix}$identifier',
fromJsonString: fromJsonString,
fromContentString: fromContentString,
);
}
@ -1275,7 +1276,7 @@ TypeResult resolveType(
final Map<String, String>? extraJsonSerializableValues,
final Map<String, Map<String, String>>? extraJsonKeyValues,
final bool ignoreEnum = false,
final bool fromJsonString = false,
final bool fromContentString = false,
}) {
TypeResult? result;
if (schema.ref != null) {
@ -1286,7 +1287,7 @@ TypeResult resolveType(
name,
spec.components!.schemas![name]!,
extraJsonSerializableValues: extraJsonSerializableValues,
fromJsonString: fromJsonString,
fromContentString: fromContentString,
);
} else if (schema.ofs != null) {
if (!state.resolvedTypes.contains('${state.prefix}$identifier')) {
@ -1482,14 +1483,14 @@ TypeResult resolveType(
break;
}
if (schema.isJsonString) {
if (schema.isContentString) {
result = resolveType(
spec,
state,
identifier,
schema.contentSchema!,
extraJsonSerializableValues: extraJsonSerializableValues,
fromJsonString: true,
fromContentString: true,
);
break;
}
@ -1510,7 +1511,7 @@ TypeResult resolveType(
result = TypeResultList(
'List<${subResult.name}>',
subResult,
fromJsonString: fromJsonString,
fromContentString: fromContentString,
);
} else {
result = TypeResultList(
@ -1539,7 +1540,7 @@ TypeResult resolveType(
schema,
extraJsonSerializableValues: extraJsonSerializableValues,
extraJsonKeyValues: extraJsonKeyValues,
fromJsonString: fromJsonString,
fromContentString: fromContentString,
);
break;
}

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

@ -4,11 +4,11 @@ class TypeResultList extends TypeResult {
TypeResultList(
super.name,
this.subType, {
this.fromJsonString = false,
this.fromContentString = false,
});
final TypeResult subType;
final bool fromJsonString;
final bool fromContentString;
@override
String serialize(final String object) => '$object.map((final e) => ${subType.serialize('e')}).toList()';

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

@ -3,14 +3,14 @@ part of '../../dynamite.dart';
class TypeResultObject extends TypeResult {
TypeResultObject(
super.name, {
this.fromJsonString = false,
this.fromContentString = false,
});
final bool fromJsonString;
final bool fromContentString;
@override
String serialize(final String object) {
if (fromJsonString) {
if (fromContentString) {
return '$name.toJsonString($object)';
}
return '$object.toJson()';
@ -34,7 +34,7 @@ class TypeResultObject extends TypeResult {
@override
String deserialize(final String object) {
if (fromJsonString) {
if (fromContentString) {
return '$name.fromJsonString($object as String)';
}
return '$name.fromJson($object as Map<String, dynamic>)';

Loading…
Cancel
Save