18c339a94Sopenharmony_ci/*
28c339a94Sopenharmony_ci* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
38c339a94Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
48c339a94Sopenharmony_ci* you may not use this file except in compliance with the License.
58c339a94Sopenharmony_ci* You may obtain a copy of the License at
68c339a94Sopenharmony_ci*
78c339a94Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0
88c339a94Sopenharmony_ci*
98c339a94Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software
108c339a94Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
118c339a94Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128c339a94Sopenharmony_ci* See the License for the specific language governing permissions and
138c339a94Sopenharmony_ci* limitations under the License.
148c339a94Sopenharmony_ci*/
158c339a94Sopenharmony_ciconst re = require('../tools/re');
168c339a94Sopenharmony_ciconst { EnumValueType, getLogErrInfo } = require('../tools/common');
178c339a94Sopenharmony_ciconst { NapiLog } = require('../tools/NapiLog');
188c339a94Sopenharmony_cifunction generateEnum(name, data, inNamespace, nameSpaceName, toolNamespace) {
198c339a94Sopenharmony_ci    let implH = '';
208c339a94Sopenharmony_ci    let implCpp = '';
218c339a94Sopenharmony_ci    let midInitEnum = '';
228c339a94Sopenharmony_ci    let midInitEnumDefine = '';
238c339a94Sopenharmony_ci
248c339a94Sopenharmony_ci    if (data.enumValueType === EnumValueType.ENUM_VALUE_TYPE_STRING) {
258c339a94Sopenharmony_ci        implH = `\nclass %s {\npublic:\n`.format(name, implH);
268c339a94Sopenharmony_ci    } else if (data.enumValueType === EnumValueType.ENUM_VALUE_TYPE_NUMBER) {
278c339a94Sopenharmony_ci        implH = `\nenum class %s {\n`.format(name, implH);
288c339a94Sopenharmony_ci    } else {
298c339a94Sopenharmony_ci        NapiLog.logError(`The enum type[%s] is not support.`.format(data.enumValueType), getLogErrInfo());
308c339a94Sopenharmony_ci        return {implH: '', implCpp: ''};
318c339a94Sopenharmony_ci    }
328c339a94Sopenharmony_ci    for (let i in data.element) {
338c339a94Sopenharmony_ci        let v = data.element[i];
348c339a94Sopenharmony_ci        if (midInitEnumDefine === '') {
358c339a94Sopenharmony_ci          midInitEnumDefine += 'std::map<const char *, std::any> enumMap%s;\n'.format(name);
368c339a94Sopenharmony_ci        }
378c339a94Sopenharmony_ci
388c339a94Sopenharmony_ci        if (data.enumValueType === EnumValueType.ENUM_VALUE_TYPE_STRING) {
398c339a94Sopenharmony_ci            implH += `    static const std::string %s;\n`.format(v.name);
408c339a94Sopenharmony_ci            implCpp += `\nconst std::string %s::%s = "%s";\n`.format(name, v.name, v.value);
418c339a94Sopenharmony_ci           midInitEnum += '    %s%s::%senumMap%s["%s"] = "%s";\n'.format(inNamespace, nameSpaceName, toolNamespace, name, v.name, v.value);
428c339a94Sopenharmony_ci        } else {
438c339a94Sopenharmony_ci            if (v.value === '') {
448c339a94Sopenharmony_ci                v.value = 0;
458c339a94Sopenharmony_ci            }
468c339a94Sopenharmony_ci            implH += `    %s = %s,\n`.format(v.name, v.value);
478c339a94Sopenharmony_ci            midInitEnum += '    %s%s::%senumMap%s["%s"] = %s;\n'.format(inNamespace, nameSpaceName, toolNamespace, name, v.name, v.value);
488c339a94Sopenharmony_ci        }
498c339a94Sopenharmony_ci    }
508c339a94Sopenharmony_ci    midInitEnum += '    pxt->CreateEnumObject("%s", %s%s::%senumMap%s);\n'.format(name, inNamespace, nameSpaceName, toolNamespace, name);
518c339a94Sopenharmony_ci    implH += `};\n`;
528c339a94Sopenharmony_ci    let result = {
538c339a94Sopenharmony_ci        implH: implH,
548c339a94Sopenharmony_ci        implCpp: implCpp,
558c339a94Sopenharmony_ci        midInitEnum: midInitEnum,
568c339a94Sopenharmony_ci        midInitEnumDefine: midInitEnumDefine
578c339a94Sopenharmony_ci    };
588c339a94Sopenharmony_ci    return result;
598c339a94Sopenharmony_ci}
608c339a94Sopenharmony_cimodule.exports = {
618c339a94Sopenharmony_ci    generateEnum
628c339a94Sopenharmony_ci};