diff --git a/dist/addon.node b/dist/addon.node index aaf5619a..73e6ed78 100644 Binary files a/dist/addon.node and b/dist/addon.node differ diff --git a/include/napi_helpers/napi_extract_args.h b/include/napi_helpers/napi_extract_args.h index 11bc04c4..a64568a7 100644 --- a/include/napi_helpers/napi_extract_args.h +++ b/include/napi_helpers/napi_extract_args.h @@ -1,20 +1,50 @@ +#pragma once + #include #include +#include + +template +T napi_extract_value(napi_env env, napi_value value); + +template<> +inline std::wstring napi_extract_value(napi_env env, napi_value value) { + size_t length; + napi_get_value_string_utf16(env, value, nullptr, 0, &length); + + std::wstring result(length + 1, L'\0'); + size_t actualLength; + napi_get_value_string_utf16(env, value, reinterpret_cast(result.data()), length + 1, &actualLength); + result.resize(actualLength); + + return result; +} + +template<> +inline int64_t napi_extract_value(napi_env env, napi_value value) { + int64_t result; + napi_get_value_int64(env, value, &result); + return result; +} -template -std::array napi_extract_args(napi_env env, napi_callback_info info) { +template<> +inline bool napi_extract_value(napi_env env, napi_value value) { + bool result; + napi_get_value_bool(env, value, &result); + return result; +} + +template +inline std::tuple napi_extract_args_impl(napi_env env, napi_value* argv, std::index_sequence) { + return std::make_tuple(napi_extract_value(env, argv[Is])...); +} + +template +inline std::tuple napi_extract_args(napi_env env, napi_callback_info info) { + constexpr size_t N = sizeof...(Types); size_t argc = N; napi_value argv[N]; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); - std::array result; - - for (size_t i = 0; i < N; ++i) { - size_t length; - napi_get_value_string_utf16(env, argv[i], nullptr, 0, &length); - result[i].resize(length); - napi_get_value_string_utf16(env, argv[i], reinterpret_cast(result[i].data()), length + 1, nullptr); - } - - return result; + return napi_extract_args_impl(env, argv, std::make_index_sequence{}); } diff --git a/native-src/virtual_drive/convert_to_placeholder.cpp b/native-src/virtual_drive/convert_to_placeholder.cpp index 4d5ff546..36f4ca51 100644 --- a/native-src/virtual_drive/convert_to_placeholder.cpp +++ b/native-src/virtual_drive/convert_to_placeholder.cpp @@ -3,7 +3,7 @@ #include "Placeholders.h" napi_value convert_to_placeholder_impl(napi_env env, napi_callback_info info) { - auto [path, serverIdentity] = napi_extract_args<2>(env, info); + auto [path, serverIdentity] = napi_extract_args(env, info); std::wstring wPath(path.begin(), path.end()); std::wstring wServerIdentity(serverIdentity.begin(), serverIdentity.end()); diff --git a/native-src/virtual_drive/dehydrate_file.cpp b/native-src/virtual_drive/dehydrate_file.cpp index 4c6f8d0e..7bfa5967 100644 --- a/native-src/virtual_drive/dehydrate_file.cpp +++ b/native-src/virtual_drive/dehydrate_file.cpp @@ -3,7 +3,7 @@ #include "stdafx.h" napi_value dehydrate_file(napi_env env, napi_callback_info info) { - auto [rawPath] = napi_extract_args<1>(env, info); + auto [rawPath] = napi_extract_args(env, info); const wchar_t* path = rawPath.c_str(); DWORD attrib = GetFileAttributesW(path); diff --git a/native-src/virtual_drive/disconnect_sync_root.cpp b/native-src/virtual_drive/disconnect_sync_root.cpp index 398e05cb..66872479 100644 --- a/native-src/virtual_drive/disconnect_sync_root.cpp +++ b/native-src/virtual_drive/disconnect_sync_root.cpp @@ -3,7 +3,7 @@ #include "SyncRoot.h" napi_value disconnect_sync_root(napi_env env, napi_callback_info info) { - auto [syncRootPath] = napi_extract_args<1>(env, info); + auto [syncRootPath] = napi_extract_args(env, info); HRESULT result = SyncRoot::DisconnectSyncRoot(syncRootPath.c_str()); diff --git a/native-src/virtual_drive/get_file_identity.cpp b/native-src/virtual_drive/get_file_identity.cpp index 0642ec22..d1f98d86 100644 --- a/native-src/virtual_drive/get_file_identity.cpp +++ b/native-src/virtual_drive/get_file_identity.cpp @@ -3,7 +3,7 @@ #include "Placeholders.h" napi_value get_file_identity_impl(napi_env env, napi_callback_info info) { - auto [path] = napi_extract_args<1>(env, info); + auto [path] = napi_extract_args(env, info); std::string fileIdentity = Placeholders::GetFileIdentity(path); fileIdentity.erase(std::remove(fileIdentity.begin(), fileIdentity.end(), '\0'), fileIdentity.end()); diff --git a/native-src/virtual_drive/get_placeholder_state/get_placeholder_state_wrapper.cpp b/native-src/virtual_drive/get_placeholder_state/get_placeholder_state_wrapper.cpp index 032fac6c..aec01da6 100644 --- a/native-src/virtual_drive/get_placeholder_state/get_placeholder_state_wrapper.cpp +++ b/native-src/virtual_drive/get_placeholder_state/get_placeholder_state_wrapper.cpp @@ -3,7 +3,7 @@ #include "Placeholders.h" napi_value get_placeholder_state_wrapper(napi_env env, napi_callback_info info) { - auto [path] = napi_extract_args<1>(env, info); + auto [path] = napi_extract_args(env, info); FileState state = Placeholders::GetPlaceholderInfo(path); diff --git a/native-src/virtual_drive/hydrate_file.cpp b/native-src/virtual_drive/hydrate_file.cpp index 490c9568..a5a1e3c0 100644 --- a/native-src/virtual_drive/hydrate_file.cpp +++ b/native-src/virtual_drive/hydrate_file.cpp @@ -45,7 +45,7 @@ void complete_work(napi_env env, napi_status status, void* data) { } napi_value hydrate_file_impl(napi_env env, napi_callback_info info) { - auto [path] = napi_extract_args<1>(env, info); + auto [path] = napi_extract_args(env, info); // Create promise napi_deferred deferred; diff --git a/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp b/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp index d9cc4132..f72ea175 100644 --- a/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp +++ b/native-src/virtual_drive/register_sync_root/register_sync_root_wrapper.cpp @@ -3,7 +3,8 @@ #include "register_sync_root.h" napi_value register_sync_root_wrapper(napi_env env, napi_callback_info info) { - auto [syncRootPath, providerName, providerVersion, providerId, logoPath] = napi_extract_args<5>(env, info); + auto [syncRootPath, providerName, providerVersion, providerId, logoPath] = + napi_extract_args(env, info); register_sync_root(syncRootPath.c_str(), providerName.c_str(), providerVersion.c_str(), providerId.c_str(), logoPath.c_str()); diff --git a/native-src/virtual_drive/unregister_sync_root_wrapper.cpp b/native-src/virtual_drive/unregister_sync_root_wrapper.cpp index c6e04577..76060902 100644 --- a/native-src/virtual_drive/unregister_sync_root_wrapper.cpp +++ b/native-src/virtual_drive/unregister_sync_root_wrapper.cpp @@ -5,7 +5,7 @@ #include "stdafx.h" napi_value unregister_sync_root_wrapper(napi_env env, napi_callback_info info) { - auto [providerId] = napi_extract_args<1>(env, info); + auto [providerId] = napi_extract_args(env, info); winrt::StorageProviderSyncRootManager::Unregister(providerId);