Skip to content

Commit

Permalink
fix(dynamite): inherrit _defaults and _validate hooks in allOf
Browse files Browse the repository at this point in the history
Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
  • Loading branch information
Leptopoda committed Apr 20, 2024
1 parent 13f783c commit af959db
Show file tree
Hide file tree
Showing 13 changed files with 577 additions and 66 deletions.
9 changes: 7 additions & 2 deletions packages/dynamite/dynamite/example/lib/petstore.openapi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -360,9 +360,14 @@ abstract class NewPet implements $NewPetInterface, Built<NewPet, NewPetBuilder>
abstract interface class $PetInterface implements $NewPetInterface {
int get id;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($PetInterfaceBuilder b) {}
static void _defaults($PetInterfaceBuilder b) {
$NewPetInterface._defaults(b);
}

@BuiltValueHook(finalizeBuilder: true)
static void _validate($PetInterfaceBuilder b) {}
static void _validate($PetInterfaceBuilder b) {
$NewPetInterface._validate(b);
}
}

abstract class Pet implements $PetInterface, Built<Pet, PetBuilder> {
Expand Down
21 changes: 9 additions & 12 deletions packages/dynamite/dynamite/lib/src/builder/resolve_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Spec buildInterface(
..name = className
..annotations.add(refer('BuiltValue').call([], {'instantiable': literalFalse}));

final defaults = <String>[];
final defaults = StringBuffer();
final validators = BlockBuilder();

if (schema case openapi.Schema(:final allOf) when allOf != null) {
Expand All @@ -55,9 +55,11 @@ Spec buildInterface(
);

if (object is TypeResultObject) {
b.implements.add(
refer('\$${object.name}$interfaceSuffix'),
);
final interfaceName = '\$${object.name}$interfaceSuffix';
defaults.writeln('$interfaceName._defaults(b);');
validators.addExpression(refer('$interfaceName._validate').call([refer('b')]));

b.implements.add(refer(interfaceName));
} else {
final property = _generateProperty(
object,
Expand Down Expand Up @@ -101,12 +103,7 @@ Spec buildInterface(
),
);
if (defaults.isNotEmpty) {
b.body = Code(
<String?>[
'b',
...defaults,
].join(),
);
b.body = Code(defaults.toString());
} else {
b.body = const Code('');
}
Expand Down Expand Up @@ -143,7 +140,7 @@ void _generateProperties(
State state,
String identifier,
ClassBuilder b,
List<String> defaults,
StringSink defaults,
BlockBuilder validators, {
required bool isHeader,
}) {
Expand Down Expand Up @@ -191,7 +188,7 @@ void _generateProperties(
final $default = propertySchema.$default;
if ($default != null) {
final value = $default.toString();
defaults.add('..$dartName = ${valueToEscapedValue(result, value)};');
defaults.writeln('b.$dartName = ${valueToEscapedValue(result, value)};');
}

if (result is TypeResultOneOf && !result.isSingleValue) {
Expand Down
126 changes: 116 additions & 10 deletions packages/dynamite/dynamite_end_to_end_test/lib/all_of.openapi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ library; // ignore_for_file: no_leading_underscores_for_library_prefixes

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart' as _i3;
import 'package:dynamite_runtime/built_value.dart' as _i2;
import 'package:meta/meta.dart' as _i1;
import 'package:built_value/standard_json_plugin.dart' as _i4;
import 'package:dynamite_runtime/built_value.dart' as _i3;
import 'package:dynamite_runtime/utils.dart' as _i1;
import 'package:meta/meta.dart' as _i2;

part 'all_of.openapi.g.dart';

Expand Down Expand Up @@ -232,12 +233,113 @@ abstract class OneValueAllOf implements $OneValueAllOfInterface, Built<OneValueA
}
}

@BuiltValue(instantiable: false)
abstract interface class $SuperObjectInterface {
String get value;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($SuperObjectInterfaceBuilder b) {
b.value = '123';
}

@BuiltValueHook(finalizeBuilder: true)
static void _validate($SuperObjectInterfaceBuilder b) {
_i1.checkPattern(
b.value,
RegExp(r'^[0-9]*$'),
'value',
);
_i1.checkMinLength(
b.value,
3,
'value',
);
_i1.checkMaxLength(
b.value,
20,
'value',
);
}
}

abstract class SuperObject implements $SuperObjectInterface, Built<SuperObject, SuperObjectBuilder> {
/// Creates a new SuperObject object using the builder pattern.
factory SuperObject([void Function(SuperObjectBuilder)? b]) = _$SuperObject;

const SuperObject._();

/// Creates a new object from the given [json] data.
///
/// Use [toJson] to serialize it back into json.
factory SuperObject.fromJson(Map<String, dynamic> json) => _$jsonSerializers.deserializeWith(serializer, json)!;

/// Parses this object into a json like map.
///
/// Use the fromJson factory to revive it again.
Map<String, dynamic> toJson() => _$jsonSerializers.serializeWith(serializer, this)! as Map<String, dynamic>;

/// Serializer for SuperObject.
static Serializer<SuperObject> get serializer => _$superObjectSerializer;

@BuiltValueHook(initializeBuilder: true)
static void _defaults(SuperObjectBuilder b) {
$SuperObjectInterface._defaults(b);
}

@BuiltValueHook(finalizeBuilder: true)
static void _validate(SuperObjectBuilder b) {
$SuperObjectInterface._validate(b);
}
}

@BuiltValue(instantiable: false)
abstract interface class $SubObjectInterface implements $SuperObjectInterface {
@BuiltValueHook(initializeBuilder: true)
static void _defaults($SubObjectInterfaceBuilder b) {
$SuperObjectInterface._defaults(b);
}

@BuiltValueHook(finalizeBuilder: true)
static void _validate($SubObjectInterfaceBuilder b) {
$SuperObjectInterface._validate(b);
}
}

abstract class SubObject implements $SubObjectInterface, Built<SubObject, SubObjectBuilder> {
/// Creates a new SubObject object using the builder pattern.
factory SubObject([void Function(SubObjectBuilder)? b]) = _$SubObject;

const SubObject._();

/// Creates a new object from the given [json] data.
///
/// Use [toJson] to serialize it back into json.
factory SubObject.fromJson(Map<String, dynamic> json) => _$jsonSerializers.deserializeWith(serializer, json)!;

/// Parses this object into a json like map.
///
/// Use the fromJson factory to revive it again.
Map<String, dynamic> toJson() => _$jsonSerializers.serializeWith(serializer, this)! as Map<String, dynamic>;

/// Serializer for SubObject.
static Serializer<SubObject> get serializer => _$subObjectSerializer;

@BuiltValueHook(initializeBuilder: true)
static void _defaults(SubObjectBuilder b) {
$SubObjectInterface._defaults(b);
}

@BuiltValueHook(finalizeBuilder: true)
static void _validate(SubObjectBuilder b) {
$SubObjectInterface._validate(b);
}
}

// coverage:ignore-start
/// Serializer for all values in this library.
///
/// Serializes values into the `built_value` wire format.
/// See: [$jsonSerializers] for serializing into json.
@_i1.visibleForTesting
@_i2.visibleForTesting
final Serializers $serializers = _$serializers;
final Serializers _$serializers = (Serializers().toBuilder()
..addBuilderFactory(const FullType(ObjectAllOf), ObjectAllOfBuilder.new)
Expand All @@ -249,19 +351,23 @@ final Serializers _$serializers = (Serializers().toBuilder()
..addBuilderFactory(const FullType(MixedAllOf), MixedAllOfBuilder.new)
..add(MixedAllOf.serializer)
..addBuilderFactory(const FullType(OneValueAllOf), OneValueAllOfBuilder.new)
..add(OneValueAllOf.serializer))
..add(OneValueAllOf.serializer)
..addBuilderFactory(const FullType(SuperObject), SuperObjectBuilder.new)
..add(SuperObject.serializer)
..addBuilderFactory(const FullType(SubObject), SubObjectBuilder.new)
..add(SubObject.serializer))
.build();

/// Serializer for all values in this library.
///
/// Serializes values into the json. Json serialization is more expensive than the built_value wire format.
/// See: [$serializers] for serializing into the `built_value` wire format.
@_i1.visibleForTesting
@_i2.visibleForTesting
final Serializers $jsonSerializers = _$jsonSerializers;
final Serializers _$jsonSerializers = (_$serializers.toBuilder()
..add(_i2.DynamiteDoubleSerializer())
..addPlugin(_i3.StandardJsonPlugin())
..addPlugin(const _i2.HeaderPlugin())
..addPlugin(const _i2.ContentStringPlugin()))
..add(_i3.DynamiteDoubleSerializer())
..addPlugin(_i4.StandardJsonPlugin())
..addPlugin(const _i3.HeaderPlugin())
..addPlugin(const _i3.ContentStringPlugin()))
.build();
// coverage:ignore-end

0 comments on commit af959db

Please sign in to comment.