From 7d338a30be317b9d2bcdf7e6dc3a5a0586eeaed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Tue, 4 Mar 2025 19:49:20 +0900 Subject: [PATCH 1/8] [dart][dart-dio] Add type information to oneOf and anyOf --- .../dio/serialization/built_value/class_members.mustache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_members.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_members.mustache index 0df06e1e3073..34e3f75a1967 100644 --- a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_members.mustache +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_members.mustache @@ -13,10 +13,10 @@ {{/allowableValues}} {{/vendorExtensions.x-self-only-props}}{{#anyOf}}{{#-first}} /// Any Of {{#anyOf}}[{{{.}}}]{{^-last}}, {{/-last}}{{/anyOf}} - AnyOf get anyOf; + AnyOf{{anyOf.size}}<{{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}> get anyOf; {{/-first}}{{/anyOf}}{{#oneOf}}{{#-first}} /// One Of {{#oneOf}}[{{{.}}}]{{^-last}}, {{/-last}}{{/oneOf}} - OneOf get oneOf; + OneOf{{oneOf.size}}<{{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}> get oneOf; {{/-first}}{{/oneOf}}{{#discriminator}} static const String discriminatorFieldName = r'{{propertyBaseName}}';{{#hasDiscriminatorWithNonEmptyMapping}} From 19736e6d64b07335f719ef2aea3cf55838f9d7bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Tue, 4 Mar 2025 19:53:37 +0900 Subject: [PATCH 2/8] [dart][dart-dio] update sample --- .../client/petstore/dart-dio/oneof/lib/src/model/fruit.dart | 2 +- .../lib/src/model/bar_ref_or_value.dart | 2 +- .../lib/src/model/foo_ref_or_value.dart | 2 +- .../oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart | 2 +- .../dart-dio/oneof_primitive/lib/src/model/example.dart | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart index 11f8cfa70501..d3932692e357 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart @@ -23,7 +23,7 @@ abstract class Fruit implements Built { String? get color; /// One Of [Apple], [Banana] - OneOf get oneOf; + OneOf2 get oneOf; Fruit._(); diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart index f880cb557955..f3fcbcb15c11 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart @@ -28,7 +28,7 @@ part 'bar_ref_or_value.g.dart'; @BuiltValue() abstract class BarRefOrValue implements Built { /// One Of [Bar], [BarRef] - OneOf get oneOf; + OneOf2 get oneOf; static const String discriminatorFieldName = r'@type'; diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart index d8164c5b9073..66ce17cb7229 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart @@ -27,7 +27,7 @@ part 'foo_ref_or_value.g.dart'; @BuiltValue() abstract class FooRefOrValue implements Built { /// One Of [Foo], [FooRef] - OneOf get oneOf; + OneOf2 get oneOf; static const String discriminatorFieldName = r'@type'; diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart index 31b61361de5e..84ff29129843 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart @@ -25,7 +25,7 @@ abstract class Fruit implements Built { // enum fruitTypeEnum { APPLE, BANANA, }; /// One Of [Apple], [Banana] - OneOf get oneOf; + OneOf2 get oneOf; static const String discriminatorFieldName = r'fruitType'; diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart index 799b77e4e178..c63d28690946 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart @@ -18,7 +18,7 @@ part 'example.g.dart'; @BuiltValue() abstract class Example implements Built { /// One Of [Child], [int] - OneOf get oneOf; + OneOf2 get oneOf; Example._(); From 39ef27fe400f2749d3c714a61cf50c33be192b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 5 Mar 2025 05:20:01 +0900 Subject: [PATCH 3/8] [dart][dart-dio] Add type information to oneOf and anyOf --- .../languages/DartDioClientCodegen.java | 4 + .../built_value/class_serializer.mustache | 12 ++- .../built_value/serializers_util.mustache | 74 +++++++++++++++++++ 3 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/serializers_util.mustache diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java index 81414c5e03bf..bc3fd94b7f36 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/DartDioClientCodegen.java @@ -250,6 +250,7 @@ private void configureSerializationLibrary(String srcFolder) { private void configureSerializationLibraryBuiltValue(String srcFolder) { supportingFiles.add(new SupportingFile("serialization/built_value/serializers.mustache", srcFolder, "serializers.dart")); supportingFiles.add(new SupportingFile("serialization/built_value/api_util.mustache", srcFolder, "api_util.dart")); + supportingFiles.add(new SupportingFile("serialization/built_value/serializers_util.mustache", srcFolder, "serializers_util.dart")); typeMapping.put("Array", "BuiltList"); typeMapping.put("array", "BuiltList"); @@ -557,6 +558,9 @@ private void adaptToDartInheritance(Map objs) { interfaceImports.addAll(cm.allOf); interfaceImports.addAll(cm.oneOf); interfaceImports.addAll(cm.anyOf); + if(!cm.oneOf.isEmpty() || !cm.anyOf.isEmpty()) { + interfaceImports.add("package:" + pubName + "/" + sourceFolder + "/serializers_util.dart"); + } cm.imports.addAll(rewriteImports(interfaceImports, true)); } } diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_serializer.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_serializer.mustache index 4cd02f3506de..a32b15b463df 100644 --- a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_serializer.mustache +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_serializer.mustache @@ -148,7 +148,9 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> { throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); {{/vendorExtensions.x-is-parent}} } - result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + result.oneOf = oneOfFactory( + OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult) + )<{{#mappedModels}}{{modelName}}{{^-last}}, {{/-last}}{{/mappedModels}}{{#vendorExtensions.x-is-parent}}{{#mappedModels}}, {{/mappedModels}}${{classname}}{{/vendorExtensions.x-is-parent}}>(); {{/discriminator}} {{/hasDiscriminatorWithNonEmptyMapping}} {{^hasDiscriminatorWithNonEmptyMapping}} @@ -173,7 +175,7 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> { {{! has no probs at all, pass the serialized as is }} oneOfDataSrc = serialized; {{/vendorExtensions.x-has-self-and-ancestor-only-props}} - result.oneOf = serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOf; + result.oneOf = oneOfFactory(serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOfDynamic)<{{#composedSchemas}}{{#oneOf}}{{{datatypeWithEnum}}}{{^-last}}, {{/-last}}{{/oneOf}}{{/composedSchemas}}>(); {{/hasDiscriminatorWithNonEmptyMapping}} return result.build(); {{/-first}} @@ -225,7 +227,9 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> { throw UnsupportedError("Couldn't deserialize anyOf for the discriminator value: ${discValue}"); {{/vendorExtensions.x-is-parent}} } - result.anyOf = AnyOfDynamic(values: {anyOfTypes.indexOf(anyOfType): anyOfResult}, types: anyOfTypes); + result.anyOf = anyOfFactory( + AnyOfDynamic(values: {anyOfTypes.indexOf(anyOfType): anyOfResult}, types: anyOfTypes) + )<{{#mappedModels}}{{modelName}}{{^-last}}, {{/-last}}{{/mappedModels}}{{#vendorExtensions.x-is-parent}}{{#mappedModels}}, {{/mappedModels}}${{classname}}{{/vendorExtensions.x-is-parent}}>(); {{/discriminator}} {{/hasDiscriminatorWithNonEmptyMapping}} {{^hasDiscriminatorWithNonEmptyMapping}} @@ -250,7 +254,7 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> { {{! has no probs at all, pass the serialized as is }} anyOfDataSrc = serialized; {{/vendorExtensions.x-has-self-and-ancestor-only-props}} - result.anyOf = serializers.deserialize(anyOfDataSrc, specifiedType: targetType) as AnyOf; + result.anyOf = anyOfFactory(serializers.deserialize(anyOfDataSrc, specifiedType: targetType) as AnyOfDynamic)<{{#composedSchemas}}{{#anyOf}}{{{datatypeWithEnum}}}{{^-last}}, {{/-last}}{{/anyOf}}{{/composedSchemas}}>(); {{/hasDiscriminatorWithNonEmptyMapping}} return result.build(); {{/-first}} diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/serializers_util.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/serializers_util.mustache new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/serializers_util.mustache @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} From 500a84a956d2707c495b8bbd8c1b5dfc4261c0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 5 Mar 2025 05:22:12 +0900 Subject: [PATCH 4/8] [dart][dart-dio] update sample --- .../dart-dio/oneof/.openapi-generator/FILES | 1 + .../dart-dio/oneof/lib/src/model/fruit.dart | 3 +- .../oneof/lib/src/serializers_util.dart | 74 +++++++++++++++++++ .../.openapi-generator/FILES | 1 + .../lib/src/model/bar_ref_or_value.dart | 5 +- .../lib/src/model/foo_ref_or_value.dart | 5 +- .../lib/src/model/fruit.dart | 5 +- .../lib/src/serializers_util.dart | 74 +++++++++++++++++++ .../oneof_primitive/.openapi-generator/FILES | 1 + .../lib/src/model/example.dart | 3 +- .../lib/src/serializers_util.dart | 74 +++++++++++++++++++ .../.openapi-generator/FILES | 1 + .../lib/src/serializers_util.dart | 74 +++++++++++++++++++ 13 files changed, 316 insertions(+), 5 deletions(-) create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof/lib/src/serializers_util.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers_util.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/serializers_util.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/src/serializers_util.dart diff --git a/samples/openapi3/client/petstore/dart-dio/oneof/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof/.openapi-generator/FILES index f1ab7b5540a3..cfdac167076b 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof/.openapi-generator/FILES @@ -20,4 +20,5 @@ lib/src/model/banana.dart lib/src/model/date.dart lib/src/model/fruit.dart lib/src/serializers.dart +lib/src/serializers_util.dart pubspec.yaml diff --git a/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart index d3932692e357..1cf671b9513c 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/model/fruit.dart @@ -5,6 +5,7 @@ // ignore_for_file: unused_element import 'package:openapi/src/model/apple.dart'; import 'package:openapi/src/model/banana.dart'; +import 'package:openapi/src/serializers_util.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:one_of/one_of.dart'; @@ -116,7 +117,7 @@ class _$FruitSerializer implements PrimitiveSerializer { result: result, ); oneOfDataSrc = unhandled; - result.oneOf = serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOf; + result.oneOf = oneOfFactory(serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOfDynamic)(); return result.build(); } } diff --git a/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/serializers_util.dart b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/serializers_util.dart new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof/lib/src/serializers_util.dart @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES index 5e9dbd5a0777..a0fa851b4883 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES @@ -52,4 +52,5 @@ lib/src/model/pasta.dart lib/src/model/pizza.dart lib/src/model/pizza_speziale.dart lib/src/serializers.dart +lib/src/serializers_util.dart pubspec.yaml diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart index f3fcbcb15c11..56c79dddd725 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/bar_ref_or_value.dart @@ -5,6 +5,7 @@ // ignore_for_file: unused_element import 'package:openapi/src/model/foo_ref_or_value.dart'; import 'package:openapi/src/model/bar_ref.dart'; +import 'package:openapi/src/serializers_util.dart'; import 'package:openapi/src/model/bar.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; @@ -128,7 +129,9 @@ class _$BarRefOrValueSerializer implements PrimitiveSerializer { default: throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); } - result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + result.oneOf = oneOfFactory( + OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult) + )(); return result.build(); } } diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart index 66ce17cb7229..cd60550dfbb2 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value.dart @@ -4,6 +4,7 @@ // ignore_for_file: unused_element import 'package:openapi/src/model/foo.dart'; +import 'package:openapi/src/serializers_util.dart'; import 'package:openapi/src/model/foo_ref.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; @@ -127,7 +128,9 @@ class _$FooRefOrValueSerializer implements PrimitiveSerializer { default: throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); } - result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + result.oneOf = oneOfFactory( + OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult) + )(); return result.build(); } } diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart index 84ff29129843..2df328089a73 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart @@ -6,6 +6,7 @@ import 'package:openapi/src/model/apple.dart'; import 'package:openapi/src/model/banana.dart'; import 'package:openapi/src/model/fruit_type.dart'; +import 'package:openapi/src/serializers_util.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; import 'package:one_of/one_of.dart'; @@ -159,7 +160,9 @@ class _$FruitSerializer implements PrimitiveSerializer { default: throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); } - result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + result.oneOf = oneOfFactory( + OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult) + )(); return result.build(); } } diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers_util.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers_util.dart new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers_util.dart @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/.openapi-generator/FILES index 7f2ac59bf645..fca8b5b7dde5 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/.openapi-generator/FILES @@ -18,4 +18,5 @@ lib/src/model/child.dart lib/src/model/date.dart lib/src/model/example.dart lib/src/serializers.dart +lib/src/serializers_util.dart pubspec.yaml diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart index c63d28690946..98fac4f6bbbf 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/model/example.dart @@ -4,6 +4,7 @@ // ignore_for_file: unused_element import 'package:openapi/src/model/child.dart'; +import 'package:openapi/src/serializers_util.dart'; import 'dart:core'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; @@ -65,7 +66,7 @@ class _$ExampleSerializer implements PrimitiveSerializer { Object? oneOfDataSrc; final targetType = const FullType(OneOf, [FullType(Child), FullType(int), ]); oneOfDataSrc = serialized; - result.oneOf = serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOf; + result.oneOf = oneOfFactory(serializers.deserialize(oneOfDataSrc, specifiedType: targetType) as OneOfDynamic)(); return result.build(); } } diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/serializers_util.dart b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/serializers_util.dart new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_primitive/lib/src/serializers_util.dart @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/.openapi-generator/FILES index 21ad1188dd90..db69a186b0bc 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/.openapi-generator/FILES @@ -126,4 +126,5 @@ lib/src/model/tag.dart lib/src/model/test_inline_freeform_additional_properties_request.dart lib/src/model/user.dart lib/src/serializers.dart +lib/src/serializers_util.dart pubspec.yaml diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/src/serializers_util.dart b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/src/serializers_util.dart new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake/lib/src/serializers_util.dart @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} From c6e9dc344ec79cee1243ee69f57c62b509cbfa03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 5 Mar 2025 05:22:40 +0900 Subject: [PATCH 5/8] [dart][dart-dio] add anyof test --- bin/configs/dart-dio-anyof.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 bin/configs/dart-dio-anyof.yaml diff --git a/bin/configs/dart-dio-anyof.yaml b/bin/configs/dart-dio-anyof.yaml new file mode 100644 index 000000000000..da2a92019ffa --- /dev/null +++ b/bin/configs/dart-dio-anyof.yaml @@ -0,0 +1,11 @@ +generatorName: dart-dio +outputDir: samples/openapi3/client/petstore/dart-dio/anyof +inputSpec: modules/openapi-generator/src/test/resources/3_0/anyOf.yaml +templateDir: modules/openapi-generator/src/main/resources/dart/libraries/dio +typeMappings: + Client: "ModelClient" + File: "ModelFile" + EnumClass: "ModelEnumClass" +additionalProperties: + hideGenerationTimestamp: "true" + enumUnknownDefaultCase: "true" From a029b20a46ea10619862a615f96dc697a2aa7403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 5 Mar 2025 05:25:26 +0900 Subject: [PATCH 6/8] [dart][dart-dio] update sample --- .../client/petstore/dart-dio/anyof/.gitignore | 41 ++++++ .../dart-dio/anyof/.openapi-generator-ignore | 23 ++++ .../dart-dio/anyof/.openapi-generator/FILES | 29 ++++ .../dart-dio/anyof/.openapi-generator/VERSION | 1 + .../client/petstore/dart-dio/anyof/README.md | 85 ++++++++++++ .../dart-dio/anyof/analysis_options.yaml | 9 ++ .../petstore/dart-dio/anyof/doc/Apple.md | 15 +++ .../petstore/dart-dio/anyof/doc/Banana.md | 15 +++ .../petstore/dart-dio/anyof/doc/DefaultApi.md | 51 +++++++ .../petstore/dart-dio/anyof/doc/Fruit.md | 17 +++ .../petstore/dart-dio/anyof/lib/openapi.dart | 18 +++ .../petstore/dart-dio/anyof/lib/src/api.dart | 73 ++++++++++ .../anyof/lib/src/api/default_api.dart | 94 +++++++++++++ .../dart-dio/anyof/lib/src/api_util.dart | 77 +++++++++++ .../anyof/lib/src/auth/api_key_auth.dart | 30 +++++ .../dart-dio/anyof/lib/src/auth/auth.dart | 18 +++ .../anyof/lib/src/auth/basic_auth.dart | 37 ++++++ .../anyof/lib/src/auth/bearer_auth.dart | 26 ++++ .../dart-dio/anyof/lib/src/auth/oauth.dart | 26 ++++ .../anyof/lib/src/date_serializer.dart | 31 +++++ .../dart-dio/anyof/lib/src/model/apple.dart | 108 +++++++++++++++ .../dart-dio/anyof/lib/src/model/banana.dart | 108 +++++++++++++++ .../dart-dio/anyof/lib/src/model/date.dart | 70 ++++++++++ .../dart-dio/anyof/lib/src/model/fruit.dart | 125 ++++++++++++++++++ .../dart-dio/anyof/lib/src/serializers.dart | 36 +++++ .../anyof/lib/src/serializers_util.dart | 74 +++++++++++ .../petstore/dart-dio/anyof/pubspec.yaml | 20 +++ .../dart-dio/anyof/test/apple_test.dart | 16 +++ .../dart-dio/anyof/test/banana_test.dart | 16 +++ .../dart-dio/anyof/test/default_api_test.dart | 16 +++ .../dart-dio/anyof/test/fruit_test.dart | 26 ++++ 31 files changed, 1331 insertions(+) create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/.gitignore create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator-ignore create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/VERSION create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/README.md create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/analysis_options.yaml create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/doc/Apple.md create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/doc/Banana.md create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/doc/DefaultApi.md create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/doc/Fruit.md create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/openapi.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api/default_api.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api_util.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/api_key_auth.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/auth.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/basic_auth.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/bearer_auth.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/oauth.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/date_serializer.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/apple.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/banana.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/date.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/fruit.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers_util.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/pubspec.yaml create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/test/apple_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/test/banana_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/test/default_api_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/anyof/test/fruit_test.dart diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/.gitignore b/samples/openapi3/client/petstore/dart-dio/anyof/.gitignore new file mode 100644 index 000000000000..4298cdcbd1a2 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/.gitignore @@ -0,0 +1,41 @@ +# See https://dart.dev/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.buildlog +.packages +.project +.pub/ +build/ +**/packages/ + +# Files created by dart2js +# (Most Dart developers will use pub build to compile Dart, use/modify these +# rules if you intend to use dart2js directly +# Convention is to use extension '.dart.js' for Dart compiled to Javascript to +# differentiate from explicit Javascript files) +*.dart.js +*.part.js +*.js.deps +*.js.map +*.info.json + +# Directory created by dartdoc +doc/api/ + +# Don't commit pubspec lock file +# (Library packages only! Remove pattern if developing an application package) +pubspec.lock + +# Don’t commit files and directories created by other development environments. +# For example, if your development environment creates any of the following files, +# consider putting them in a global ignore file: + +# IntelliJ +*.iml +*.ipr +*.iws +.idea/ + +# Mac +.DS_Store diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator-ignore b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES new file mode 100644 index 000000000000..67195a16eea9 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES @@ -0,0 +1,29 @@ +.gitignore +.openapi-generator-ignore +README.md +analysis_options.yaml +doc/Apple.md +doc/Banana.md +doc/DefaultApi.md +doc/Fruit.md +lib/openapi.dart +lib/src/api.dart +lib/src/api/default_api.dart +lib/src/api_util.dart +lib/src/auth/api_key_auth.dart +lib/src/auth/auth.dart +lib/src/auth/basic_auth.dart +lib/src/auth/bearer_auth.dart +lib/src/auth/oauth.dart +lib/src/date_serializer.dart +lib/src/model/apple.dart +lib/src/model/banana.dart +lib/src/model/date.dart +lib/src/model/fruit.dart +lib/src/serializers.dart +lib/src/serializers_util.dart +pubspec.yaml +test/apple_test.dart +test/banana_test.dart +test/default_api_test.dart +test/fruit_test.dart diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/VERSION b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/VERSION new file mode 100644 index 000000000000..96cfbb19ae28 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.13.0-SNAPSHOT diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/README.md b/samples/openapi3/client/petstore/dart-dio/anyof/README.md new file mode 100644 index 000000000000..9e65e355c0fe --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/README.md @@ -0,0 +1,85 @@ +# openapi (EXPERIMENTAL) +No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + +This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 0.0.1 +- Generator version: 7.13.0-SNAPSHOT +- Build package: org.openapitools.codegen.languages.DartDioClientCodegen + +## Requirements + +* Dart 2.15.0+ or Flutter 2.8.0+ +* Dio 5.0.0+ (https://pub.dev/packages/dio) + +## Installation & Usage + +### pub.dev +To use the package from [pub.dev](https://pub.dev), please include the following in pubspec.yaml +```yaml +dependencies: + openapi: 1.0.0 +``` + +### Github +If this Dart package is published to Github, please include the following in pubspec.yaml +```yaml +dependencies: + openapi: + git: + url: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + #ref: main +``` + +### Local development +To use the package from your local drive, please include the following in pubspec.yaml +```yaml +dependencies: + openapi: + path: /path/to/openapi +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```dart +import 'package:openapi/openapi.dart'; + + +final api = Openapi().getDefaultApi(); + +try { + final response = await api.rootGet(); + print(response); +} catch on DioException (e) { + print("Exception when calling DefaultApi->rootGet: $e\n"); +} + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://localhost* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +[*DefaultApi*](doc/DefaultApi.md) | [**rootGet**](doc/DefaultApi.md#rootget) | **GET** / | + + +## Documentation For Models + + - [Apple](doc/Apple.md) + - [Banana](doc/Banana.md) + - [Fruit](doc/Fruit.md) + + +## Documentation For Authorization + +Endpoints do not require authorization. + + +## Author + + + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/analysis_options.yaml b/samples/openapi3/client/petstore/dart-dio/anyof/analysis_options.yaml new file mode 100644 index 000000000000..16a95850087a --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/analysis_options.yaml @@ -0,0 +1,9 @@ +analyzer: + language: + strict-inference: true + strict-raw-types: true + strict-casts: false + exclude: + - test/*.dart + errors: + deprecated_member_use_from_same_package: ignore diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/doc/Apple.md b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Apple.md new file mode 100644 index 000000000000..c7f711b87cef --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Apple.md @@ -0,0 +1,15 @@ +# openapi.model.Apple + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**kind** | **String** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/doc/Banana.md b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Banana.md new file mode 100644 index 000000000000..bef8a58a4276 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Banana.md @@ -0,0 +1,15 @@ +# openapi.model.Banana + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**count** | **num** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/doc/DefaultApi.md b/samples/openapi3/client/petstore/dart-dio/anyof/doc/DefaultApi.md new file mode 100644 index 000000000000..b010661371f9 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/doc/DefaultApi.md @@ -0,0 +1,51 @@ +# openapi.api.DefaultApi + +## Load the API package +```dart +import 'package:openapi/api.dart'; +``` + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**rootGet**](DefaultApi.md#rootget) | **GET** / | + + +# **rootGet** +> Fruit rootGet() + + + +### Example +```dart +import 'package:openapi/api.dart'; + +final api = Openapi().getDefaultApi(); + +try { + final response = api.rootGet(); + print(response); +} catch on DioException (e) { + print('Exception when calling DefaultApi->rootGet: $e\n'); +} +``` + +### Parameters +This endpoint does not need any parameter. + +### Return type + +[**Fruit**](Fruit.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/doc/Fruit.md b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Fruit.md new file mode 100644 index 000000000000..5d48cc6e6d38 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/doc/Fruit.md @@ -0,0 +1,17 @@ +# openapi.model.Fruit + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**color** | **String** | | [optional] +**kind** | **String** | | [optional] +**count** | **num** | | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/openapi.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/openapi.dart new file mode 100644 index 000000000000..bdddadb4c579 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/openapi.dart @@ -0,0 +1,18 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +export 'package:openapi/src/api.dart'; +export 'package:openapi/src/auth/api_key_auth.dart'; +export 'package:openapi/src/auth/basic_auth.dart'; +export 'package:openapi/src/auth/bearer_auth.dart'; +export 'package:openapi/src/auth/oauth.dart'; +export 'package:openapi/src/serializers.dart'; +export 'package:openapi/src/model/date.dart'; + +export 'package:openapi/src/api/default_api.dart'; + +export 'package:openapi/src/model/apple.dart'; +export 'package:openapi/src/model/banana.dart'; +export 'package:openapi/src/model/fruit.dart'; + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api.dart new file mode 100644 index 000000000000..dfd8e847bdd9 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api.dart @@ -0,0 +1,73 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:built_value/serializer.dart'; +import 'package:openapi/src/serializers.dart'; +import 'package:openapi/src/auth/api_key_auth.dart'; +import 'package:openapi/src/auth/basic_auth.dart'; +import 'package:openapi/src/auth/bearer_auth.dart'; +import 'package:openapi/src/auth/oauth.dart'; +import 'package:openapi/src/api/default_api.dart'; + +class Openapi { + static const String basePath = r'http://localhost'; + + final Dio dio; + final Serializers serializers; + + Openapi({ + Dio? dio, + Serializers? serializers, + String? basePathOverride, + List? interceptors, + }) : this.serializers = serializers ?? standardSerializers, + this.dio = dio ?? + Dio(BaseOptions( + baseUrl: basePathOverride ?? basePath, + connectTimeout: const Duration(milliseconds: 5000), + receiveTimeout: const Duration(milliseconds: 3000), + )) { + if (interceptors == null) { + this.dio.interceptors.addAll([ + OAuthInterceptor(), + BasicAuthInterceptor(), + BearerAuthInterceptor(), + ApiKeyAuthInterceptor(), + ]); + } else { + this.dio.interceptors.addAll(interceptors); + } + } + + void setOAuthToken(String name, String token) { + if (this.dio.interceptors.any((i) => i is OAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is OAuthInterceptor) as OAuthInterceptor).tokens[name] = token; + } + } + + void setBearerAuth(String name, String token) { + if (this.dio.interceptors.any((i) => i is BearerAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BearerAuthInterceptor) as BearerAuthInterceptor).tokens[name] = token; + } + } + + void setBasicAuth(String name, String username, String password) { + if (this.dio.interceptors.any((i) => i is BasicAuthInterceptor)) { + (this.dio.interceptors.firstWhere((i) => i is BasicAuthInterceptor) as BasicAuthInterceptor).authInfo[name] = BasicAuthInfo(username, password); + } + } + + void setApiKey(String name, String apiKey) { + if (this.dio.interceptors.any((i) => i is ApiKeyAuthInterceptor)) { + (this.dio.interceptors.firstWhere((element) => element is ApiKeyAuthInterceptor) as ApiKeyAuthInterceptor).apiKeys[name] = apiKey; + } + } + + /// Get DefaultApi instance, base route and serializer can be overridden by a given but be careful, + /// by doing that all interceptors will not be executed + DefaultApi getDefaultApi() { + return DefaultApi(dio, serializers); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api/default_api.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api/default_api.dart new file mode 100644 index 000000000000..64c4b4eff3b6 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api/default_api.dart @@ -0,0 +1,94 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:async'; + +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +import 'package:openapi/src/model/fruit.dart'; + +class DefaultApi { + + final Dio _dio; + + final Serializers _serializers; + + const DefaultApi(this._dio, this._serializers); + + /// rootGet + /// + /// + /// Parameters: + /// * [cancelToken] - A [CancelToken] that can be used to cancel the operation + /// * [headers] - Can be used to add additional headers to the request + /// * [extras] - Can be used to add flags to the request + /// * [validateStatus] - A [ValidateStatus] callback that can be used to determine request success based on the HTTP status of the response + /// * [onSendProgress] - A [ProgressCallback] that can be used to get the send progress + /// * [onReceiveProgress] - A [ProgressCallback] that can be used to get the receive progress + /// + /// Returns a [Future] containing a [Response] with a [Fruit] as data + /// Throws [DioException] if API call or serialization fails + Future> rootGet({ + CancelToken? cancelToken, + Map? headers, + Map? extra, + ValidateStatus? validateStatus, + ProgressCallback? onSendProgress, + ProgressCallback? onReceiveProgress, + }) async { + final _path = r'/'; + final _options = Options( + method: r'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + ); + + final _response = await _dio.request( + _path, + options: _options, + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + Fruit? _responseData; + + try { + final rawResponse = _response.data; + _responseData = rawResponse == null ? null : _serializers.deserialize( + rawResponse, + specifiedType: const FullType(Fruit), + ) as Fruit; + + } catch (error, stackTrace) { + throw DioException( + requestOptions: _response.requestOptions, + response: _response, + type: DioExceptionType.unknown, + error: error, + stackTrace: stackTrace, + ); + } + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + requestOptions: _response.requestOptions, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api_util.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api_util.dart new file mode 100644 index 000000000000..ed3bb12f25b8 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/api_util.dart @@ -0,0 +1,77 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:dio/dio.dart'; + +/// Format the given form parameter object into something that Dio can handle. +/// Returns primitive or String. +/// Returns List/Map if the value is BuildList/BuiltMap. +dynamic encodeFormParameter(Serializers serializers, dynamic value, FullType type) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized is String) { + return serialized; + } + if (value is BuiltList || value is BuiltSet || value is BuiltMap) { + return serialized; + } + return json.encode(serialized); +} + +dynamic encodeQueryParameter( + Serializers serializers, + dynamic value, + FullType type, +) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + if (value is Uint8List) { + // Currently not sure how to serialize this + return value; + } + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (serialized == null) { + return ''; + } + if (serialized is String) { + return serialized; + } + return serialized; +} + +ListParam encodeCollectionQueryParameter( + Serializers serializers, + dynamic value, + FullType type, { + ListFormat format = ListFormat.multi, +}) { + final serialized = serializers.serialize( + value as Object, + specifiedType: type, + ); + if (value is BuiltList || value is BuiltSet) { + return ListParam(List.of((serialized as Iterable).cast()), format); + } + throw ArgumentError('Invalid value passed to encodeCollectionQueryParameter'); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/api_key_auth.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/api_key_auth.dart new file mode 100644 index 000000000000..ee16e3f0f92f --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/api_key_auth.dart @@ -0,0 +1,30 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + + +import 'package:dio/dio.dart'; +import 'package:openapi/src/auth/auth.dart'; + +class ApiKeyAuthInterceptor extends AuthInterceptor { + final Map apiKeys = {}; + + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'apiKey'); + for (final info in authInfo) { + final authName = info['name'] as String; + final authKeyName = info['keyName'] as String; + final authWhere = info['where'] as String; + final apiKey = apiKeys[authName]; + if (apiKey != null) { + if (authWhere == 'query') { + options.queryParameters[authKeyName] = apiKey; + } else { + options.headers[authKeyName] = apiKey; + } + } + } + super.onRequest(options, handler); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/auth.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/auth.dart new file mode 100644 index 000000000000..f7ae9bf3f11e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/auth.dart @@ -0,0 +1,18 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; + +abstract class AuthInterceptor extends Interceptor { + /// Get auth information on given route for the given type. + /// Can return an empty list if type is not present on auth data or + /// if route doesn't need authentication. + List> getAuthInfo(RequestOptions route, bool Function(Map secure) handles) { + if (route.extra.containsKey('secure')) { + final auth = route.extra['secure'] as List>; + return auth.where((secure) => handles(secure)).toList(); + } + return []; + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/basic_auth.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/basic_auth.dart new file mode 100644 index 000000000000..b65ccb5b71f7 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/basic_auth.dart @@ -0,0 +1,37 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:openapi/src/auth/auth.dart'; + +class BasicAuthInfo { + final String username; + final String password; + + const BasicAuthInfo(this.username, this.password); +} + +class BasicAuthInterceptor extends AuthInterceptor { + final Map authInfo = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final metadataAuthInfo = getAuthInfo(options, (secure) => (secure['type'] == 'http' && secure['scheme']?.toLowerCase() == 'basic') || secure['type'] == 'basic'); + for (final info in metadataAuthInfo) { + final authName = info['name'] as String; + final basicAuthInfo = authInfo[authName]; + if (basicAuthInfo != null) { + final basicAuth = 'Basic ${base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}'))}'; + options.headers['Authorization'] = basicAuth; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/bearer_auth.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/bearer_auth.dart new file mode 100644 index 000000000000..8f46678761b2 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/bearer_auth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:openapi/src/auth/auth.dart'; + +class BearerAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'http' && secure['scheme']?.toLowerCase() == 'bearer'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/oauth.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/oauth.dart new file mode 100644 index 000000000000..337cf762b0ce --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/auth/oauth.dart @@ -0,0 +1,26 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:dio/dio.dart'; +import 'package:openapi/src/auth/auth.dart'; + +class OAuthInterceptor extends AuthInterceptor { + final Map tokens = {}; + + @override + void onRequest( + RequestOptions options, + RequestInterceptorHandler handler, + ) { + final authInfo = getAuthInfo(options, (secure) => secure['type'] == 'oauth' || secure['type'] == 'oauth2'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + super.onRequest(options, handler); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/date_serializer.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/date_serializer.dart new file mode 100644 index 000000000000..db3c5c437db1 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/date_serializer.dart @@ -0,0 +1,31 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; +import 'package:openapi/src/model/date.dart'; + +class DateSerializer implements PrimitiveSerializer { + + const DateSerializer(); + + @override + Iterable get types => BuiltList.of([Date]); + + @override + String get wireName => 'Date'; + + @override + Date deserialize(Serializers serializers, Object serialized, + {FullType specifiedType = FullType.unspecified}) { + final parsed = DateTime.parse(serialized as String); + return Date(parsed.year, parsed.month, parsed.day); + } + + @override + Object serialize(Serializers serializers, Date date, + {FullType specifiedType = FullType.unspecified}) { + return date.toString(); + } +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/apple.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/apple.dart new file mode 100644 index 000000000000..02ca94190b96 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/apple.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'apple.g.dart'; + +/// Apple +/// +/// Properties: +/// * [kind] +@BuiltValue() +abstract class Apple implements Built { + @BuiltValueField(wireName: r'kind') + String? get kind; + + Apple._(); + + factory Apple([void updates(AppleBuilder b)]) = _$Apple; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(AppleBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$AppleSerializer(); +} + +class _$AppleSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Apple, _$Apple]; + + @override + final String wireName = r'Apple'; + + Iterable _serializeProperties( + Serializers serializers, + Apple object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.kind != null) { + yield r'kind'; + yield serializers.serialize( + object.kind, + specifiedType: const FullType(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + Apple object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required AppleBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'kind': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.kind = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Apple deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = AppleBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/banana.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/banana.dart new file mode 100644 index 000000000000..bf2d632ee114 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/banana.dart @@ -0,0 +1,108 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'banana.g.dart'; + +/// Banana +/// +/// Properties: +/// * [count] +@BuiltValue() +abstract class Banana implements Built { + @BuiltValueField(wireName: r'count') + num? get count; + + Banana._(); + + factory Banana([void updates(BananaBuilder b)]) = _$Banana; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(BananaBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$BananaSerializer(); +} + +class _$BananaSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Banana, _$Banana]; + + @override + final String wireName = r'Banana'; + + Iterable _serializeProperties( + Serializers serializers, + Banana object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.count != null) { + yield r'count'; + yield serializers.serialize( + object.count, + specifiedType: const FullType(num), + ); + } + } + + @override + Object serialize( + Serializers serializers, + Banana object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required BananaBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'count': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(num), + ) as num; + result.count = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Banana deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = BananaBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/date.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/date.dart new file mode 100644 index 000000000000..b21c7f544bee --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/date.dart @@ -0,0 +1,70 @@ +/// A gregorian calendar date generated by +/// OpenAPI generator to differentiate +/// between [DateTime] and [Date] formats. +class Date implements Comparable { + final int year; + + /// January is 1. + final int month; + + /// First day is 1. + final int day; + + Date(this.year, this.month, this.day); + + /// The current date + static Date now({bool utc = false}) { + var now = DateTime.now(); + if (utc) { + now = now.toUtc(); + } + return now.toDate(); + } + + /// Convert to a [DateTime]. + DateTime toDateTime({bool utc = false}) { + if (utc) { + return DateTime.utc(year, month, day); + } else { + return DateTime(year, month, day); + } + } + + @override + int compareTo(Date other) { + int d = year.compareTo(other.year); + if (d != 0) { + return d; + } + d = month.compareTo(other.month); + if (d != 0) { + return d; + } + return day.compareTo(other.day); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is Date && + runtimeType == other.runtimeType && + year == other.year && + month == other.month && + day == other.day; + + @override + int get hashCode => year.hashCode ^ month.hashCode ^ day.hashCode; + + @override + String toString() { + final yyyy = year.toString(); + final mm = month.toString().padLeft(2, '0'); + final dd = day.toString().padLeft(2, '0'); + + return '$yyyy-$mm-$dd'; + } +} + +extension DateTimeToDate on DateTime { + Date toDate() => Date(year, month, day); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/fruit.dart new file mode 100644 index 000000000000..958e5bec954e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/model/fruit.dart @@ -0,0 +1,125 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:openapi/src/model/apple.dart'; +import 'package:openapi/src/model/banana.dart'; +import 'package:openapi/src/serializers_util.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; +import 'package:one_of/any_of.dart'; + +part 'fruit.g.dart'; + +/// Fruit +/// +/// Properties: +/// * [color] +/// * [kind] +/// * [count] +@BuiltValue() +abstract class Fruit implements Built { + @BuiltValueField(wireName: r'color') + String? get color; + + /// Any Of [Apple], [Banana] + AnyOf2 get anyOf; + + Fruit._(); + + factory Fruit([void updates(FruitBuilder b)]) = _$Fruit; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(FruitBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$FruitSerializer(); +} + +class _$FruitSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Fruit, _$Fruit]; + + @override + final String wireName = r'Fruit'; + + Iterable _serializeProperties( + Serializers serializers, + Fruit object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + if (object.color != null) { + yield r'color'; + yield serializers.serialize( + object.color, + specifiedType: const FullType(String), + ); + } + } + + @override + Object serialize( + Serializers serializers, + Fruit object, { + FullType specifiedType = FullType.unspecified, + }) { + final anyOf = object.anyOf; + final result = _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + final serialized = serializers.serialize(anyOf, specifiedType: FullType(AnyOf, anyOf.valueTypes.map((type) => FullType(type)).toList())); + result.addAll((serialized is Map ? serialized.entries.map((e) => [e.key, e.value]).expand((e) => e) : serialized) as Iterable); + return result; + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required FruitBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'color': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(String), + ) as String; + result.color = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Fruit deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = FruitBuilder(); + Object? anyOfDataSrc; + final targetType = const FullType(AnyOf, [FullType(Apple), FullType(Banana), ]); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + anyOfDataSrc = unhandled; + result.anyOf = anyOfFactory(serializers.deserialize(anyOfDataSrc, specifiedType: targetType) as AnyOfDynamic)(); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers.dart new file mode 100644 index 000000000000..ddb1d66a1f5e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers.dart @@ -0,0 +1,36 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_import + +import 'package:one_of_serializer/any_of_serializer.dart'; +import 'package:one_of_serializer/one_of_serializer.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/json_object.dart'; +import 'package:built_value/serializer.dart'; +import 'package:built_value/standard_json_plugin.dart'; +import 'package:built_value/iso_8601_date_time_serializer.dart'; +import 'package:openapi/src/date_serializer.dart'; +import 'package:openapi/src/model/date.dart'; + +import 'package:openapi/src/model/apple.dart'; +import 'package:openapi/src/model/banana.dart'; +import 'package:openapi/src/model/fruit.dart'; + +part 'serializers.g.dart'; + +@SerializersFor([ + Apple, + Banana, + Fruit, +]) +Serializers serializers = (_$serializers.toBuilder() + ..add(const OneOfSerializer()) + ..add(const AnyOfSerializer()) + ..add(const DateSerializer()) + ..add(Iso8601DateTimeSerializer())) + .build(); + +Serializers standardSerializers = + (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(); diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers_util.dart b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers_util.dart new file mode 100644 index 000000000000..3bcef4f32a0e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/lib/src/serializers_util.dart @@ -0,0 +1,74 @@ +import 'package:one_of/any_of.dart'; +import 'package:one_of/one_of.dart'; + +Function oneOfFactory(OneOfDynamic oneOf) { + switch (oneOf.types.length) { + case 1: + return () => OneOf1(value: oneOf.value as T0); + case 2: + return () => OneOf2( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 3: + return () => OneOf3( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 4: + return () => OneOf4( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 5: + return () => OneOf5( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 6: + return () => OneOf6( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + case 7: + return () => + OneOf7( + value: oneOf.value, + typeIndex: oneOf.typeIndex, + ); + } + throw ArgumentError('Invalid number of types: ${oneOf.types.length}'); +} + +Function anyOfFactory(AnyOfDynamic anyOf) { + switch (anyOf.types.length) { + case 1: + return () => AnyOf1(value: anyOf.values[0] as T0); + case 2: + return () => AnyOf2( + values: anyOf.values, + ); + case 3: + return () => AnyOf3( + values: anyOf.values, + ); + case 4: + return () => AnyOf4( + values: anyOf.values, + ); + case 5: + return () => AnyOf5( + values: anyOf.values, + ); + case 6: + return () => AnyOf6( + values: anyOf.values, + ); + case 7: + return () => + AnyOf7( + values: anyOf.values, + ); + } + throw ArgumentError('Invalid number of types: ${anyOf.types.length}'); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/pubspec.yaml b/samples/openapi3/client/petstore/dart-dio/anyof/pubspec.yaml new file mode 100644 index 000000000000..d4121509b909 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/pubspec.yaml @@ -0,0 +1,20 @@ +name: openapi +version: 1.0.0 +description: OpenAPI API client +homepage: homepage + + +environment: + sdk: '>=2.18.0 <4.0.0' + +dependencies: + dio: '^5.7.0' + one_of: '>=1.5.0 <2.0.0' + one_of_serializer: '>=1.5.0 <2.0.0' + built_value: '>=8.4.0 <9.0.0' + built_collection: '>=5.1.1 <6.0.0' + +dev_dependencies: + built_value_generator: '>=8.4.0 <9.0.0' + build_runner: any + test: '^1.16.0' diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/test/apple_test.dart b/samples/openapi3/client/petstore/dart-dio/anyof/test/apple_test.dart new file mode 100644 index 000000000000..1d542169550d --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/test/apple_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Apple +void main() { + final instance = AppleBuilder(); + // TODO add properties to the builder and call build() + + group(Apple, () { + // String kind + test('to test the property `kind`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/test/banana_test.dart b/samples/openapi3/client/petstore/dart-dio/anyof/test/banana_test.dart new file mode 100644 index 000000000000..a883acc0a9e8 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/test/banana_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Banana +void main() { + final instance = BananaBuilder(); + // TODO add properties to the builder and call build() + + group(Banana, () { + // num count + test('to test the property `count`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/test/default_api_test.dart b/samples/openapi3/client/petstore/dart-dio/anyof/test/default_api_test.dart new file mode 100644 index 000000000000..07d256d2e554 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/test/default_api_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + + +/// tests for DefaultApi +void main() { + final instance = Openapi().getDefaultApi(); + + group(DefaultApi, () { + //Future rootGet() async + test('test rootGet', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/test/fruit_test.dart b/samples/openapi3/client/petstore/dart-dio/anyof/test/fruit_test.dart new file mode 100644 index 000000000000..c18790ae9566 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/anyof/test/fruit_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Fruit +void main() { + final instance = FruitBuilder(); + // TODO add properties to the builder and call build() + + group(Fruit, () { + // String color + test('to test the property `color`', () async { + // TODO + }); + + // String kind + test('to test the property `kind`', () async { + // TODO + }); + + // num count + test('to test the property `count`', () async { + // TODO + }); + + }); +} From e6f01b92eeefac2df3b9642abd8e69ce51d577f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Wed, 5 Mar 2025 05:45:35 +0900 Subject: [PATCH 7/8] [dart][dart-dio] update sample --- .../client/petstore/dart-dio/anyof/.openapi-generator/FILES | 5 ----- 1 file changed, 5 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES index 67195a16eea9..cfdac167076b 100644 --- a/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/anyof/.openapi-generator/FILES @@ -1,5 +1,4 @@ .gitignore -.openapi-generator-ignore README.md analysis_options.yaml doc/Apple.md @@ -23,7 +22,3 @@ lib/src/model/fruit.dart lib/src/serializers.dart lib/src/serializers_util.dart pubspec.yaml -test/apple_test.dart -test/banana_test.dart -test/default_api_test.dart -test/fruit_test.dart From e8189d875372c2f2c43410e6f1ec04ce690b7955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=B5=E3=81=81?= Date: Fri, 14 Mar 2025 02:34:42 +0900 Subject: [PATCH 8/8] [dart-dio] update dev dependencies in pubspec.yaml --- .../petstore_client_lib_fake_tests/pubspec.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake_tests/pubspec.yaml b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake_tests/pubspec.yaml index 5b4ebb1c5c09..ed6393164446 100644 --- a/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake_tests/pubspec.yaml +++ b/samples/openapi3/client/petstore/dart-dio/petstore_client_lib_fake_tests/pubspec.yaml @@ -8,11 +8,11 @@ environment: sdk: '>=2.15.0 <4.0.0' dev_dependencies: - built_collection: 5.1.1 - built_value: 8.4.3 - dio: 5.2.1 - http_mock_adapter: 0.4.2 - mockito: 5.2.0 + built_collection: '>=5.1.1 <6.0.0' + built_value: '>=8.4.0 <9.0.0' + dio: '^5.7.0' + http_mock_adapter: ^0.4.2 + mockito: ^5.2.0 openapi: path: ../petstore_client_lib_fake - test: 1.21.0 + test: '^1.16.0'