
// This file is generated by react-native-node-api
#include <dlfcn.h>
#include <weak_node_api.hpp>

#include <Logger.hpp>
#include <RuntimeNodeApi.hpp>
#include <RuntimeNodeApiAsync.hpp>

#if defined(__APPLE__)
#define WEAK_NODE_API_LIBRARY_NAME                                             \
  "@rpath/weak-node-api.framework/weak-node-api"
#elif defined(__ANDROID__)
#define WEAK_NODE_API_LIBRARY_NAME "libweak-node-api.so"
#else
#error "WEAK_NODE_API_LIBRARY_NAME cannot be defined for this platform"
#endif

namespace callstack::react_native_node_api {

void injectIntoWeakNodeApi() {
  void *module = dlopen(WEAK_NODE_API_LIBRARY_NAME, RTLD_NOW | RTLD_LOCAL);
  if (nullptr == module) {
    log_debug("NapiHost: Failed to load weak-node-api: %s", dlerror());
    abort();
  }

  auto inject_weak_node_api_host =
      (InjectHostFunction)dlsym(module, "inject_weak_node_api_host");
  if (nullptr == inject_weak_node_api_host) {
    log_debug(
        "NapiHost: Failed to find 'inject_weak_node_api_host' function: %s",
        dlerror());
    abort();
  }

  log_debug("Injecting NodeApiHost");
  inject_weak_node_api_host(NodeApiHost{
      .napi_get_last_error_info = napi_get_last_error_info,
      .napi_get_undefined = napi_get_undefined,
      .napi_get_null = napi_get_null,
      .napi_get_global = napi_get_global,
      .napi_get_boolean = napi_get_boolean,
      .napi_create_object = napi_create_object,
      .napi_create_array = napi_create_array,
      .napi_create_array_with_length = napi_create_array_with_length,
      .napi_create_double = napi_create_double,
      .napi_create_int32 = napi_create_int32,
      .napi_create_uint32 = napi_create_uint32,
      .napi_create_int64 = napi_create_int64,
      .napi_create_string_latin1 = napi_create_string_latin1,
      .napi_create_string_utf8 = napi_create_string_utf8,
      .napi_create_string_utf16 = napi_create_string_utf16,
      .napi_create_symbol = napi_create_symbol,
      .napi_create_function = napi_create_function,
      .napi_create_error = napi_create_error,
      .napi_create_type_error = napi_create_type_error,
      .napi_create_range_error = napi_create_range_error,
      .napi_typeof = napi_typeof,
      .napi_get_value_double = napi_get_value_double,
      .napi_get_value_int32 = napi_get_value_int32,
      .napi_get_value_uint32 = napi_get_value_uint32,
      .napi_get_value_int64 = napi_get_value_int64,
      .napi_get_value_bool = napi_get_value_bool,
      .napi_get_value_string_latin1 = napi_get_value_string_latin1,
      .napi_get_value_string_utf8 = napi_get_value_string_utf8,
      .napi_get_value_string_utf16 = napi_get_value_string_utf16,
      .napi_coerce_to_bool = napi_coerce_to_bool,
      .napi_coerce_to_number = napi_coerce_to_number,
      .napi_coerce_to_object = napi_coerce_to_object,
      .napi_coerce_to_string = napi_coerce_to_string,
      .napi_get_prototype = napi_get_prototype,
      .napi_get_property_names = napi_get_property_names,
      .napi_set_property = napi_set_property,
      .napi_has_property = napi_has_property,
      .napi_get_property = napi_get_property,
      .napi_delete_property = napi_delete_property,
      .napi_has_own_property = napi_has_own_property,
      .napi_set_named_property = napi_set_named_property,
      .napi_has_named_property = napi_has_named_property,
      .napi_get_named_property = napi_get_named_property,
      .napi_set_element = napi_set_element,
      .napi_has_element = napi_has_element,
      .napi_get_element = napi_get_element,
      .napi_delete_element = napi_delete_element,
      .napi_define_properties = napi_define_properties,
      .napi_is_array = napi_is_array,
      .napi_get_array_length = napi_get_array_length,
      .napi_strict_equals = napi_strict_equals,
      .napi_call_function = napi_call_function,
      .napi_new_instance = napi_new_instance,
      .napi_instanceof = napi_instanceof,
      .napi_get_cb_info = napi_get_cb_info,
      .napi_get_new_target = napi_get_new_target,
      .napi_define_class = napi_define_class,
      .napi_wrap = napi_wrap,
      .napi_unwrap = napi_unwrap,
      .napi_remove_wrap = napi_remove_wrap,
      .napi_create_external = napi_create_external,
      .napi_get_value_external = napi_get_value_external,
      .napi_create_reference = napi_create_reference,
      .napi_delete_reference = napi_delete_reference,
      .napi_reference_ref = napi_reference_ref,
      .napi_reference_unref = napi_reference_unref,
      .napi_get_reference_value = napi_get_reference_value,
      .napi_open_handle_scope = napi_open_handle_scope,
      .napi_close_handle_scope = napi_close_handle_scope,
      .napi_open_escapable_handle_scope = napi_open_escapable_handle_scope,
      .napi_close_escapable_handle_scope = napi_close_escapable_handle_scope,
      .napi_escape_handle = napi_escape_handle,
      .napi_throw = napi_throw,
      .napi_throw_error = napi_throw_error,
      .napi_throw_type_error = napi_throw_type_error,
      .napi_throw_range_error = napi_throw_range_error,
      .napi_is_error = napi_is_error,
      .napi_is_exception_pending = napi_is_exception_pending,
      .napi_get_and_clear_last_exception = napi_get_and_clear_last_exception,
      .napi_is_arraybuffer = napi_is_arraybuffer,
      .napi_create_arraybuffer = napi_create_arraybuffer,
      .napi_create_external_arraybuffer = napi_create_external_arraybuffer,
      .napi_get_arraybuffer_info = napi_get_arraybuffer_info,
      .napi_is_typedarray = napi_is_typedarray,
      .napi_create_typedarray = napi_create_typedarray,
      .napi_get_typedarray_info = napi_get_typedarray_info,
      .napi_create_dataview = napi_create_dataview,
      .napi_is_dataview = napi_is_dataview,
      .napi_get_dataview_info = napi_get_dataview_info,
      .napi_get_version = napi_get_version,
      .napi_create_promise = napi_create_promise,
      .napi_resolve_deferred = napi_resolve_deferred,
      .napi_reject_deferred = napi_reject_deferred,
      .napi_is_promise = napi_is_promise,
      .napi_run_script = napi_run_script,
      .napi_adjust_external_memory = napi_adjust_external_memory,
      .napi_create_date = napi_create_date,
      .napi_is_date = napi_is_date,
      .napi_get_date_value = napi_get_date_value,
      .napi_add_finalizer = napi_add_finalizer,
      .napi_create_bigint_int64 = napi_create_bigint_int64,
      .napi_create_bigint_uint64 = napi_create_bigint_uint64,
      .napi_create_bigint_words = napi_create_bigint_words,
      .napi_get_value_bigint_int64 = napi_get_value_bigint_int64,
      .napi_get_value_bigint_uint64 = napi_get_value_bigint_uint64,
      .napi_get_value_bigint_words = napi_get_value_bigint_words,
      .napi_get_all_property_names = napi_get_all_property_names,
      .napi_set_instance_data = napi_set_instance_data,
      .napi_get_instance_data = napi_get_instance_data,
      .napi_detach_arraybuffer = napi_detach_arraybuffer,
      .napi_is_detached_arraybuffer = napi_is_detached_arraybuffer,
      .napi_type_tag_object = napi_type_tag_object,
      .napi_check_object_type_tag = napi_check_object_type_tag,
      .napi_object_freeze = napi_object_freeze,
      .napi_object_seal = napi_object_seal,
      .napi_fatal_error = napi_fatal_error,
      .napi_create_buffer = napi_create_buffer,
      .napi_create_external_buffer = napi_create_external_buffer,
      .napi_create_buffer_copy = napi_create_buffer_copy,
      .napi_is_buffer = napi_is_buffer,
      .napi_get_buffer_info = napi_get_buffer_info,
      .napi_create_async_work = napi_create_async_work,
      .napi_delete_async_work = napi_delete_async_work,
      .napi_queue_async_work = napi_queue_async_work,
      .napi_cancel_async_work = napi_cancel_async_work,
      .napi_get_node_version = napi_get_node_version,
  });
}
} // namespace callstack::react_native_node_api
