Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(dynamite): split JsonSchema into separate library #1931

Merged
merged 4 commits into from
Apr 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:dynamite/src/builder/resolve_type.dart';
import 'package:dynamite/src/builder/state.dart';
import 'package:dynamite/src/helpers/dart_helpers.dart';
import 'package:dynamite/src/helpers/dynamite.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';
import 'package:source_helper/source_helper.dart';
Expand All @@ -11,7 +12,7 @@ Spec buildBuiltClassSerializer(
State state,
String identifier,
openapi.OpenAPI spec,
openapi.Schema schema,
json_schema.ObjectSchema schema,
) =>
Class(
(b) => b
Expand Down Expand Up @@ -136,7 +137,7 @@ Iterable<String> deserializeProperty(
State state,
String identifier,
openapi.OpenAPI spec,
openapi.Schema schema,
json_schema.ObjectSchema schema,
) sync* {
for (final property in schema.properties!.entries) {
final propertyName = property.key;
Expand Down Expand Up @@ -168,7 +169,7 @@ Iterable<String> serializePropertyNullable(
State state,
String identifier,
openapi.OpenAPI spec,
openapi.Schema schema,
json_schema.ObjectSchema schema,
) sync* {
for (final property in schema.properties!.entries) {
final propertyName = property.key;
Expand Down Expand Up @@ -203,7 +204,7 @@ Iterable<String> serializeProperty(
State state,
String identifier,
openapi.OpenAPI spec,
openapi.Schema schema,
json_schema.ObjectSchema schema,
) sync* {
for (final property in schema.properties!.entries) {
final propertyName = property.key;
Expand Down
3 changes: 2 additions & 1 deletion packages/dynamite/dynamite/lib/src/builder/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:dynamite/src/helpers/docs.dart';
import 'package:dynamite/src/helpers/dynamite.dart';
import 'package:dynamite/src/helpers/logger.dart';
import 'package:dynamite/src/helpers/pattern_check.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';
import 'package:uri/uri.dart';
Expand Down Expand Up @@ -487,7 +488,7 @@ return ${allocate(responseType)}.fromRawResponse(_rawResponse);
spec,
state,
identifierBuilder.toString(),
openapi.Schema(
json_schema.ObjectSchema(
(b) => b
..properties.replace(
response.headers!.map(
Expand Down
3 changes: 2 additions & 1 deletion packages/dynamite/dynamite/lib/src/builder/resolve_enum.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:dynamite/src/builder/state.dart';
import 'package:dynamite/src/helpers/built_value.dart';
import 'package:dynamite/src/helpers/dart_helpers.dart';
import 'package:dynamite/src/helpers/docs.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';
import 'package:source_helper/source_helper.dart';
Expand All @@ -13,7 +14,7 @@ TypeResult resolveEnum(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema,
json_schema.JsonSchema schema,
TypeResult subResult, {
bool nullable = false,
}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import 'package:dynamite/src/helpers/dart_helpers.dart';
import 'package:dynamite/src/helpers/docs.dart';
import 'package:dynamite/src/helpers/dynamite.dart';
import 'package:dynamite/src/helpers/pattern_check.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';

Spec buildInterface(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema, {
json_schema.JsonSchema schema, {
bool isHeader = false,
bool nullable = false,
}) {
Expand All @@ -31,9 +32,9 @@ Spec buildInterface(
final defaults = StringBuffer();
final validators = BlockBuilder();

if (schema case openapi.Schema(:final allOf) when allOf != null) {
if (schema case json_schema.JsonSchema(:final allOf) when allOf != null) {
for (final schema in allOf) {
if (schema case openapi.Schema(properties: != null)) {
if (schema case json_schema.ObjectSchema(properties: != null)) {
_generateProperties(
schema,
spec,
Expand Down Expand Up @@ -73,7 +74,7 @@ Spec buildInterface(
}
} else {
_generateProperties(
schema,
schema as json_schema.ObjectSchema,
spec,
state,
identifier,
Expand Down Expand Up @@ -135,7 +136,7 @@ Spec buildInterface(
}

void _generateProperties(
openapi.Schema schema,
json_schema.ObjectSchema schema,
openapi.OpenAPI spec,
State state,
String identifier,
Expand Down Expand Up @@ -192,7 +193,7 @@ void _generateProperty(
ClassBuilder b,
String propertyName,
TypeResult result,
openapi.Schema schema,
json_schema.JsonSchema schema,
StringSink defaults,
BlockBuilder validators,
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import 'package:dynamite/src/builder/resolve_interface.dart';
import 'package:dynamite/src/builder/state.dart';
import 'package:dynamite/src/helpers/built_value.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';

TypeResultObject resolveObject(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema, {
json_schema.JsonSchema schema, {
bool nullable = false,
bool isHeader = false,
}) {
Expand Down
58 changes: 32 additions & 26 deletions packages/dynamite/dynamite/lib/src/builder/resolve_ofs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,49 @@ import 'package:collection/collection.dart';
import 'package:dynamite/src/builder/resolve_type.dart';
import 'package:dynamite/src/builder/state.dart';
import 'package:dynamite/src/helpers/docs.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';

TypeResult resolveSomeOf(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema, {
json_schema.JsonSchema schema, {
bool nullable = false,
}) {
final subResults = schema.ofs!
.mapIndexed(
(index, s) => resolveType(
spec,
state,
'$identifier$index',
s,
nullable: true,
),
)
.toBuiltSet();
BuiltSet<TypeResult> resolveSubTypes(BuiltList<json_schema.JsonSchema> ofs) {
return ofs.mapIndexed((index, schema) {
return resolveType(
spec,
state,
'$identifier$index',
schema,
nullable: true,
);
}).toBuiltSet();
}

TypeResultSomeOf result;
if (schema.oneOf != null) {
result = TypeResultOneOf(
identifier,
nullable: nullable,
subTypes: subResults,
);
} else if (schema.anyOf != null) {
result = TypeResultAnyOf(
identifier,
nullable: nullable,
subTypes: subResults,
);
} else {
throw StateError('allOf should be handled with inheritance');
switch (schema) {
case json_schema.JsonSchema(:final oneOf) when oneOf != null:
final subResults = resolveSubTypes(oneOf);

result = TypeResultOneOf(
identifier,
nullable: nullable,
subTypes: subResults,
);
case json_schema.JsonSchema(:final anyOf) when anyOf != null:
final subResults = resolveSubTypes(anyOf);

result = TypeResultAnyOf(
identifier,
nullable: nullable,
subTypes: subResults,
);
default:
throw StateError('allOf should be handled with inheritance');
}

if (state.resolvedTypes.add(result) && !result.isSingleValue) {
Expand Down
38 changes: 19 additions & 19 deletions packages/dynamite/dynamite/lib/src/builder/resolve_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:dynamite/src/builder/resolve_object.dart';
import 'package:dynamite/src/builder/resolve_ofs.dart';
import 'package:dynamite/src/builder/state.dart';
import 'package:dynamite/src/helpers/dart_helpers.dart';
import 'package:dynamite/src/models/json_schema.dart' as json_schema;
import 'package:dynamite/src/models/openapi.dart' as openapi;
import 'package:dynamite/src/models/type_result.dart';

Expand All @@ -14,7 +15,7 @@ TypeResult resolveType(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema, {
json_schema.JsonSchema schema, {
bool nullable = false,
}) {
final result = _resolveType(
Expand All @@ -33,11 +34,11 @@ TypeResult _resolveType(
openapi.OpenAPI spec,
State state,
String identifier,
openapi.Schema schema, {
json_schema.JsonSchema schema, {
bool nullable = false,
}) {
switch (schema) {
case openapi.Schema($enum: != null):
case json_schema.JsonSchema($enum: != null):
final subResult = resolveType(
spec,
state,
Expand All @@ -57,7 +58,7 @@ TypeResult _resolveType(
nullable: nullable,
);

case openapi.Schema(allOf: != null):
case json_schema.JsonSchema(allOf: != null):
return resolveObject(
spec,
state,
Expand All @@ -66,13 +67,13 @@ TypeResult _resolveType(
nullable: nullable,
);

case openapi.Schema(ref: null, ofs: null, type: null):
case json_schema.GenericSchema(ref: null, allOf: null, anyOf: null, oneOf: null):
return TypeResultBase(
'JsonObject',
nullable: nullable,
);

case openapi.Schema(ref: != null):
case json_schema.JsonSchema(ref: != null):
final name = schema.ref!.fragment.split('/').last;
final subResult = resolveType(
spec,
Expand All @@ -84,7 +85,7 @@ TypeResult _resolveType(

return subResult.asTypeDef;

case openapi.Schema(anyOf: != null) || openapi.Schema(oneOf: != null):
case json_schema.JsonSchema(anyOf: != null) || json_schema.JsonSchema(oneOf: != null):
return resolveSomeOf(
spec,
state,
Expand All @@ -93,7 +94,7 @@ TypeResult _resolveType(
nullable: nullable,
);

case openapi.Schema(isContentString: true):
case json_schema.StringSchema(isContentString: true):
final subResult = resolveType(
spec,
state,
Expand All @@ -107,43 +108,43 @@ TypeResult _resolveType(
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.boolean):
case json_schema.BooleanSchema():
return TypeResultBase(
'bool',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.integer):
case json_schema.IntegerSchema():
return TypeResultBase(
'int',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.number, format: 'float' || 'double'):
case json_schema.NumberSchema(format: 'float' || 'double'):
return TypeResultBase(
'double',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.number):
case json_schema.NumberSchema():
return TypeResultBase(
'num',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.string, format: 'binary'):
case json_schema.StringSchema(format: 'binary'):
return TypeResultBase(
'Uint8List',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.string):
case json_schema.StringSchema():
return TypeResultBase(
'String',
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.array):
case json_schema.ArraySchema():
final TypeResult subResult;
if (schema.maxItems == 0) {
subResult = TypeResultBase('Never');
Expand All @@ -164,7 +165,7 @@ TypeResult _resolveType(
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.object, properties: null):
case json_schema.ObjectSchema(properties: null):
if (schema.additionalProperties == null) {
return TypeResultBase(
'JsonObject',
Expand All @@ -184,15 +185,14 @@ TypeResult _resolveType(
);
}

case openapi.Schema(type: openapi.SchemaType.object, :final properties)
when properties != null && properties.isEmpty:
case json_schema.ObjectSchema(:final properties) when properties != null && properties.isEmpty:
return TypeResultMap(
'BuiltMap',
TypeResultBase('JsonObject'),
nullable: nullable,
);

case openapi.Schema(type: openapi.SchemaType.object):
case json_schema.ObjectSchema():
return resolveObject(
spec,
state,
Expand Down
Loading