1/* 2 * Copyright (c) 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#include "calendar_enum_napi.h" 17#include <map> 18#include <vector> 19#include <string_view> 20#include "calendar_define.h" 21#include "napi_queue.h" 22 23 24namespace OHOS::CalendarApi { 25struct JsEnumInt { 26 std::string_view enumName; 27 int32_t enumInt; 28}; 29 30struct JsEnumString { 31 std::string_view enumName; 32 std::string_view enumString; 33}; 34 35 36static const std::vector<struct JsEnumInt> g_eventType = { 37 { "IMPORTANT", EventType::Important }, 38 { "NORMAL", EventType::Normal }, 39}; 40 41static const std::vector<struct JsEnumInt> g_recurrenceFrequency = { 42 { "YEARLY", RecurrenceType::YEARLY }, 43 { "MONTHLY", RecurrenceType::MONTHLY }, 44 { "WEEKLY", RecurrenceType::WEEKLY }, 45 { "DAILY", RecurrenceType::DAILY }, 46}; 47 48static const std::vector<struct JsEnumString> g_calendarTypeKey = { 49 { "LOCAL", "local" }, 50 { "EMAIL", "email" }, 51 { "BIRTHDAY", "birthday" }, 52 { "CALDAV", "caldav" }, 53 { "SUBSCRIBED", "subscribed" }, 54}; 55 56static const std::vector<struct JsEnumString> g_serviceType = { 57 { "MEETING", "Meeting" }, 58 { "WATCHING", "Watching" }, 59 { "REPAYMENT", "Repayment" }, 60 { "LIVE", "Live" }, 61 { "SHOPPING", "Shopping" }, 62 { "TRIP", "Trip" }, 63 { "CLASS", "Class" }, 64 { "SPORTS_EVENTS", "SportsEvents" }, 65 { "SPORTS_EXERCISE", "SportsExercise" }, 66}; 67 68static const std::vector<struct JsEnumString> g_attendeeRole = { 69 { "ORGANIZER", "organizer" }, 70 { "PARTICIPANT", "participant" }, 71}; 72 73static const std::map<std::string_view, const std::vector<struct JsEnumInt>&> g_intEnumClassMap = { 74 { "EventType", g_eventType}, 75 { "RecurrenceFrequency", g_recurrenceFrequency}, 76}; 77 78static const std::map<std::string_view, const std::vector<struct JsEnumString>&> g_stringEnumClassMap = { 79 { "CalendarType", g_calendarTypeKey }, 80 { "ServiceType", g_serviceType }, 81 { "AttendeeRole", g_attendeeRole }, 82}; 83 84napi_value CalendarEnumNapi::JsEnumIntInit(napi_env env, napi_value exports) 85{ 86 for (const auto &enumClass : g_intEnumClassMap) { 87 auto &enumClassName = enumClass.first; 88 auto &enumItemVec = enumClass.second; 89 int32_t vecSize = static_cast<int32_t>(enumItemVec.size()); 90 std::vector<napi_value> value; 91 value.resize(vecSize); 92 for (int32_t index = 0; index < vecSize; ++index) { 93 napi_create_int32(env, enumItemVec[index].enumInt, &value[index]); 94 } 95 96 std::vector<napi_property_descriptor> property; 97 property.resize(vecSize); 98 for (int32_t index = 0; index < vecSize; ++index) { 99 property[index] = napi_property_descriptor DECLARE_NAPI_STATIC_PROPERTY( 100 enumItemVec[index].enumName.data(), value[index]); 101 } 102 103 auto constructor = [](napi_env env, napi_callback_info info) { 104 napi_value jsThis = nullptr; 105 napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 106 return jsThis; 107 }; 108 109 napi_value result = nullptr; 110 napi_status status = napi_define_class(env, enumClassName.data(), NAPI_AUTO_LENGTH, constructor, 111 nullptr, property.size(), property.data(), &result); 112 CHECK_RETURN(status == napi_ok, "Failed to define enum", nullptr); 113 114 status = napi_set_named_property(env, exports, enumClassName.data(), result); 115 CHECK_RETURN(status == napi_ok, "Failed to set result", nullptr); 116 } 117 return exports; 118} 119 120napi_value CalendarEnumNapi::JsEnumStringInit(napi_env env, napi_value exports) 121{ 122 for (auto it = g_stringEnumClassMap.begin(); it != g_stringEnumClassMap.end(); it++) { 123 auto &enumClassName = it->first; 124 auto &enumItemVec = it->second; 125 int32_t vecSize = static_cast<int32_t>(enumItemVec.size()); 126 std::vector<napi_value> value; 127 value.resize(vecSize); 128 for (int32_t index = 0; index < vecSize; ++index) { 129 napi_create_string_utf8(env, enumItemVec[index].enumString.data(), NAPI_AUTO_LENGTH, &value[index]); 130 } 131 132 std::vector<napi_property_descriptor> property; 133 property.resize(vecSize); 134 for (int32_t index = 0; index < vecSize; ++index) { 135 property[index] = napi_property_descriptor DECLARE_NAPI_STATIC_PROPERTY( 136 enumItemVec[index].enumName.data(), value[index]); 137 } 138 139 auto constructor = [](napi_env env, napi_callback_info info) { 140 napi_value jsThis = nullptr; 141 napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 142 return jsThis; 143 }; 144 145 napi_value result = nullptr; 146 napi_status status = napi_define_class(env, enumClassName.data(), NAPI_AUTO_LENGTH, constructor, 147 nullptr, property.size(), property.data(), &result); 148 CHECK_RETURN(status == napi_ok, "Failed to define enum", nullptr); 149 150 status = napi_set_named_property(env, exports, enumClassName.data(), result); 151 CHECK_RETURN(status == napi_ok, "Failed to set result", nullptr); 152 } 153 return exports; 154} 155 156napi_value CalendarEnumNapi::Init(napi_env env, napi_value exports) 157{ 158 JsEnumIntInit(env, exports); 159 JsEnumStringInit(env, exports); 160 return exports; 161} 162} // namespace CalendarApi