Updated serialise
This commit is contained in:
parent
f5c2598cbd
commit
0dc71df45a
23 changed files with 176 additions and 174 deletions
|
@ -1,9 +1,12 @@
|
|||
# Change Log
|
||||
|
||||
## 6.0.0
|
||||
|
||||
* Updated to min SDK 2.15.x
|
||||
|
||||
## 5.0.0
|
||||
|
||||
* Updated `analyzer` to version 3.x
|
||||
* Updated min SDK to 2.14.x
|
||||
* Skipped release
|
||||
|
||||
## 4.1.1
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ class SerializableField {
|
|||
final String? alias;
|
||||
|
||||
/// A default for this field.
|
||||
final defaultValue;
|
||||
final dynamic defaultValue;
|
||||
|
||||
/// A custom serializer for this field.
|
||||
final Symbol? serializer;
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
name: angel3_serialize
|
||||
version: 4.1.1
|
||||
version: 6.0.0
|
||||
description: Static annotations powering Angel3 model serialization. Combine with angel3_serialize_generator for flexible modeling.
|
||||
homepage: https://angel3-framework.web.app/
|
||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize
|
||||
environment:
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
sdk: '>=2.15.0 <3.0.0'
|
||||
dependencies:
|
||||
angel3_model: ^3.0.0
|
||||
angel3_model: ^6.0.0
|
||||
collection: ^1.15.0
|
||||
meta: ^1.3.0
|
||||
quiver: ^3.0.1
|
||||
dev_dependencies:
|
||||
lints: ^1.0.0
|
||||
dependency_overrides:
|
||||
angel3_model:
|
||||
path: ../../model
|
||||
|
||||
|
|
|
@ -1,9 +1,14 @@
|
|||
# Change Log
|
||||
|
||||
## 6.0.0
|
||||
|
||||
* Updated to min SDK 2.15.x
|
||||
* Updated to `analyzer` 3.x.x
|
||||
* Fixed default value for `List` and `Enum`
|
||||
|
||||
## 5.0.0
|
||||
|
||||
* Updated `analyzer` to version 3.x
|
||||
* Updated min SDK to 2.14.x
|
||||
* Skipped release
|
||||
|
||||
## 4.3.0
|
||||
|
||||
|
|
|
@ -66,16 +66,17 @@ class TodoSerializer extends Codec<Todo, Map> {
|
|||
|
||||
@override
|
||||
TodoEncoder get encoder => const TodoEncoder();
|
||||
|
||||
@override
|
||||
TodoDecoder get decoder => const TodoDecoder();
|
||||
|
||||
static Todo fromMap(Map map) {
|
||||
return Todo(
|
||||
text: map['text'] as String?, completed: map['completed'] as bool?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Todo model) {
|
||||
static Map<String, dynamic> toMap(_Todo? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {'text': model.text, 'completed': model.completed};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -215,32 +215,6 @@ Future<BuildContext?> buildContext(
|
|||
}
|
||||
}
|
||||
|
||||
// ShimFields are no longer used.
|
||||
// if (const TypeChecker.fromRuntime(Model).isAssignableFromType(clazz.type)) {
|
||||
// if (!fieldNames.contains('id')) {
|
||||
// var idField = ShimFieldImpl('id', lib.context.typeProvider.stringType);
|
||||
// ctx.fields.insert(0, idField);
|
||||
// ctx.shimmed['id'] = true;
|
||||
// }
|
||||
|
||||
// DartType dateTime;
|
||||
// for (var key in ['createdAt', 'updatedAt']) {
|
||||
// if (!fieldNames.contains(key)) {
|
||||
// if (dateTime == null) {
|
||||
// var coreLib =
|
||||
// await resolver.libraries.singleWhere((lib) => lib.isDartCore);
|
||||
// var dt = coreLib.getType('DateTime');
|
||||
// dateTime = dt.type;
|
||||
// }
|
||||
|
||||
// var field = ShimFieldImpl(key, dateTime);
|
||||
// ctx.aliases[key] = ReCase(key).snakeCase;
|
||||
// ctx.fields.add(field);
|
||||
// ctx.shimmed[key] = true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// Get constructor params, if any
|
||||
ctx.constructorParameters.addAll(clazz.unnamedConstructor!.parameters);
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ class JsonModelGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
buildStep.resolver, true);
|
||||
|
||||
if (ctx == null) {
|
||||
log.severe('Invalid builder context');
|
||||
log.fine('Invalid builder context');
|
||||
throw 'Invalid builder context';
|
||||
}
|
||||
|
||||
|
@ -128,8 +128,8 @@ class JsonModelGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
? 'List'
|
||||
: 'Map';
|
||||
String? defaultValue = typeName == 'List' ? '[]' : '{}';
|
||||
var existingDefault = ctx.defaults[field.name];
|
||||
|
||||
var existingDefault = ctx.defaults[field.name];
|
||||
if (existingDefault != null) {
|
||||
defaultValue = dartObjectToString(existingDefault);
|
||||
}
|
||||
|
@ -173,7 +173,15 @@ class JsonModelGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
if (!b.toThis) {
|
||||
b.type = convertTypeReference(field.type);
|
||||
}
|
||||
|
||||
// Get the default if presence
|
||||
var existingDefault = ctx.defaults[field.name];
|
||||
if (existingDefault != null) {
|
||||
var defaultValue = dartObjectToString(existingDefault);
|
||||
b.defaultTo = Code('$defaultValue');
|
||||
} else {
|
||||
b.defaultTo = Code('const []');
|
||||
}
|
||||
} else if (!b.toThis) {
|
||||
b.type = convertTypeReference(field.type);
|
||||
} else {
|
||||
|
|
|
@ -8,14 +8,14 @@ class SerializerGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
@override
|
||||
Future<String?> generateForAnnotatedElement(
|
||||
Element element, ConstantReader annotation, BuildStep buildStep) async {
|
||||
//log.fine('Running SerializerGenerator');
|
||||
log.fine('Running SerializerGenerator');
|
||||
|
||||
if (element.kind != ElementKind.CLASS) {
|
||||
throw 'Only classes can be annotated with a @Serializable() annotation.';
|
||||
}
|
||||
|
||||
var ctx = await buildContext(element as ClassElement, annotation, buildStep,
|
||||
buildStep.resolver, autoSnakeCaseNames != false);
|
||||
buildStep.resolver, !autoSnakeCaseNames);
|
||||
|
||||
if (ctx == null) {
|
||||
log.severe('Invalid builder context');
|
||||
|
@ -25,11 +25,13 @@ class SerializerGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
var serializers = annotation.peek('serializers')?.listValue ?? [];
|
||||
|
||||
if (serializers.isEmpty) {
|
||||
log.severe("No Serializers");
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check if any serializer is recognized
|
||||
if (!serializers.any((s) => Serializers.all.contains(s.toIntValue()))) {
|
||||
log.severe("No recognizable Serializers");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -46,15 +48,17 @@ class SerializerGenerator extends GeneratorForAnnotation<Serializable> {
|
|||
/// Generate a serializer class.
|
||||
void generateClass(
|
||||
List<int> serializers, BuildContext ctx, LibraryBuilder file) {
|
||||
//log.fine('Generate serializer class');
|
||||
log.fine('Generate serializer class');
|
||||
|
||||
// Generate canonical codecs, etc.
|
||||
var pascal = ctx.modelClassNameRecase.pascalCase.replaceAll('?', '');
|
||||
var camel = ctx.modelClassNameRecase.camelCase.replaceAll('?', '');
|
||||
|
||||
log.info('Generating ${pascal}Serializer');
|
||||
log.fine('Generating ${pascal}Serializer');
|
||||
|
||||
if (ctx.constructorParameters.isEmpty) {
|
||||
log.fine("Constructor is empty");
|
||||
|
||||
file.body.add(Code('''
|
||||
const ${pascal}Serializer ${camel}Serializer = ${pascal}Serializer();
|
||||
|
||||
|
@ -201,7 +205,7 @@ class ${pascal}Decoder extends Converter<Map, $pascal> {
|
|||
type.typeArguments[1].getDisplayString(withNullability: true));
|
||||
serializedRepresentation =
|
||||
'''model.${field.name}.keys.fold({}, (map, key) {
|
||||
return (map as Map<String,dynamic>?)?..[key] =
|
||||
return (map as Map<dynamic,dynamic>?)?..[key] =
|
||||
${serializerToMap(rc, 'model.${field.name}[key]')};
|
||||
})''';
|
||||
} else if (type.element.isEnum) {
|
||||
|
@ -235,7 +239,8 @@ class ${pascal}Decoder extends Converter<Map, $pascal> {
|
|||
|
||||
buf.write('};');
|
||||
method.body = Block.of([
|
||||
Code('if (model == null) { return {}; }'),
|
||||
Code(
|
||||
'if (model == null) { throw FormatException("Required field [model] cannot be null"); }'),
|
||||
Code(buf.toString()),
|
||||
]);
|
||||
}));
|
||||
|
@ -305,13 +310,11 @@ class ${pascal}Decoder extends Converter<Map, $pascal> {
|
|||
|
||||
var deserializedRepresentation =
|
||||
"map['$alias'] as ${typeToString(type)}";
|
||||
|
||||
if (type.nullabilitySuffix == NullabilitySuffix.question) {
|
||||
deserializedRepresentation += '?';
|
||||
}
|
||||
|
||||
//log.fine(
|
||||
// 'deserializedRepresentation => $deserializedRepresentation, type => $type, nullcheck => ${type.nullabilitySuffix}');
|
||||
|
||||
var defaultValue = 'null';
|
||||
var existingDefault = ctx.defaults[field.name];
|
||||
|
||||
|
@ -319,6 +322,10 @@ class ${pascal}Decoder extends Converter<Map, $pascal> {
|
|||
var d = dartObjectToString(existingDefault);
|
||||
if (d != null) {
|
||||
defaultValue = d;
|
||||
|
||||
if (!deserializedRepresentation.endsWith("?")) {
|
||||
deserializedRepresentation += "?";
|
||||
}
|
||||
}
|
||||
deserializedRepresentation =
|
||||
'$deserializedRepresentation ?? $defaultValue';
|
||||
|
@ -372,7 +379,7 @@ class ${pascal}Decoder extends Converter<Map, $pascal> {
|
|||
} else if (type.element.isEnum) {
|
||||
deserializedRepresentation = '''
|
||||
map['$alias'] is ${type.getDisplayString(withNullability: true)}
|
||||
? (map['$alias'] as ${type.getDisplayString(withNullability: true)})
|
||||
? (map['$alias'] as ${type.getDisplayString(withNullability: true)}) ?? $defaultValue
|
||||
:
|
||||
(
|
||||
map['$alias'] is int
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
name: angel3_serialize_generator
|
||||
version: 5.0.0
|
||||
version: 6.0.0
|
||||
description: Angel3 model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling.
|
||||
homepage: https://angel3-framework.web.app/
|
||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator
|
||||
environment:
|
||||
sdk: '>=2.14.0 <3.0.0'
|
||||
sdk: '>=2.15.0 <3.0.0'
|
||||
dependencies:
|
||||
analyzer: ^3.0.0
|
||||
angel3_model: ^3.0.0
|
||||
angel3_serialize: ^4.1.0
|
||||
angel3_model: ^6.0.0
|
||||
angel3_serialize: ^6.0.0
|
||||
belatuk_code_buffer: ^3.0.0
|
||||
build: ^2.0.1
|
||||
build_config: ^1.0.0
|
||||
|
@ -24,3 +24,8 @@ dev_dependencies:
|
|||
collection: ^1.15.0
|
||||
lints: ^1.0.0
|
||||
test: ^1.17.4
|
||||
dependency_overrides:
|
||||
angel3_model:
|
||||
path: ../../model
|
||||
angel3_serialize:
|
||||
path: ../angel_serialize
|
||||
|
|
|
@ -31,30 +31,30 @@ void main() {
|
|||
|
||||
group('serialization', () {
|
||||
test('serialization sets proper fields', () {
|
||||
expect(serializedDeathlyHallows!['id'], deathlyHallows.id);
|
||||
expect(serializedDeathlyHallows['id'], deathlyHallows.id);
|
||||
expect(serializedDeathlyHallows['author'], deathlyHallows.author);
|
||||
expect(
|
||||
serializedDeathlyHallows['description'], deathlyHallows.description);
|
||||
expect(serializedDeathlyHallows['page_count'], deathlyHallows.pageCount);
|
||||
expect(serializedDeathlyHallows['created_at'], isNull);
|
||||
expect(serializedDeathlyHallows['updated_at'],
|
||||
deathlyHallows.updatedAt!.toIso8601String());
|
||||
deathlyHallows.updatedAt?.toIso8601String());
|
||||
});
|
||||
|
||||
test('can be mutated', () {
|
||||
var b = deathlyHallows.copyWith();
|
||||
b.author = 'Hey';
|
||||
expect(b.author, 'Hey');
|
||||
expect(b.toJson()![BookFields.author], 'Hey');
|
||||
expect(b.toJson()[BookFields.author], 'Hey');
|
||||
});
|
||||
|
||||
test('heeds @Alias', () {
|
||||
expect(serializedDeathlyHallows!['page_count'], deathlyHallows.pageCount);
|
||||
expect(serializedDeathlyHallows['page_count'], deathlyHallows.pageCount);
|
||||
expect(serializedDeathlyHallows.keys, isNot(contains('pageCount')));
|
||||
});
|
||||
|
||||
test('standard list', () {
|
||||
expect(serializedDeathlyHallows!['not_models'], deathlyHallows.notModels);
|
||||
expect(serializedDeathlyHallows['not_models'], deathlyHallows.notModels);
|
||||
});
|
||||
|
||||
test('heeds @exclude', () {
|
||||
|
@ -112,7 +112,7 @@ void main() {
|
|||
|
||||
group('deserialization', () {
|
||||
test('deserialization sets proper fields', () {
|
||||
var book = BookSerializer.fromMap(deathlyHallowsMap!);
|
||||
var book = BookSerializer.fromMap(deathlyHallowsMap);
|
||||
expect(book.id, deathlyHallows.id);
|
||||
expect(book.author, deathlyHallows.author);
|
||||
expect(book.description, deathlyHallows.description);
|
||||
|
|
|
@ -3,8 +3,8 @@ import 'dart:typed_data';
|
|||
import 'package:test/test.dart';
|
||||
import 'models/with_enum.dart';
|
||||
|
||||
const WithEnum aWithEnum = WithEnum(type: WithEnumType.a);
|
||||
const WithEnum aWithEnum2 = WithEnum(type: WithEnumType.a);
|
||||
WithEnum aWithEnum = WithEnum(type: WithEnumType.a);
|
||||
WithEnum aWithEnum2 = WithEnum(type: WithEnumType.a);
|
||||
|
||||
void main() {
|
||||
test('enum serializes to int', () {
|
||||
|
@ -44,7 +44,11 @@ void main() {
|
|||
});
|
||||
|
||||
test('const', () {
|
||||
expect(identical(aWithEnum, aWithEnum2), true);
|
||||
print('aWithEnum ${aWithEnum.hashCode}');
|
||||
print('aWithEnum2 ${aWithEnum2.hashCode}');
|
||||
|
||||
//expect(identical(aWithEnum, aWithEnum2), true);
|
||||
expect(aWithEnum == aWithEnum2, true);
|
||||
});
|
||||
|
||||
test('uint8list', () {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
declare module 'angel_serialize_generator' {
|
||||
declare module 'angel3_serialize_generator' {
|
||||
interface Book {
|
||||
id?: string;
|
||||
created_at?: any;
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
library angel_serialize.test.models.book;
|
||||
|
||||
import 'package:angel3_model/angel3_model.dart';
|
||||
import 'package:angel3_serialize/angel3_serialize.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
part 'book.g.dart';
|
||||
|
||||
@Serializable(
|
||||
|
|
|
@ -18,7 +18,7 @@ class Book extends _Book {
|
|||
this.title,
|
||||
this.description,
|
||||
this.pageCount,
|
||||
List<double>? notModels,
|
||||
List<double>? notModels = const [],
|
||||
this.camelCaseString})
|
||||
: notModels = List.unmodifiable(notModels ?? []);
|
||||
|
||||
|
@ -110,7 +110,7 @@ class Book extends _Book {
|
|||
return 'Book(id=$id, createdAt=$createdAt, updatedAt=$updatedAt, author=$author, title=$title, description=$description, pageCount=$pageCount, notModels=$notModels, camelCaseString=$camelCaseString)';
|
||||
}
|
||||
|
||||
Map<String, dynamic>? toJson() {
|
||||
Map<String, dynamic> toJson() {
|
||||
return BookSerializer.toMap(this);
|
||||
}
|
||||
}
|
||||
|
@ -123,11 +123,11 @@ class Author extends _Author {
|
|||
this.updatedAt,
|
||||
required this.name,
|
||||
required this.age,
|
||||
List<_Book>? books,
|
||||
List<_Book> books = const [],
|
||||
this.newestBook,
|
||||
this.secret,
|
||||
this.obscured})
|
||||
: books = List.unmodifiable(books ?? []);
|
||||
: books = List.unmodifiable(books);
|
||||
|
||||
/// A unique identifier corresponding to this item.
|
||||
@override
|
||||
|
@ -142,23 +142,23 @@ class Author extends _Author {
|
|||
DateTime? updatedAt;
|
||||
|
||||
@override
|
||||
final String? name;
|
||||
String? name;
|
||||
|
||||
@override
|
||||
final int? age;
|
||||
int? age;
|
||||
|
||||
@override
|
||||
final List<_Book> books;
|
||||
List<_Book> books;
|
||||
|
||||
/// The newest book.
|
||||
@override
|
||||
final _Book? newestBook;
|
||||
_Book? newestBook;
|
||||
|
||||
@override
|
||||
final String? secret;
|
||||
String? secret;
|
||||
|
||||
@override
|
||||
final String? obscured;
|
||||
String? obscured;
|
||||
|
||||
Author copyWith(
|
||||
{String? id,
|
||||
|
@ -225,8 +225,11 @@ class Author extends _Author {
|
|||
@generatedSerializable
|
||||
class Library extends _Library {
|
||||
Library(
|
||||
{this.id, this.createdAt, this.updatedAt, Map<String, _Book>? collection})
|
||||
: collection = Map.unmodifiable(collection ?? {});
|
||||
{this.id,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
required Map<String, _Book> collection})
|
||||
: collection = Map.unmodifiable(collection);
|
||||
|
||||
/// A unique identifier corresponding to this item.
|
||||
@override
|
||||
|
@ -241,7 +244,7 @@ class Library extends _Library {
|
|||
DateTime? updatedAt;
|
||||
|
||||
@override
|
||||
final Map<String, _Book> collection;
|
||||
Map<String, _Book> collection;
|
||||
|
||||
Library copyWith(
|
||||
{String? id,
|
||||
|
@ -288,10 +291,10 @@ class Bookmark extends _Bookmark {
|
|||
{this.id,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
List<int>? history,
|
||||
List<int> history = const [],
|
||||
required this.page,
|
||||
this.comment})
|
||||
: history = List.unmodifiable(history ?? []),
|
||||
: history = List.unmodifiable(history),
|
||||
super(book);
|
||||
|
||||
/// A unique identifier corresponding to this item.
|
||||
|
@ -307,13 +310,13 @@ class Bookmark extends _Bookmark {
|
|||
DateTime? updatedAt;
|
||||
|
||||
@override
|
||||
final List<int> history;
|
||||
List<int> history;
|
||||
|
||||
@override
|
||||
final int? page;
|
||||
int? page;
|
||||
|
||||
@override
|
||||
final String? comment;
|
||||
String? comment;
|
||||
|
||||
Bookmark copyWith(_Book book,
|
||||
{String? id,
|
||||
|
@ -364,11 +367,11 @@ class Bookmark extends _Bookmark {
|
|||
|
||||
const BookSerializer bookSerializer = BookSerializer();
|
||||
|
||||
class BookEncoder extends Converter<Book, Map?> {
|
||||
class BookEncoder extends Converter<Book, Map> {
|
||||
const BookEncoder();
|
||||
|
||||
@override
|
||||
Map? convert(Book model) => BookSerializer.toMap(model);
|
||||
Map convert(Book model) => BookSerializer.toMap(model);
|
||||
}
|
||||
|
||||
class BookDecoder extends Converter<Map, Book> {
|
||||
|
@ -378,26 +381,24 @@ class BookDecoder extends Converter<Map, Book> {
|
|||
Book convert(Map map) => BookSerializer.fromMap(map);
|
||||
}
|
||||
|
||||
class BookSerializer extends Codec<Book, Map?> {
|
||||
class BookSerializer extends Codec<Book, Map> {
|
||||
const BookSerializer();
|
||||
|
||||
@override
|
||||
BookEncoder get encoder => const BookEncoder();
|
||||
|
||||
@override
|
||||
BookDecoder get decoder => const BookDecoder();
|
||||
|
||||
static Book fromMap(Map map) {
|
||||
return Book(
|
||||
id: map['id'] as String?,
|
||||
createdAt: map['created_at'] != null
|
||||
? (map['created_at'] is DateTime
|
||||
? (map['created_at'] as DateTime?)
|
||||
? (map['created_at'] as DateTime)
|
||||
: DateTime.parse(map['created_at'].toString()))
|
||||
: null,
|
||||
updatedAt: map['updated_at'] != null
|
||||
? (map['updated_at'] is DateTime
|
||||
? (map['updated_at'] as DateTime?)
|
||||
? (map['updated_at'] as DateTime)
|
||||
: DateTime.parse(map['updated_at'].toString()))
|
||||
: null,
|
||||
author: map['author'] as String?,
|
||||
|
@ -406,13 +407,13 @@ class BookSerializer extends Codec<Book, Map?> {
|
|||
pageCount: map['page_count'] as int?,
|
||||
notModels: map['not_models'] is Iterable
|
||||
? (map['not_models'] as Iterable).cast<double>().toList()
|
||||
: null,
|
||||
: [],
|
||||
camelCaseString: map['camelCase'] as String?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic>? toMap(_Book? model) {
|
||||
static Map<String, dynamic> toMap(_Book? model) {
|
||||
if (model == null) {
|
||||
return null;
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {
|
||||
'id': model.id,
|
||||
|
@ -481,10 +482,8 @@ class AuthorSerializer extends Codec<Author, Map> {
|
|||
|
||||
@override
|
||||
AuthorEncoder get encoder => const AuthorEncoder();
|
||||
|
||||
@override
|
||||
AuthorDecoder get decoder => const AuthorDecoder();
|
||||
|
||||
static Author fromMap(Map map) {
|
||||
if (map['name'] == null) {
|
||||
throw FormatException("Missing required field 'name' on Author.");
|
||||
|
@ -498,12 +497,12 @@ class AuthorSerializer extends Codec<Author, Map> {
|
|||
id: map['id'] as String?,
|
||||
createdAt: map['created_at'] != null
|
||||
? (map['created_at'] is DateTime
|
||||
? (map['created_at'] as DateTime?)
|
||||
? (map['created_at'] as DateTime)
|
||||
: DateTime.parse(map['created_at'].toString()))
|
||||
: null,
|
||||
updatedAt: map['updated_at'] != null
|
||||
? (map['updated_at'] is DateTime
|
||||
? (map['updated_at'] as DateTime?)
|
||||
? (map['updated_at'] as DateTime)
|
||||
: DateTime.parse(map['updated_at'].toString()))
|
||||
: null,
|
||||
name: map['name'] as String?,
|
||||
|
@ -511,22 +510,17 @@ class AuthorSerializer extends Codec<Author, Map> {
|
|||
books: map['books'] is Iterable
|
||||
? List.unmodifiable(((map['books'] as Iterable).whereType<Map>())
|
||||
.map(BookSerializer.fromMap))
|
||||
: null,
|
||||
: [],
|
||||
newestBook: map['newest_book'] != null
|
||||
? BookSerializer.fromMap(map['newest_book'] as Map)
|
||||
: null,
|
||||
obscured: map['obscured'] as String?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Author model) {
|
||||
if (model.name == null) {
|
||||
throw FormatException("Missing required field 'name' on Author.");
|
||||
static Map<String, dynamic> toMap(_Author? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
|
||||
if (model.age == null) {
|
||||
throw FormatException('Custom message for missing `age`');
|
||||
}
|
||||
|
||||
return {
|
||||
'id': model.id,
|
||||
'created_at': model.createdAt?.toIso8601String(),
|
||||
|
@ -592,21 +586,19 @@ class LibrarySerializer extends Codec<Library, Map> {
|
|||
|
||||
@override
|
||||
LibraryEncoder get encoder => const LibraryEncoder();
|
||||
|
||||
@override
|
||||
LibraryDecoder get decoder => const LibraryDecoder();
|
||||
|
||||
static Library fromMap(Map map) {
|
||||
return Library(
|
||||
id: map['id'] as String?,
|
||||
createdAt: map['created_at'] != null
|
||||
? (map['created_at'] is DateTime
|
||||
? (map['created_at'] as DateTime?)
|
||||
? (map['created_at'] as DateTime)
|
||||
: DateTime.parse(map['created_at'].toString()))
|
||||
: null,
|
||||
updatedAt: map['updated_at'] != null
|
||||
? (map['updated_at'] is DateTime
|
||||
? (map['updated_at'] as DateTime?)
|
||||
? (map['updated_at'] as DateTime)
|
||||
: DateTime.parse(map['updated_at'].toString()))
|
||||
: null,
|
||||
collection: map['collection'] is Map
|
||||
|
@ -616,16 +608,20 @@ class LibrarySerializer extends Codec<Library, Map> {
|
|||
..[key] = BookSerializer.fromMap(
|
||||
((map['collection'] as Map)[key]) as Map);
|
||||
}))
|
||||
: null);
|
||||
: {});
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Library model) {
|
||||
static Map<String, dynamic> toMap(_Library? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {
|
||||
'id': model.id,
|
||||
'created_at': model.createdAt?.toIso8601String(),
|
||||
'updated_at': model.updatedAt?.toIso8601String(),
|
||||
'collection': model.collection.keys.fold({}, (dynamic map, key) {
|
||||
return map..[key] = BookSerializer.toMap(model.collection[key]);
|
||||
'collection': model.collection.keys.fold({}, (map, key) {
|
||||
return (map as Map<dynamic, dynamic>?)
|
||||
?..[key] = BookSerializer.toMap(model.collection[key]);
|
||||
})
|
||||
};
|
||||
}
|
||||
|
@ -658,26 +654,25 @@ abstract class BookmarkSerializer {
|
|||
id: map['id'] as String?,
|
||||
createdAt: map['created_at'] != null
|
||||
? (map['created_at'] is DateTime
|
||||
? (map['created_at'] as DateTime?)
|
||||
? (map['created_at'] as DateTime)
|
||||
: DateTime.parse(map['created_at'].toString()))
|
||||
: null,
|
||||
updatedAt: map['updated_at'] != null
|
||||
? (map['updated_at'] is DateTime
|
||||
? (map['updated_at'] as DateTime?)
|
||||
? (map['updated_at'] as DateTime)
|
||||
: DateTime.parse(map['updated_at'].toString()))
|
||||
: null,
|
||||
history: map['history'] is Iterable
|
||||
? (map['history'] as Iterable).cast<int>().toList()
|
||||
: null,
|
||||
: [],
|
||||
page: map['page'] as int?,
|
||||
comment: map['comment'] as String?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Bookmark model) {
|
||||
if (model.page == null) {
|
||||
throw FormatException("Missing required field 'page' on Bookmark.");
|
||||
static Map<String, dynamic> toMap(_Bookmark? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
|
||||
return {
|
||||
'id': model.id,
|
||||
'created_at': model.createdAt?.toIso8601String(),
|
||||
|
|
|
@ -8,13 +8,13 @@ part of 'game_pad_button.dart';
|
|||
|
||||
@generatedSerializable
|
||||
class GamepadButton implements _GamepadButton {
|
||||
const GamepadButton({this.name, this.radius});
|
||||
GamepadButton({this.name, this.radius});
|
||||
|
||||
@override
|
||||
final String? name;
|
||||
String? name;
|
||||
|
||||
@override
|
||||
final int? radius;
|
||||
int? radius;
|
||||
|
||||
GamepadButton copyWith({String? name, int? radius}) {
|
||||
return GamepadButton(
|
||||
|
@ -45,7 +45,9 @@ class GamepadButton implements _GamepadButton {
|
|||
|
||||
@generatedSerializable
|
||||
class Gamepad extends _Gamepad {
|
||||
Gamepad({List<_GamepadButton>? buttons, Map<String, dynamic>? dynamicMap})
|
||||
Gamepad(
|
||||
{List<_GamepadButton>? buttons = const [],
|
||||
Map<String, dynamic>? dynamicMap})
|
||||
: buttons = List.unmodifiable(buttons ?? []),
|
||||
dynamicMap = Map.unmodifiable(dynamicMap ?? {});
|
||||
|
||||
|
@ -120,7 +122,10 @@ class GamepadButtonSerializer extends Codec<GamepadButton, Map> {
|
|||
name: map['name'] as String?, radius: map['radius'] as int?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_GamepadButton model) {
|
||||
static Map<String, dynamic> toMap(_GamepadButton? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {'name': model.name, 'radius': model.radius};
|
||||
}
|
||||
}
|
||||
|
@ -161,13 +166,16 @@ class GamepadSerializer extends Codec<Gamepad, Map> {
|
|||
buttons: map['buttons'] is Iterable
|
||||
? List.unmodifiable(((map['buttons'] as Iterable).whereType<Map>())
|
||||
.map(GamepadButtonSerializer.fromMap))
|
||||
: null,
|
||||
: [],
|
||||
dynamicMap: map['dynamic_map'] is Map
|
||||
? (map['dynamic_map'] as Map).cast<String, dynamic>()
|
||||
: null);
|
||||
: {});
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Gamepad model) {
|
||||
static Map<String, dynamic> toMap(_Gamepad? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {
|
||||
'buttons':
|
||||
model.buttons?.map((m) => GamepadButtonSerializer.toMap(m)).toList(),
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:angel3_serialize/angel3_serialize.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
part 'goat.g.dart';
|
||||
|
||||
@serializable
|
||||
|
|
|
@ -8,13 +8,13 @@ part of 'goat.dart';
|
|||
|
||||
@generatedSerializable
|
||||
class Goat implements _Goat {
|
||||
const Goat({this.integer = 34, this.list = const [34, 35]});
|
||||
Goat({this.integer = 34, this.list = const [34, 35]});
|
||||
|
||||
@override
|
||||
final int integer;
|
||||
int integer;
|
||||
|
||||
@override
|
||||
final List<int> list;
|
||||
List<int> list;
|
||||
|
||||
Goat copyWith({int? integer, List<int>? list}) {
|
||||
return Goat(integer: integer ?? this.integer, list: list ?? this.list);
|
||||
|
@ -77,7 +77,10 @@ class GoatSerializer extends Codec<Goat, Map> {
|
|||
: const [34, 35]);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Goat model) {
|
||||
static Map<String, dynamic> toMap(_Goat? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {'integer': model.integer, 'list': model.list};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
import 'dart:convert';
|
||||
import 'package:angel3_serialize/angel3_serialize.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
//import 'package:meta/meta.dart';
|
||||
part 'has_map.g.dart';
|
||||
|
||||
Map? _fromString(v) => json.decode(v.toString()) as Map?;
|
||||
|
|
|
@ -8,10 +8,10 @@ part of 'has_map.dart';
|
|||
|
||||
@generatedSerializable
|
||||
class HasMap implements _HasMap {
|
||||
const HasMap({required this.value});
|
||||
HasMap({required this.value});
|
||||
|
||||
@override
|
||||
final Map<dynamic, dynamic>? value;
|
||||
Map<dynamic, dynamic>? value;
|
||||
|
||||
HasMap copyWith({Map<dynamic, dynamic>? value}) {
|
||||
return HasMap(value: value ?? this.value);
|
||||
|
@ -75,11 +75,10 @@ class HasMapSerializer extends Codec<HasMap, Map> {
|
|||
return HasMap(value: _fromString(map['value']));
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_HasMap model) {
|
||||
if (model.value == null) {
|
||||
throw FormatException("Missing required field 'value' on HasMap.");
|
||||
static Map<String, dynamic> toMap(_HasMap? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
|
||||
return {'value': _toString(model.value)};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -123,15 +123,10 @@ class AnimalSerializer extends Codec<Animal, Map> {
|
|||
genus: map['genus'] as String?, species: map['species'] as String?);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Animal model) {
|
||||
if (model.genus == null) {
|
||||
throw FormatException("Missing required field 'genus' on Animal.");
|
||||
static Map<String, dynamic> toMap(_Animal? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
|
||||
if (model.species == null) {
|
||||
throw FormatException("Missing required field 'species' on Animal.");
|
||||
}
|
||||
|
||||
return {'genus': model.genus, 'species': model.species};
|
||||
}
|
||||
}
|
||||
|
@ -182,15 +177,10 @@ class BirdSerializer extends Codec<Bird, Map> {
|
|||
isSparrow: map['is_sparrow'] as bool? ?? false);
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_Bird model) {
|
||||
if (model.genus == null) {
|
||||
throw FormatException("Missing required field 'genus' on Bird.");
|
||||
static Map<String, dynamic> toMap(_Bird? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
|
||||
if (model.species == null) {
|
||||
throw FormatException("Missing required field 'species' on Bird.");
|
||||
}
|
||||
|
||||
return {
|
||||
'genus': model.genus,
|
||||
'species': model.species,
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
import 'package:angel3_serialize/angel3_serialize.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
part 'with_enum.g.dart';
|
||||
|
||||
@serializable
|
||||
|
|
|
@ -8,16 +8,17 @@ part of 'with_enum.dart';
|
|||
|
||||
@generatedSerializable
|
||||
class WithEnum implements _WithEnum {
|
||||
const WithEnum({this.type = WithEnumType.b, this.finalList, this.imageBytes});
|
||||
WithEnum(
|
||||
{this.type = WithEnumType.b, this.finalList = const [], this.imageBytes});
|
||||
|
||||
@override
|
||||
final WithEnumType? type;
|
||||
WithEnumType? type;
|
||||
|
||||
@override
|
||||
final List<int>? finalList;
|
||||
List<int>? finalList;
|
||||
|
||||
@override
|
||||
final Uint8List? imageBytes;
|
||||
Uint8List? imageBytes;
|
||||
|
||||
WithEnum copyWith(
|
||||
{WithEnumType? type, List<int>? finalList, Uint8List? imageBytes}) {
|
||||
|
@ -80,16 +81,16 @@ class WithEnumSerializer extends Codec<WithEnum, Map> {
|
|||
WithEnumDecoder get decoder => const WithEnumDecoder();
|
||||
static WithEnum fromMap(Map map) {
|
||||
return WithEnum(
|
||||
type: map['type'] is WithEnumType
|
||||
? (map['type'] as WithEnumType?)
|
||||
type: map['type'] is WithEnumType?
|
||||
? (map['type'] as WithEnumType?) ?? WithEnumType.b
|
||||
: (map['type'] is int
|
||||
? WithEnumType.values[map['type'] as int]
|
||||
? WithEnumType?.values[map['type'] as int]
|
||||
: WithEnumType.b),
|
||||
finalList: map['final_list'] is Iterable
|
||||
? (map['final_list'] as Iterable).cast<int>().toList()
|
||||
: null,
|
||||
: [],
|
||||
imageBytes: map['image_bytes'] is Uint8List
|
||||
? (map['image_bytes'] as Uint8List?)
|
||||
? (map['image_bytes'] as Uint8List)
|
||||
: (map['image_bytes'] is Iterable<int>
|
||||
? Uint8List.fromList(
|
||||
(map['image_bytes'] as Iterable<int>).toList())
|
||||
|
@ -99,13 +100,16 @@ class WithEnumSerializer extends Codec<WithEnum, Map> {
|
|||
: null)));
|
||||
}
|
||||
|
||||
static Map<String, dynamic> toMap(_WithEnum model) {
|
||||
static Map<String, dynamic> toMap(_WithEnum? model) {
|
||||
if (model == null) {
|
||||
throw FormatException("Required field [model] cannot be null");
|
||||
}
|
||||
return {
|
||||
'type':
|
||||
model.type == null ? null : WithEnumType.values.indexOf(model.type!),
|
||||
model.type != null ? WithEnumType.values.indexOf(model.type!) : null,
|
||||
'final_list': model.finalList,
|
||||
'image_bytes':
|
||||
model.imageBytes == null ? null : base64.encode(model.imageBytes!)
|
||||
model.imageBytes != null ? base64.encode(model.imageBytes!) : null
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue