Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix(dynamite)!: Use maxItems instead of maxLength to optimize arrays
Signed-off-by: provokateurin <[email protected]>
  • Loading branch information
provokateurin committed Apr 25, 2024
commit 57d8df4046b2661f850fa4a15dc5f89c313bbfb8
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ TypeResult _resolveType(

case openapi.Schema(type: openapi.SchemaType.array):
final TypeResult subResult;
if (schema.maxLength == 0) {
if (schema.maxItems == 0) {
subResult = TypeResultBase('Never');
} else if (schema.items != null) {
subResult = resolveType(
Expand Down
62 changes: 40 additions & 22 deletions packages/dynamite/dynamite/lib/src/helpers/pattern_check.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,45 @@ Iterable<Expression> buildPatternCheck(
String value,
String name,
) sync* {
if (schema.type == SchemaType.string) {
if (schema.pattern != null) {
yield refer('checkPattern', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
refer('RegExp').call([literalString(schema.pattern!, raw: true)]),
literalString(name),
]);
}
if (schema.minLength != null) {
yield refer('checkMinLength', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
literalNum(schema.minLength!),
literalString(name),
]);
}
if (schema.maxLength != null) {
yield refer('checkMaxLength', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
literalNum(schema.maxLength!),
literalString(name),
]);
}
switch (schema.type) {
case SchemaType.string:
if (schema.pattern != null) {
yield refer('checkPattern', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
refer('RegExp').call([literalString(schema.pattern!, raw: true)]),
literalString(name),
]);
}
if (schema.minLength != null) {
yield refer('checkMinLength', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
literalNum(schema.minLength!),
literalString(name),
]);
}
if (schema.maxLength != null) {
yield refer('checkMaxLength', 'package:dynamite_runtime/utils.dart').call([
refer(value).asA(refer('String?')),
literalNum(schema.maxLength!),
literalString(name),
]);
}
case SchemaType.array:
if (schema.minItems != null) {
yield refer('checkMinItems', 'package:dynamite_runtime/utils.dart').call([
refer(value).nullSafeProperty('length'),
literalNum(schema.minItems!),
literalString(name),
]);
}
if (schema.maxItems != null) {
yield refer('checkMaxItems', 'package:dynamite_runtime/utils.dart').call([
refer(value).nullSafeProperty('length'),
literalNum(schema.maxItems!),
literalString(name),
]);
}
default:
break;
}
}
4 changes: 4 additions & 0 deletions packages/dynamite/dynamite/lib/src/models/openapi/schema.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ abstract class Schema implements Built<Schema, SchemaBuilder> {

int? get maxLength;

int? get minItems;

int? get maxItems;

bool get nullable;

@memoized
Expand Down
42 changes: 42 additions & 0 deletions packages/dynamite/dynamite/lib/src/models/openapi/schema.g.dart

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

Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
/// Pattern check test Version: 0.0.1.
library; // ignore_for_file: no_leading_underscores_for_library_prefixes

import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart' as _i4;
Expand All @@ -25,8 +26,14 @@ abstract interface class $TestObjectInterface {
String? get minLength;
@BuiltValueField(wireName: 'max-length')
String? get maxLength;
@BuiltValueField(wireName: 'multiple-checks')
String? get multipleChecks;
@BuiltValueField(wireName: 'string-multiple-checks')
String? get stringMultipleChecks;
@BuiltValueField(wireName: 'min-items')
BuiltList<int>? get minItems;
@BuiltValueField(wireName: 'max-items')
BuiltList<int>? get maxItems;
@BuiltValueField(wireName: 'array-multiple-checks')
BuiltList<int>? get arrayMultipleChecks;
@BuiltValueHook(initializeBuilder: true)
static void _defaults($TestObjectInterfaceBuilder b) {}
@BuiltValueHook(finalizeBuilder: true)
Expand All @@ -47,19 +54,39 @@ abstract interface class $TestObjectInterface {
'maxLength',
);
_i1.checkPattern(
b.multipleChecks,
b.stringMultipleChecks,
RegExp(r'^[0-9]*$'),
'multipleChecks',
'stringMultipleChecks',
);
_i1.checkMinLength(
b.multipleChecks,
b.stringMultipleChecks,
3,
'multipleChecks',
'stringMultipleChecks',
);
_i1.checkMaxLength(
b.multipleChecks,
b.stringMultipleChecks,
20,
'multipleChecks',
'stringMultipleChecks',
);
_i1.checkMinItems(
b.minItems.length,
3,
'minItems',
);
_i1.checkMaxItems(
b.maxItems.length,
20,
'maxItems',
);
_i1.checkMinItems(
b.arrayMultipleChecks.length,
3,
'arrayMultipleChecks',
);
_i1.checkMaxItems(
b.arrayMultipleChecks.length,
20,
'arrayMultipleChecks',
);
}
}
Expand Down Expand Up @@ -103,7 +130,8 @@ abstract class TestObject implements $TestObjectInterface, Built<TestObject, Tes
final Serializers $serializers = _$serializers;
final Serializers _$serializers = (Serializers().toBuilder()
..addBuilderFactory(const FullType(TestObject), TestObjectBuilder.new)
..add(TestObject.serializer))
..add(TestObject.serializer)
..addBuilderFactory(const FullType(BuiltList, [FullType(int)]), ListBuilder<int>.new))
.build();

/// Serializer for all values in this library.
Expand Down
Loading