Skip to content

Commit

Permalink
Merge pull request #78 from icapps/feature/#59-extend-model
Browse files Browse the repository at this point in the history
Feature/#59 extend model
  • Loading branch information
ikbendewilliam committed Nov 29, 2021
2 parents 04c11f8 + 0037846 commit 723a473
Show file tree
Hide file tree
Showing 25 changed files with 864 additions and 90 deletions.
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,19 @@ UserModel:
type: int
```

## Extends
If you want your models to expand any other model use extends:

*Note: It is not supported to extend custom models*
```yaml
UserDetails:
path: webservice/user
extends: UserModel
properties:
name:
type: string
```

## Default setup

Example of the `model_generator/config.yaml` file
Expand Down
20 changes: 18 additions & 2 deletions bin/model_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import 'dart:io';
import 'package:args/args.dart';
import 'package:model_generator/config/pubspec_config.dart';
import 'package:model_generator/config/yml_generator_config.dart';
import 'package:model_generator/model/field.dart';
import 'package:model_generator/model/model/custom_model.dart';
import 'package:model_generator/model/model/enum_model.dart';
import 'package:model_generator/model/model/json_converter_model.dart';
import 'package:model_generator/model/model/object_model.dart';
import 'package:model_generator/writer/enum_model_writer.dart';
import 'package:model_generator/writer/object_model_writer.dart';
import 'package:path/path.dart';
import 'package:collection/collection.dart';

Future<void> main(List<String> args) async {
final argParser = ArgParser()
Expand Down Expand Up @@ -62,8 +64,22 @@ void writeToFiles(
}
String? content;
if (model is ObjectModel) {
content =
ObjectModelWriter(pubspecConfig, model, modelGeneratorConfig).write();
final extendsModelfields = <Field>[];
var extendsModelextends = model.extendsModel;
while (extendsModelextends != null) {
final extendsModelextendsModel = modelGeneratorConfig.models
.firstWhereOrNull(
(element) => element.name == extendsModelextends)
as ObjectModel?; // ignore: avoid_as
extendsModelfields.addAll(extendsModelextendsModel?.fields ?? []);
extendsModelextends = extendsModelextendsModel?.extendsModel;
}
content = ObjectModelWriter(
pubspecConfig,
model,
extendsModelfields,
modelGeneratorConfig,
).write();
} else if (model is EnumModel) {
content = EnumModelWriter(model).write();
} else if (model is JsonConverterModel) {
Expand Down
78 changes: 78 additions & 0 deletions example/lib/model/user/profile/admin_profile_data.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import 'package:flutter/foundation.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:model_generator_example/model/ogm.dart';
import 'package:model_generator_example/model/user/person/person.dart';
import 'package:model_generator_example/model/user/profile/user_profile_data_extended.dart';
import 'package:model_generator_example/model/user/testing.dart';

part 'admin_profile_data.g.dart';

@JsonSerializable()
@immutable
class AdminProfileData extends UserProfileDataExtended {
@JsonKey(name: 'privileges', required: true)
final String privileges;

const AdminProfileData({
required this.privileges,
required String additionalField,
required String firstName,
required String lastName,
required String standardLanguage,
required String mainAccountNumber,
required String legalEmail,
required Testing phones,
required OGM legalAddress,
List<String>? offTrack,
List<OGM>? onTrack,
List<Person>? persons,
Map<String, Person>? personsById,
}) : super(
additionalField: additionalField,
firstName: firstName,
lastName: lastName,
standardLanguage: standardLanguage,
mainAccountNumber: mainAccountNumber,
legalEmail: legalEmail,
phones: phones,
legalAddress: legalAddress,
offTrack: offTrack,
onTrack: onTrack,
persons: persons,
personsById: personsById,
);

factory AdminProfileData.fromJson(Map<String, dynamic> json) =>
_$AdminProfileDataFromJson(json);

@override
Map<String, dynamic> toJson() => _$AdminProfileDataToJson(this);

@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AdminProfileData &&
runtimeType == other.runtimeType &&
privileges == other.privileges &&
super == other;

@override
int get hashCode => privileges.hashCode ^ super.hashCode;

@override
String toString() => 'AdminProfileData{'
'privileges: $privileges, '
'additionalField: $additionalField, '
'firstName: $firstName, '
'lastName: $lastName, '
'standardLanguage: $standardLanguage, '
'mainAccountNumber: $mainAccountNumber, '
'legalEmail: $legalEmail, '
'phones: $phones, '
'legalAddress: $legalAddress, '
'offTrack: $offTrack, '
'onTrack: $onTrack, '
'persons: $persons, '
'personsById: $personsById'
'}';
}
69 changes: 69 additions & 0 deletions example/lib/model/user/profile/admin_profile_data.g.dart

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

75 changes: 75 additions & 0 deletions example/lib/model/user/profile/user_profile_data_extended.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import 'package:flutter/foundation.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:model_generator_example/model/ogm.dart';
import 'package:model_generator_example/model/user/person/person.dart';
import 'package:model_generator_example/model/user/profile/user_profile_data.dart';
import 'package:model_generator_example/model/user/testing.dart';

part 'user_profile_data_extended.g.dart';

@JsonSerializable()
@immutable
class UserProfileDataExtended extends UserProfileData {
@JsonKey(name: 'additionalField', required: true)
final String additionalField;

const UserProfileDataExtended({
required this.additionalField,
required String firstName,
required String lastName,
required String standardLanguage,
required String mainAccountNumber,
required String legalEmail,
required Testing phones,
required OGM legalAddress,
List<String>? offTrack,
List<OGM>? onTrack,
List<Person>? persons,
Map<String, Person>? personsById,
}) : super(
firstName: firstName,
lastName: lastName,
standardLanguage: standardLanguage,
mainAccountNumber: mainAccountNumber,
legalEmail: legalEmail,
phones: phones,
legalAddress: legalAddress,
offTrack: offTrack,
onTrack: onTrack,
persons: persons,
personsById: personsById,
);

factory UserProfileDataExtended.fromJson(Map<String, dynamic> json) =>
_$UserProfileDataExtendedFromJson(json);

@override
Map<String, dynamic> toJson() => _$UserProfileDataExtendedToJson(this);

@override
bool operator ==(Object other) =>
identical(this, other) ||
other is UserProfileDataExtended &&
runtimeType == other.runtimeType &&
additionalField == other.additionalField &&
super == other;

@override
int get hashCode => additionalField.hashCode ^ super.hashCode;

@override
String toString() => 'UserProfileDataExtended{'
'additionalField: $additionalField, '
'firstName: $firstName, '
'lastName: $lastName, '
'standardLanguage: $standardLanguage, '
'mainAccountNumber: $mainAccountNumber, '
'legalEmail: $legalEmail, '
'phones: $phones, '
'legalAddress: $legalAddress, '
'offTrack: $offTrack, '
'onTrack: $onTrack, '
'persons: $persons, '
'personsById: $personsById'
'}';
}
68 changes: 68 additions & 0 deletions example/lib/model/user/profile/user_profile_data_extended.g.dart

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

Loading

0 comments on commit 723a473

Please sign in to comment.