load method

Implementation

Future<model_pb.ModelLoadResult> load(
  model_pb.ModelLoadRequest request,
) async {
  final fn = RacNative.bindings.rac_model_lifecycle_load_proto;
  if (fn == null) {
    return model_pb.ModelLoadResult(
      success: false,
      modelId: request.modelId,
      category: request.category,
      framework: request.framework,
      errorMessage: 'Model lifecycle load proto API is unavailable',
    );
  }

  final registry = DartBridgeModelRegistry.instance.nativeHandle;
  if (registry == null || registry == nullptr) {
    return model_pb.ModelLoadResult(
      success: false,
      modelId: request.modelId,
      category: request.category,
      framework: request.framework,
      errorMessage: 'Model registry is not initialized',
    );
  }

  // Main-isolate FFI call (reverts an earlier `Isolate.run` wrap).
  // See class-level note: synchronous platform-adapter callbacks are still
  // main-isolate callbacks. We accept the main-isolate cost until those
  // adapter services are bridged through a cross-thread-safe design.
  final bytes = request.writeToBuffer();
  final requestPtr = calloc<Uint8>(bytes.isEmpty ? 1 : bytes.length);
  final out = calloc<RacProtoBuffer>();
  final bindings = RacNative.bindings;

  try {
    if (bytes.isNotEmpty) {
      requestPtr.asTypedList(bytes.length).setAll(0, bytes);
    }
    bindings.rac_proto_buffer_init(out);
    final code = fn(registry, requestPtr, bytes.length, out);
    if (code != RacResultCode.success ||
        out.ref.status != RacResultCode.success) {
      _logger.debug(
        'rac_model_lifecycle_load_proto failed: '
        '${_protoBufferError(out, code)}',
      );
      return model_pb.ModelLoadResult(
        success: false,
        modelId: request.modelId,
        category: request.category,
        framework: request.framework,
        errorMessage: _protoBufferError(out, code),
      );
    }
    return _decodeBuffer(out, model_pb.ModelLoadResult.fromBuffer);
  } catch (e) {
    _logger.debug('rac_model_lifecycle_load_proto error: $e');
    return model_pb.ModelLoadResult(
      success: false,
      modelId: request.modelId,
      category: request.category,
      framework: request.framework,
      errorMessage: 'rac_model_lifecycle_load_proto threw: $e',
    );
  } finally {
    bindings.rac_proto_buffer_free(out);
    calloc.free(requestPtr);
    calloc.free(out);
  }
}