Skip to content

Commit

Permalink
refactor(dynamite): move defaults and validation methods to the inter…
Browse files Browse the repository at this point in the history
…face

Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
  • Loading branch information
Leptopoda committed Apr 19, 2024
1 parent 11a50bf commit f2c6a17
Show file tree
Hide file tree
Showing 79 changed files with 16,663 additions and 1,042 deletions.
42 changes: 42 additions & 0 deletions packages/dynamite/dynamite/example/lib/petstore.openapi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,10 @@ class $Client extends _i1.DynamiteClient {
abstract interface class $NewPetInterface {
String get name;
String? get tag;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($NewPetInterfaceBuilder b) {}
@BuiltValueHook(finalizeBuilder: true)
static void _validate($NewPetInterfaceBuilder b) {}
}

abstract class NewPet implements $NewPetInterface, Built<NewPet, NewPetBuilder> {
Expand All @@ -340,11 +344,25 @@ abstract class NewPet implements $NewPetInterface, Built<NewPet, NewPetBuilder>

/// Serializer for NewPet.
static Serializer<NewPet> get serializer => _$newPetSerializer;

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

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

@BuiltValue(instantiable: false)
abstract interface class $PetInterface implements $NewPetInterface {
int get id;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($PetInterfaceBuilder b) {}
@BuiltValueHook(finalizeBuilder: true)
static void _validate($PetInterfaceBuilder b) {}
}

abstract class Pet implements $PetInterface, Built<Pet, PetBuilder> {
Expand All @@ -367,12 +385,26 @@ abstract class Pet implements $PetInterface, Built<Pet, PetBuilder> {

/// Serializer for Pet.
static Serializer<Pet> get serializer => _$petSerializer;

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

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

@BuiltValue(instantiable: false)
abstract interface class $ErrorInterface {
int get code;
String get message;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($ErrorInterfaceBuilder b) {}
@BuiltValueHook(finalizeBuilder: true)
static void _validate($ErrorInterfaceBuilder b) {}
}

abstract class Error implements $ErrorInterface, Built<Error, ErrorBuilder> {
Expand All @@ -395,6 +427,16 @@ abstract class Error implements $ErrorInterface, Built<Error, ErrorBuilder> {

/// Serializer for Error.
static Serializer<Error> get serializer => _$errorSerializer;

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

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

// coverage:ignore-start
Expand Down
15 changes: 12 additions & 3 deletions packages/dynamite/dynamite/example/lib/petstore.openapi.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 61 additions & 0 deletions packages/dynamite/dynamite/lib/src/builder/resolve_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ Spec buildInterface(
BuiltList<Method>? methods,
Iterable<TypeResultObject>? interfaces,
String? documentation,
Iterable<String>? defaults,
Iterable<Expression>? validators,
}) {
assert((interfaces == null) != (methods == null), 'Either provide an interface or methods.');
final className = '\$$identifier$interfaceSuffix';
Expand All @@ -66,5 +68,64 @@ Spec buildInterface(
if (methods != null) {
b.methods.addAll(methods);
}

b.methods.add(
Method((b) {
b
..name = '_defaults'
..returns = refer('void')
..static = true
..annotations.add(
refer('BuiltValueHook').call([], {
'initializeBuilder': literalTrue,
}),
)
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
);
if (defaults != null && defaults.isNotEmpty) {
b.body = Code(
<String?>[
'b',
...defaults,
].join(),
);
} else {
b.body = const Code('');
}
}),
);

b.methods.add(
Method((b) {
b
..name = '_validate'
..returns = refer('void')
..annotations.add(
refer('BuiltValueHook').call([], {
'finalizeBuilder': literalTrue,
}),
)
..static = true
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
);
if (validators != null && validators.isNotEmpty) {
b.body = Block.of(
validators.map((v) => v.statement),
);
} else {
b.body = const Code('');
}
}),
);
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,13 @@ TypeResultObject resolveObject(
identifier,
methods: methods.build(),
documentation: schema.formattedDescription,
defaults: defaults.build(),
validators: validators.build(),
);

final $class = buildBuiltClass(
identifier,
documentation: schema.formattedDescription,
defaults: defaults.build(),
validators: validators.build(),
);

state.output.addAll([
Expand Down
103 changes: 44 additions & 59 deletions packages/dynamite/dynamite/lib/src/helpers/built_value.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,16 @@ const interfaceSuffix = 'Interface';
Spec buildBuiltClass(
String className, {
String? documentation,
Iterable<String>? defaults,
Iterable<Expression>? validators,
Iterable<Method>? methods,
}) =>
Class(
(b) {
final interfaceClass = '\$$className$interfaceSuffix';

b
..name = className
..abstract = true
..implements.addAll([
refer('\$$className$interfaceSuffix'),
refer(interfaceClass),
refer(
'Built<$className, ${className}Builder>',
),
Expand All @@ -35,67 +34,53 @@ Spec buildBuiltClass(
buildSerializer(className),
]);

if (methods != null) {
b.methods.addAll(methods);
}

if (documentation != null) {
b.docs.addAll(escapeDescription(documentation));
}

if (defaults != null && defaults.isNotEmpty) {
b.methods.add(
Method(
(b) => b
..name = '_defaults'
..returns = refer('void')
..static = true
..lambda = true
..annotations.add(
refer('BuiltValueHook').call([], {
'initializeBuilder': literalTrue,
}),
)
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
)
..body = Code(
<String?>[
'b',
...defaults,
].join(),
b.methods.add(
Method((b) {
b
..name = '_defaults'
..returns = refer('void')
..static = true
..annotations.add(
refer('BuiltValueHook').call([], {
'initializeBuilder': literalTrue,
}),
)
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
),
);
}
)
..body = Code('$interfaceClass._defaults(b);');
}),
);

if (validators != null && validators.isNotEmpty) {
b.methods.add(
Method((b) {
b
..name = '_validate'
..returns = refer('void')
..annotations.add(
refer('BuiltValueHook').call([], {'finalizeBuilder': literalTrue}),
)
..static = true
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
)
..body = Block.of(
validators.map((v) => v.statement),
);
}),
);
}
b.methods.add(
Method((b) {
b
..name = '_validate'
..returns = refer('void')
..annotations.add(
refer('BuiltValueHook').call([], {
'finalizeBuilder': literalTrue,
}),
)
..static = true
..requiredParameters.add(
Parameter(
(b) => b
..name = 'b'
..type = refer('${className}Builder'),
),
)
..body = Code('$interfaceClass._validate(b);');
}),
);
},
);

Expand Down

0 comments on commit f2c6a17

Please sign in to comment.