13920e296Sopenharmony_ci/*
23920e296Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
33920e296Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43920e296Sopenharmony_ci * you may not use this file except in compliance with the License.
53920e296Sopenharmony_ci * You may obtain a copy of the License at
63920e296Sopenharmony_ci *
73920e296Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83920e296Sopenharmony_ci *
93920e296Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103920e296Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113920e296Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123920e296Sopenharmony_ci * See the License for the specific language governing permissions and
133920e296Sopenharmony_ci * limitations under the License.
143920e296Sopenharmony_ci */
153920e296Sopenharmony_ci
163920e296Sopenharmony_ci#ifndef OHOS_RESTOOL_JSON_COMPILER_H
173920e296Sopenharmony_ci#define OHOS_RESTOOL_JSON_COMPILER_H
183920e296Sopenharmony_ci
193920e296Sopenharmony_ci#include <functional>
203920e296Sopenharmony_ci#include <cJSON.h>
213920e296Sopenharmony_ci#include "i_resource_compiler.h"
223920e296Sopenharmony_ci#include "resource_util.h"
233920e296Sopenharmony_ci
243920e296Sopenharmony_cinamespace OHOS {
253920e296Sopenharmony_cinamespace Global {
263920e296Sopenharmony_cinamespace Restool {
273920e296Sopenharmony_ciclass JsonCompiler : public IResourceCompiler {
283920e296Sopenharmony_cipublic:
293920e296Sopenharmony_ci    JsonCompiler(ResType type, const std::string &output);
303920e296Sopenharmony_ci    virtual ~JsonCompiler();
313920e296Sopenharmony_ciprotected:
323920e296Sopenharmony_ci    uint32_t CompileSingleFile(const FileInfo &fileInfo) override;
333920e296Sopenharmony_ciprivate:
343920e296Sopenharmony_ci    void InitParser();
353920e296Sopenharmony_ci    bool ParseJsonArrayLevel(const cJSON *arrayNode, const FileInfo &fileInfo);
363920e296Sopenharmony_ci    bool ParseJsonObjectLevel(cJSON *objectNode, const FileInfo &fileInfo);
373920e296Sopenharmony_ci
383920e296Sopenharmony_ci    using HandleResource = std::function<bool(const cJSON *, ResourceItem&)>;
393920e296Sopenharmony_ci    bool HandleString(const cJSON *objectNode, ResourceItem &resourceItem) const;
403920e296Sopenharmony_ci    bool HandleInteger(const cJSON *objectNode, ResourceItem &resourceItem) const;
413920e296Sopenharmony_ci    bool HandleBoolean(const cJSON *objectNode, ResourceItem &resourceItem) const;
423920e296Sopenharmony_ci    bool HandleColor(const cJSON *objectNode, ResourceItem &resourceItem) const;
433920e296Sopenharmony_ci    bool HandleFloat(const cJSON *objectNode, ResourceItem &resourceItem) const;
443920e296Sopenharmony_ci    bool HandleStringArray(const cJSON *objectNode, ResourceItem &resourceItem) const;
453920e296Sopenharmony_ci    bool HandleIntegerArray(const cJSON *objectNode, ResourceItem &resourceItem) const;
463920e296Sopenharmony_ci    bool HandleTheme(const cJSON *objectNode, ResourceItem &resourceItem) const;
473920e296Sopenharmony_ci    bool HandlePattern(const cJSON *objectNode, ResourceItem &resourceItem) const;
483920e296Sopenharmony_ci    bool HandlePlural(const cJSON *objectNode, ResourceItem &resourceItem) const;
493920e296Sopenharmony_ci    bool HandleSymbol(const cJSON *objectNode, ResourceItem &resourceItem) const;
503920e296Sopenharmony_ci
513920e296Sopenharmony_ci    bool PushString(const std::string &value, ResourceItem &resourceItem) const;
523920e296Sopenharmony_ci    bool CheckJsonStringValue(const cJSON *valueNode, const ResourceItem &resourceItem) const;
533920e296Sopenharmony_ci    bool CheckJsonIntegerValue(const cJSON *valueNode, const ResourceItem &resourceItem) const;
543920e296Sopenharmony_ci    bool CheckJsonSymbolValue(const cJSON *valueNode, const ResourceItem &resourceItem) const;
553920e296Sopenharmony_ci    using HandleValue = std::function<bool(const cJSON *, const ResourceItem&, std::vector<std::string>&)>;
563920e296Sopenharmony_ci    bool ParseValueArray(const cJSON *objectNode, ResourceItem &resourceItem,
573920e296Sopenharmony_ci                         const std::vector<std::string> &extra, HandleValue callback) const;
583920e296Sopenharmony_ci    bool ParseParent(const cJSON *objectNode, const ResourceItem &resourceItem,
593920e296Sopenharmony_ci                     std::vector<std::string> &extra) const;
603920e296Sopenharmony_ci    bool ParseAttribute(const cJSON *arrayItem, const ResourceItem &resourceItem,
613920e296Sopenharmony_ci                        std::vector<std::string> &values) const;
623920e296Sopenharmony_ci    bool CheckPluralValue(const cJSON *arrayItem, const ResourceItem &resourceItem) const;
633920e296Sopenharmony_ci    bool CheckColorValue(const char *s) const;
643920e296Sopenharmony_ci    std::map<ResType, HandleResource> handles_;
653920e296Sopenharmony_ci    bool isBaseString_;
663920e296Sopenharmony_ci    cJSON *root_;
673920e296Sopenharmony_ci};
683920e296Sopenharmony_ci}
693920e296Sopenharmony_ci}
703920e296Sopenharmony_ci}
713920e296Sopenharmony_ci#endif