generateToHiveObject function

String generateToHiveObject(
  1. String? hiveObjectName,
  2. String className,
  3. List<FormalParameterElement>? instances,
  4. List<FormalParameterElement>? classFields,
)

Implementation

String generateToHiveObject(
  String? hiveObjectName,
  String className,
  List<FormalParameterElement>? instances,
  List<FormalParameterElement>? classFields,
) {
  final field = instances
      ?.map((e) {
        final classType = classFields
            ?.where((cf) => cf.name == e.name)
            .first
            .type;
        final isEnum = classType?.element is EnumElement;

        if (isEnum) {
          return '${e.name}: instance.${e.name}?.name';
        }
        if (classType == null || _isPrimitive(classType)) {
          // List<XModel> with non-primitive item type — map via toHiveObject().
          if (classType != null &&
              classType.isDartCoreList &&
              classType is ParameterizedType) {
            final itemType = classType.typeArguments.first;
            if (!_isPrimitive(itemType) && itemType.element is! EnumElement) {
              final nullable =
                  classType.nullabilitySuffix == NullabilitySuffix.question ? '?' : '';
              return '${e.name}: instance.${e.name}$nullable.map((item) => item.toHiveObject()).toList()';
            }
          }
          // SC-5 fix: Map<K, XModel> with non-primitive value type — map via toHiveObject().
          if (classType != null &&
              classType.isDartCoreMap &&
              classType is ParameterizedType) {
            final valueType = classType.typeArguments.last;
            if (!_isPrimitive(valueType) && valueType.element is! EnumElement) {
              final nullable =
                  classType.nullabilitySuffix == NullabilitySuffix.question ? '?' : '';
              return '${e.name}: instance.${e.name}$nullable.map((k, v) => MapEntry(k, v.toHiveObject()))';
            }
          }
          return '${e.name}: instance.${e.name}';
        }

        // Non-primitive, non-list model field
        return '${e.name}: instance.${e.name}?.toHiveObject()';
      })
      .join(",\n");
  return """
$hiveObjectName _\$${className}ToHiveObject($className instance) => $hiveObjectName(
  $field
);
""";
}