From 5079375024ee7d86b0da443d1a7cf1ca9cc53963 Mon Sep 17 00:00:00 2001 From: Nikolas Rimikis Date: Tue, 25 Apr 2023 11:05:15 +0200 Subject: [PATCH] dynamite: patch discriminator Signed-off-by: Nikolas Rimikis --- .../dynamite/lib/src/openapi_builder.dart | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/dynamite/lib/src/openapi_builder.dart b/packages/dynamite/lib/src/openapi_builder.dart index cb822d92..f84c5bb9 100644 --- a/packages/dynamite/lib/src/openapi_builder.dart +++ b/packages/dynamite/lib/src/openapi_builder.dart @@ -1802,13 +1802,26 @@ TypeResult resolveType( ], ] else ...[ if (schema.discriminator != null) ...[ - 'if (data is! Map) {', - "throw StateError('discriminator is only supported for serializing Json like data.');", + 'if (data is! Iterable) {', + r"throw StateError('Expected an Iterable but got ${data.runtimeType}');", + '}', + '', + 'String? discriminator;', + '', + 'final iterator = data.iterator;', + 'while (iterator.moveNext()) {', + 'final key = iterator.current! as String;', + 'iterator.moveNext();', + 'final Object? value = iterator.current;', + "if (key == '${schema.discriminator!.propertyName}') {", + 'discriminator = value! as String;', + 'break;', + '}', '}', ], for (final result in results) ...[ if (schema.discriminator != null) ...[ - "if (data['${schema.discriminator!.propertyName}'] == '${result.name.replaceFirst(state.prefix, '')}'", + "if (discriminator == '${result.name.replaceFirst(state.prefix, '')}'", if (schema.discriminator!.mapping != null && schema.discriminator!.mapping!.isNotEmpty) ...[ for (final key in schema.discriminator!.mapping!.entries .where( @@ -1816,7 +1829,7 @@ TypeResult resolveType( entry.value.endsWith('/${result.name.replaceFirst(state.prefix, '')}'), ) .map((final entry) => entry.key)) ...[ - " || data['${schema.discriminator!.propertyName}'] == '$key'", + " || discriminator == '$key'", ], ') {', ],