writeFromMapFunc method

String writeFromMapFunc(
  1. ClassElement e
)

Implementation

String writeFromMapFunc(ClassElement e) {
  final buf = StringBuffer();
  buf.writeln('${e.name} $fromMapFuncName(snapshot, _) => $className(');
  for (final field in e.constructors.first.parameters) {
    String fieldName = camelToSnake(field.name);
    String fieldGetterVar = 'snapshot["$fieldName"]';
    if (field.metadata.isNotEmpty) {
      final annotation = field.metadata.first;
      final annotationElement = annotation.element!;
      fieldGetterVar = 'snapshot["$fieldName"]';
      if (annotationElement.displayName == 'ReferenceList') {
        final className = annotation.computeConstantValue()!.getField('className')!.toStringValue();
        fieldGetterVar = """(snapshot['$fieldName'] as List).cast<DocumentReference>()
            .map<${className}Ref>((unit) {
              return unit.withConverter<$className>(
                toFirestore: _\$${className}ToFirestore,
                fromFirestore: _\$${className}FromFirestore,
              );
            }).toList()""";
      } else if (annotation.element!.displayName == 'Reference') {
        var dartObject = annotation.computeConstantValue()!;
        final canBeNull = dartObject.getField('canBeNull')!.toBoolValue()!;
        final className = dartObject.getField('className')!.toStringValue();
        fieldGetterVar =
            """(snapshot['$fieldName'] as DocumentReference${canBeNull ? '?' : ''})${canBeNull ? '?' : ''}.withConverter<$className>(
              toFirestore: _\$${className}ToFirestore,
              fromFirestore: _\$${className}FromFirestore,
            )""";
      }
    }
    if (field.isNamed) {
      buf.writeln('${field.name}: $fieldGetterVar,');
    } else {
      buf.writeln('$fieldGetterVar,');
    }
  }
  buf.writeln(');');
  return buf.toString();
}