1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef DISTRIBUTEDDATAMGR_APPDATAMGR_JS_SENDABLE_UTILS_H
17 #define DISTRIBUTEDDATAMGR_APPDATAMGR_JS_SENDABLE_UTILS_H
18
19 #include <cstdint>
20
21 #include "js_utils.h"
22 #include "napi/native_common.h"
23 #include "napi/native_node_api.h"
24
25 namespace OHOS {
26 namespace AppDataMgrJsKit {
27 namespace JSUtils {
28 #define DECLARE_SENDABLE_PROPERTY(env, key, value) \
29 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY((key), Convert2Sendable((env), (value))))
30
31 int32_t Convert2Sendable(napi_env env, std::string value, napi_value &output);
32 int32_t Convert2Sendable(napi_env env, bool value, napi_value &output);
33 int32_t Convert2Sendable(napi_env env, double value, napi_value &output);
34
35 napi_value Convert2Sendable(napi_env env, const std::string &value);
36 napi_value Convert2Sendable(napi_env env, const std::vector<uint8_t> &value);
37 napi_value Convert2Sendable(napi_env env, const std::vector<float> &value);
38 napi_value Convert2Sendable(napi_env env, int32_t value);
39 napi_value Convert2Sendable(napi_env env, uint32_t value);
40 napi_value Convert2Sendable(napi_env env, int64_t value);
41 napi_value Convert2Sendable(napi_env env, double value);
42 napi_value Convert2Sendable(napi_env env, bool value);
43 napi_value Convert2Sendable(napi_env env, const std::monostate &value);
44
45 template<typename T>
46 napi_value Convert2Sendable(napi_env env, const T &value);
47
48 template<typename T>
49 napi_value Convert2Sendable(napi_env env, const std::vector<T> &value);
50
51 template<typename... Types>
52 napi_value Convert2Sendable(napi_env env, const std::variant<Types...> &value);
53
54 template<typename T>
GetSendableValue(napi_env env,const T & value)55 napi_value GetSendableValue(napi_env env, const T &value)
56 {
57 return nullptr;
58 }
59
60 template<typename T, typename First, typename... Types>
GetSendableValue(napi_env env,const T & value)61 napi_value GetSendableValue(napi_env env, const T &value)
62 {
63 auto *val = std::get_if<First>(&value);
64 if (val != nullptr) {
65 return Convert2Sendable(env, *val);
66 }
67 return GetSendableValue<T, Types...>(env, value);
68 }
69
70 napi_value ToSendableObject(napi_env env, napi_value jsValue);
71 napi_value ToSendableArray(napi_env env, napi_value jsValue);
72 napi_value ToSendableTypedArray(napi_env env, napi_value jsValue);
73 napi_value Convert2Sendable(napi_env env, napi_value jsValue);
74 } // namespace JSUtils
75
76 template<typename T>
Convert2Sendable(napi_env env,const std::vector<T> & value)77 napi_value JSUtils::Convert2Sendable(napi_env env, const std::vector<T> &value)
78 {
79 napi_value jsValue;
80 napi_status status = napi_create_sendable_array_with_length(env, value.size(), &jsValue);
81 if (status != napi_ok) {
82 return nullptr;
83 }
84
85 for (size_t i = 0; i < value.size(); ++i) {
86 napi_set_element(env, jsValue, i, Convert2Sendable(env, value[i]));
87 }
88 return jsValue;
89 }
90
91 template<typename... Types>
Convert2Sendable(napi_env env,const std::variant<Types...> & value)92 napi_value JSUtils::Convert2Sendable(napi_env env, const std::variant<Types...> &value)
93 {
94 return GetSendableValue<decltype(value), Types...>(env, value);
95 }
96 } // namespace AppDataMgrJsKit
97 } // namespace OHOS
98 #endif // DISTRIBUTEDDATAMGR_APPDATAMGR_JS_SENDABLE_UTILS_H