fetchAssignments method

Future<List<ModelInfo>> fetchAssignments({
  1. bool forceRefresh = false,
})

Fetch model assignments from backend

Implementation

Future<List<ModelInfo>> fetchAssignments({bool forceRefresh = false}) async {
  try {
    final lib = PlatformLoader.loadCommons();
    final fetchFn = lib.lookupFunction<
        Int32 Function(Int32, Pointer<Pointer<Pointer<RacModelInfoStruct>>>, Pointer<IntPtr>),
        int Function(int, Pointer<Pointer<Pointer<RacModelInfoStruct>>>,
            Pointer<IntPtr>)>('rac_model_assignment_fetch');

    final outModelsPtr = calloc<Pointer<Pointer<RacModelInfoStruct>>>();
    final outCountPtr = calloc<IntPtr>();

    try {
      final result = fetchFn(forceRefresh ? 1 : 0, outModelsPtr, outCountPtr);
      if (result != RacResultCode.success) {
        _logger.warning('Fetch assignments failed', metadata: {'code': result});
        return [];
      }

      final count = outCountPtr.value;
      if (count == 0) return [];

      final models = <ModelInfo>[];
      final modelsArray = outModelsPtr.value;

      for (var i = 0; i < count; i++) {
        final modelPtr = modelsArray[i];
        if (modelPtr != nullptr) {
          models.add(_structToModelInfo(modelPtr));
        }
      }

      // Free the array
      final freeFn = lib.lookupFunction<
          Void Function(Pointer<Pointer<RacModelInfoStruct>>, IntPtr),
          void Function(Pointer<Pointer<RacModelInfoStruct>>,
              int)>('rac_model_info_array_free');
      freeFn(modelsArray, count);

      return models;
    } finally {
      calloc.free(outModelsPtr);
      calloc.free(outCountPtr);
    }
  } catch (e) {
    _logger.debug('rac_model_assignment_fetch error: $e');
    return [];
  }
}