1/*
2 * Copyright (c) 2022-2023 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 FILEMGMT_LIBN_N_VAL_H
17#define FILEMGMT_LIBN_N_VAL_H
18
19#include <cstdint>
20#include <memory>
21#include <tuple>
22#include <vector>
23
24#include "n_napi.h"
25
26namespace OHOS {
27namespace FileManagement {
28namespace LibN {
29class NVal final {
30public:
31    NVal() = default;
32    NVal(napi_env nEnv, napi_value nVal);
33    NVal(const NVal &) = default;
34    NVal &operator=(const NVal &) = default;
35    virtual ~NVal() = default;
36
37    /* NOTE! env_ and val_ is LIKELY to be null */
38    napi_env env_ = nullptr;
39    napi_value val_ = nullptr;
40
41    explicit operator bool() const;
42    bool TypeIs(napi_valuetype expType) const;
43    bool TypeIsError(bool checkErrno = false) const;
44
45    /* SHOULD ONLY BE USED FOR EXPECTED TYPE */
46    std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String() const;
47    std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8String(std::string defaultValue) const;
48    std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF16String() const;
49    std::tuple<bool, std::unique_ptr<char[]>, size_t> ToUTF8StringPath() const;
50    std::tuple<bool, void *> ToPointer() const;
51    std::tuple<bool, bool> ToBool() const;
52    std::tuple<bool, bool> ToBool(bool defaultValue) const;
53    std::tuple<bool, int32_t> ToInt32() const;
54    std::tuple<bool, int32_t> ToInt32(int32_t defaultValue) const;
55    std::tuple<bool, int64_t> ToInt64() const;
56    std::tuple<bool, int64_t> ToInt64(int64_t defaultValue) const;
57    std::tuple<bool, void *, size_t> ToArraybuffer() const;
58    std::tuple<bool, void *, size_t> ToTypedArray() const;
59    std::tuple<bool, std::vector<std::string>, uint32_t> ToStringArray();
60    std::tuple<bool, uint64_t, bool> ToUint64() const;
61    std::tuple<bool, uint32_t> ToUint32() const;
62    std::tuple<bool, double> ToDouble() const;
63
64    /* Static helpers to create js objects */
65    static NVal CreateUndefined(napi_env env);
66    static NVal CreateBigInt64(napi_env env, int64_t val);
67    static NVal CreateInt64(napi_env env, int64_t val);
68    static NVal CreateInt32(napi_env env, int32_t val);
69    static NVal CreateUint32(napi_env env, int32_t val);
70    static NVal CreateObject(napi_env env);
71    static NVal CreateBool(napi_env env, bool val);
72    static NVal CreateUTF8String(napi_env env, std::string str);
73    static NVal CreateUTF8String(napi_env env, const char *str, ssize_t len);
74    static NVal CreateUint8Array(napi_env env, void *buf, size_t bufLen);
75    static NVal CreateArrayString(napi_env env, std::vector<std::string> strs);
76    static std::tuple<NVal, void *> CreateArrayBuffer(napi_env env, size_t len);
77
78    /* SHOULD ONLY BE USED FOR OBJECT */
79    bool HasProp(std::string propName) const;
80#ifdef WIN_PLATFORM
81    NVal GetPropValue(std::string propName) const;
82#else
83    NVal GetProp(std::string propName) const;
84#endif
85    bool AddProp(std::vector<napi_property_descriptor> &&propVec) const;
86    bool AddProp(std::string propName, napi_value nVal) const;
87
88    /* Static helpers to create prop of js objects */
89    static napi_property_descriptor DeclareNapiProperty(const char *name, napi_value val);
90    static napi_property_descriptor DeclareNapiStaticProperty(const char *name, napi_value val);
91    static napi_property_descriptor DeclareNapiFunction(const char *name, napi_callback func);
92    static napi_property_descriptor DeclareNapiStaticFunction(const char *name, napi_callback func);
93    static napi_property_descriptor DeclareNapiGetter(const char *name, napi_callback getter);
94    static napi_property_descriptor DeclareNapiSetter(const char *name, napi_callback setter);
95    static inline napi_property_descriptor
96        DeclareNapiGetterSetter(const char *name, napi_callback getter, napi_callback setter);
97};
98} // namespace LibN
99} // namespace FileManagement
100} // namespace OHOS
101
102#endif // FILEMGMT_LIBN_N_VAL_H
103