This repository has been archived by the owner on Dec 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 29
/
entity_generator.dart
114 lines (99 loc) · 3.71 KB
/
entity_generator.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import 'package:analyzer/dart/element/element.dart';
import 'package:code_builder/code_builder.dart';
import 'package:json_serializable/type_helper.dart';
import 'package:json_serializable/src/type_helpers/value_helper.dart';
import 'package:json_serializable/src/type_helpers/enum_helper.dart';
import 'package:json_serializable/src/type_helpers/iterable_helper.dart';
import 'package:json_serializable/src/type_helpers/map_helper.dart';
import 'entity_type_helper.dart';
import 'field_context.dart';
import 'identifier.dart';
import 'transformer_generator.dart';
import 'utils.dart';
class EntityGenerator {
final ClassElement _element;
final Set<FieldElement> _fields;
final Iterable<TypeHelper> _helpers;
final _fieldContexts = <FieldContext>[];
EntityGenerator(this._element, TransformerGenerator transformers,
EntityTypeHelper entities)
: _fields = sortedFieldSet(_element),
_helpers = <TypeHelper>[
transformers,
entities,
].followedBy([
ValueHelper(),
UriHelper(),
EnumHelper(),
IterableHelper(),
MapHelper(),
DateTimeHelper(),
]);
String build(DartEmitter emitter) => (StringBuffer()
..write(_buildEncoder().accept(emitter))
..write(_buildDecoder().accept(emitter))
..writeAll(_fieldContexts.expand((f) => f.members).toSet()))
.toString();
Method _buildEncoder() {
final obj = refer('obj');
final block = BlockBuilder()
..statements.add(Code('if (object == null) { return null; }'))
..addExpression(refer('Map<String, dynamic>', 'dart:core')
.newInstance([]).assignFinal('obj'));
for (var field in _fields) {
final fieldProperty = propertyAnnotation(field);
if (fieldProperty.ignore) {
continue;
}
final fieldContext = FieldContext(true, field.metadata, _helpers);
_fieldContexts.add(fieldContext);
block.addExpression(obj
.index(literalString(fieldProperty.name ?? field.displayName))
.assign(CodeExpression(Code(fieldContext.serialize(
field.type, 'object.${field.displayName}')))));
}
block.addExpression(obj.returned);
return Method((b) => b
..name = encodeMethod(_element)
..returns = refer('Map<String, dynamic>')
..requiredParameters.addAll([
Parameter((pb) => pb
..name = 'object'
..type = refer(_element.displayName)),
Parameter((pb) => pb
..name = 'inst'
..type = refer('Dartson', dartsonPackage))
])
..body = block.build());
}
Method _buildDecoder() {
final block = BlockBuilder()
..statements.add(Code('if (data == null) { return null; }'))
..addExpression(
refer(_element.displayName).newInstance([]).assignFinal('obj'));
for (var field in _fields) {
final fieldProperty = propertyAnnotation(field);
if (fieldProperty.ignore) {
continue;
}
final fieldContext = FieldContext(true, field.metadata, _helpers);
_fieldContexts.add(fieldContext);
block.addExpression(refer('obj').property(field.displayName).assign(
CodeExpression(Code(fieldContext.deserialize(field.type,
'data[\'${fieldProperty.name ?? field.displayName}\']')))));
}
block.addExpression(refer('obj').returned);
return Method((b) => b
..name = decodeMethod(_element)
..returns = refer(_element.displayName)
..requiredParameters.addAll([
Parameter((pb) => pb
..name = 'data'
..type = refer('Map<String, dynamic>')),
Parameter((pb) => pb
..name = 'inst'
..type = refer('Dartson', dartsonPackage))
])
..body = block.build());
}
}