Skip to content

Commit 319720a

Browse files
committed
fix(dart-dio): PATCH tri-state optional handling
1 parent ed3acc8 commit 319720a

6 files changed

Lines changed: 28 additions & 3 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ public ModelsMap postProcessModels(ModelsMap objs) {
622622
if (useOptional) {
623623
for (ModelMap modelMap : objs.getModels()) {
624624
CodegenModel model = modelMap.getModel();
625+
boolean hasOptionalProperties = false;
625626

626627
boolean shouldUseOptional;
627628

@@ -636,9 +637,12 @@ public ModelsMap postProcessModels(ModelsMap objs) {
636637
for (CodegenProperty prop : model.vars) {
637638
if (!prop.required && !prop.dataType.startsWith("Optional<")) {
638639
wrapPropertyWithOptional(prop);
640+
hasOptionalProperties = true;
639641
}
640642
}
641643
}
644+
645+
model.vendorExtensions.put("x-has-optional-properties", hasOptionalProperties);
642646
}
643647
}
644648

modules/openapi-generator/src/main/resources/dart/libraries/dio/lib.mustache

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ export 'package:{{pubName}}/{{sourceFolder}}/auth/api_key_auth.dart';
44
export 'package:{{pubName}}/{{sourceFolder}}/auth/basic_auth.dart';
55
export 'package:{{pubName}}/{{sourceFolder}}/auth/bearer_auth.dart';
66
export 'package:{{pubName}}/{{sourceFolder}}/auth/oauth.dart';
7+
{{#useOptional}}export 'package:{{pubName}}/{{sourceFolder}}/optional.dart';
8+
{{/useOptional}}
79
{{#useBuiltValue}}export 'package:{{pubName}}/{{sourceFolder}}/serializers.dart';
810
{{#useDateLibCore}}export 'package:{{pubName}}/{{sourceFolder}}/{{modelPackage}}/date.dart';{{/useDateLibCore}}{{/useBuiltValue}}
911

modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class.mustache

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:built_value/built_value.dart';
22
import 'package:built_value/serializer.dart';{{#oneOf}}{{#-first}}
33
import 'package:one_of/one_of.dart';{{/-first}}{{/oneOf}}{{#anyOf}}{{#-first}}
44
import 'package:one_of/any_of.dart';{{/-first}}{{/anyOf}}
5+
{{#vendorExtensions.x-has-optional-properties}}
6+
import 'package:{{pubName}}/{{sourceFolder}}/optional.dart';{{/vendorExtensions.x-has-optional-properties}}
57

68
{{#imports}}
79
{{/imports}}

modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_members.mustache

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@
3131
factory {{classname}}([void updates({{classname}}Builder b)]) = _${{classname}};
3232

3333
@BuiltValueHook(initializeBuilder: true)
34-
static void _defaults({{{classname}}}Builder b) => b{{#vendorExtensions.x-parent-discriminator}}..{{propertyName}}=b.discriminatorValue{{/vendorExtensions.x-parent-discriminator}}{{#vendorExtensions.x-self-and-ancestor-only-props}}{{#defaultValue}}
35-
..{{{name}}} = {{#isEnum}}{{^isContainer}}{{#enumName}}{{enumName}}.valueOf({{{defaultValue}}}){{/enumName}}{{^enumName}}{{{defaultValue}}}{{/enumName}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/defaultValue}}{{/vendorExtensions.x-self-and-ancestor-only-props}};
34+
static void _defaults({{{classname}}}Builder b) => b{{#vendorExtensions.x-parent-discriminator}}..{{propertyName}}=b.discriminatorValue{{/vendorExtensions.x-parent-discriminator}}{{#vendorExtensions.x-self-and-ancestor-only-props}}{{#vendorExtensions.x-is-optional}}
35+
..{{{name}}} = Optional.absent(){{/vendorExtensions.x-is-optional}}{{^vendorExtensions.x-is-optional}}{{#defaultValue}}
36+
..{{{name}}} = {{#isEnum}}{{^isContainer}}{{#enumName}}{{enumName}}.valueOf({{{defaultValue}}}){{/enumName}}{{^enumName}}{{{defaultValue}}}{{/enumName}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{defaultValue}}}{{/isEnum}}{{/defaultValue}}{{/vendorExtensions.x-is-optional}}{{/vendorExtensions.x-self-and-ancestor-only-props}};
3637

3738
{{/vendorExtensions.x-is-parent}} @BuiltValueSerializer(custom: true)
3839
static Serializer<{{classname}}> get serializer => _${{classname}}Serializer();

modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_serializer.mustache

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> {
1111
FullType specifiedType = FullType.unspecified,
1212
}) sync* {
1313
{{#vendorExtensions.x-self-and-ancestor-only-props}}
14+
{{#vendorExtensions.x-is-optional}}
15+
if (object.{{{name}}}.isPresent) {
16+
yield r'{{baseName}}';
17+
final optionalValue = object.{{{name}}}.value;
18+
if (optionalValue == null) {
19+
yield null;
20+
} else {
21+
yield serializers.serialize(
22+
optionalValue,
23+
specifiedType: const {{>serialization/built_value/variable_serializer_type}},
24+
);
25+
}
26+
}
27+
{{/vendorExtensions.x-is-optional}}
28+
{{^vendorExtensions.x-is-optional}}
1429
{{#required}}
1530
{{!
1631
A required property need to always be part of the serialized output.
@@ -32,6 +47,7 @@ class _${{classname}}Serializer implements PrimitiveSerializer<{{classname}}> {
3247
);
3348
}
3449
{{/required}}
50+
{{/vendorExtensions.x-is-optional}}
3551
{{/vendorExtensions.x-self-and-ancestor-only-props}}
3652
}
3753

Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
FullType{{#isNullable}}.nullable{{/isNullable}}({{#isContainer}}{{baseType}}, [{{#isMap}}FullType(String), {{/isMap}}{{#items}}{{>serialization/built_value/variable_serializer_type}}{{/items}}]{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}{{/isContainer}})
1+
{{#vendorExtensions.x-is-optional}}{{#isContainer}}FullType{{#isNullable}}.nullable{{/isNullable}}({{baseType}}, [{{#isMap}}FullType(String), {{/isMap}}{{#items}}{{>serialization/built_value/variable_serializer_type}}{{/items}}]){{/isContainer}}{{^isContainer}}FullType.nullable({{{vendorExtensions.x-unwrapped-datatype}}}){{/isContainer}}{{/vendorExtensions.x-is-optional}}{{^vendorExtensions.x-is-optional}}FullType{{#isNullable}}.nullable{{/isNullable}}({{#isContainer}}{{baseType}}, [{{#isMap}}FullType(String), {{/isMap}}{{#items}}{{>serialization/built_value/variable_serializer_type}}{{/items}}]{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}{{/isContainer}}){{/vendorExtensions.x-is-optional}}

0 commit comments

Comments
 (0)