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#ifndef JSON_BUILDER_H
17#define JSON_BUILDER_H
18
19#include <string>
20#include <vector>
21
22namespace OHOS::UpdateEngine {
23class JsonBuilder {
24public:
25    JsonBuilder &Append(const std::string &qualifier)
26    {
27        builder_.append(qualifier);
28        return *this;
29    }
30
31    JsonBuilder &Append(const std::string &key, const uint32_t value)
32    {
33        return AppendNum(key, std::to_string(value));
34    }
35
36    JsonBuilder &Append(const std::string &key, const int32_t value)
37    {
38        return AppendNum(key, std::to_string(value));
39    }
40
41    JsonBuilder &Append(const std::string &key, const bool value)
42    {
43        const std::string valueString = value ? "true" : "false";
44        return AppendNum(key, valueString);
45    }
46
47    JsonBuilder &Append(const std::string &key, const int64_t value)
48    {
49        return AppendNum(key, std::to_string(value));
50    }
51
52    JsonBuilder &Append(const std::string &key, const std::string &value, const bool isJsonString = false)
53    {
54        AppendComma();
55        if (isJsonString) {
56            builder_.append("\"").append(key).append("\"").append(":").append(value);
57        } else {
58            builder_.append("\"").append(key).append("\"").append(":").append("\"").append(value).append("\"");
59        }
60        return *this;
61    }
62
63    JsonBuilder &Append(const std::string &key, const JsonBuilder &jsonBuilder)
64    {
65        AppendComma();
66        builder_.append("\"").append(key).append("\"").append(":").append(jsonBuilder.ToJson());
67        return *this;
68    }
69
70    JsonBuilder &Append(const std::string &key, const std::vector<JsonBuilder> &valueList)
71    {
72        std::vector<JsonBuilder>::size_type valueListSize = valueList.size();
73        if (!valueList.empty()) {
74            JsonBuilder jsonArray;
75            jsonArray.Append("[");
76            for (std::vector<JsonBuilder>::size_type i = 0; i < valueListSize; i++) {
77                jsonArray.Append(valueList[i].ToJson());
78                if (i != valueListSize - 1) {
79                    jsonArray.Append(",");
80                }
81            }
82            jsonArray.Append("]");
83
84            Append(key, jsonArray);
85        }
86        return *this;
87    }
88
89    std::string ToJson() const
90    {
91        return builder_;
92    }
93
94private:
95    JsonBuilder &AppendNum(const std::string &key, const std::string &value)
96    {
97        AppendComma();
98        builder_.append("\"").append(key).append("\"").append(":").append(value);
99        return *this;
100    }
101
102    void AppendComma()
103    {
104        if (isFirstItem_) {
105            isFirstItem_ = false;
106        } else {
107            builder_.append(",");
108        }
109    }
110
111private:
112    std::string builder_;
113    bool isFirstItem_ = true;
114};
115} // namespace OHOS::UpdateEngine
116#endif // JSON_BUILDER_H