serializedPropsToEntity<Model> function

Entity<dynamic, Object> serializedPropsToEntity<Model>(
  1. Map<String, dynamic> json, {
  2. List<EntityTypeConverter> converters = const [],
})

Implementation

Entity serializedPropsToEntity<Model>(
  final Map<String, dynamic> json, {
  List<EntityTypeConverter> converters = const [],
}) {
  final mirror = reflectEntity<Model>();
  final entityMeta = getEntityMetaData(Model);
  final entityProperties = getEntityProperties(Model);
  final constructorMethod =
      mirror.declarations.entries.firstWhereOrNull((e) => e.key == '$Model')?.value as MethodMirror;
  final constructorParams = constructorMethod.parameters;

  final mappedConverters = _combineConverters(entityMeta.converters ?? [], converters);

  /// conversion to Database compatible types using [EntityTypeConverter]
  final transformedRecordMap = <String, dynamic>{};
  for (final entry in entityProperties.entries) {
    final value = json[entry.value.dbColumnName];
    final typeConverter = mappedConverters[entry.value.type];
    transformedRecordMap[entry.value.dartName] = typeConverter == null ? value : typeConverter.fromDbType(value);
  }

  final namedDeps = constructorParams
      .where((e) => e.isNamed)
      .map((e) => (name: e.simpleName, value: transformedRecordMap[e.simpleName]))
      .fold<Map<Symbol, dynamic>>({}, (prev, e) => prev..[Symbol(e.name)] = e.value);

  final dependencies =
      constructorParams.where((e) => !e.isNamed).map((e) => transformedRecordMap[e.simpleName]).toList();

  final newEntityInstance = mirror.newInstance('', dependencies, namedDeps);
  return (newEntityInstance as Entity)
    ..id = json['id']
    ..createdAt = transformedRecordMap['createdAt']
    ..updatedAt = transformedRecordMap['updatedAt']
    .._isLoadedFromDB = true;
}