1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License.
5e509ee18Sopenharmony_ci * You may obtain a copy of the License at
6e509ee18Sopenharmony_ci *
7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8e509ee18Sopenharmony_ci *
9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and
13e509ee18Sopenharmony_ci * limitations under the License.
14e509ee18Sopenharmony_ci */
15e509ee18Sopenharmony_ci
16e509ee18Sopenharmony_ci#include "tooling/base/pt_json.h"
17e509ee18Sopenharmony_ci
18e509ee18Sopenharmony_ci#include "libpandabase/macros.h"
19e509ee18Sopenharmony_ci
20e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling {
21e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::CreateObject()
22e509ee18Sopenharmony_ci{
23e509ee18Sopenharmony_ci    return std::make_unique<PtJson>(cJSON_CreateObject());
24e509ee18Sopenharmony_ci}
25e509ee18Sopenharmony_ci
26e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::CreateArray()
27e509ee18Sopenharmony_ci{
28e509ee18Sopenharmony_ci    return std::make_unique<PtJson>(cJSON_CreateArray());
29e509ee18Sopenharmony_ci}
30e509ee18Sopenharmony_ci
31e509ee18Sopenharmony_civoid PtJson::ReleaseRoot()
32e509ee18Sopenharmony_ci{
33e509ee18Sopenharmony_ci    if (object_ != nullptr) {
34e509ee18Sopenharmony_ci        cJSON_Delete(object_);
35e509ee18Sopenharmony_ci        object_ = nullptr;
36e509ee18Sopenharmony_ci    }
37e509ee18Sopenharmony_ci}
38e509ee18Sopenharmony_ci
39e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::Parse(const std::string &data)
40e509ee18Sopenharmony_ci{
41e509ee18Sopenharmony_ci    cJSON *value = cJSON_ParseWithOpts(data.c_str(), nullptr, true);
42e509ee18Sopenharmony_ci    return std::make_unique<PtJson>(value);
43e509ee18Sopenharmony_ci}
44e509ee18Sopenharmony_ci
45e509ee18Sopenharmony_cistd::string PtJson::Stringify() const
46e509ee18Sopenharmony_ci{
47e509ee18Sopenharmony_ci    if (object_ == nullptr) {
48e509ee18Sopenharmony_ci        return "";
49e509ee18Sopenharmony_ci    }
50e509ee18Sopenharmony_ci
51e509ee18Sopenharmony_ci    char *str = cJSON_PrintUnformatted(object_);
52e509ee18Sopenharmony_ci    if (str == nullptr) {
53e509ee18Sopenharmony_ci        return "";
54e509ee18Sopenharmony_ci    }
55e509ee18Sopenharmony_ci
56e509ee18Sopenharmony_ci    std::string result(str);
57e509ee18Sopenharmony_ci    cJSON_free(str);
58e509ee18Sopenharmony_ci    return result;
59e509ee18Sopenharmony_ci}
60e509ee18Sopenharmony_ci
61e509ee18Sopenharmony_cibool PtJson::Add(const char *key, bool value) const
62e509ee18Sopenharmony_ci{
63e509ee18Sopenharmony_ci    ASSERT(key != nullptr && !Contains(key));
64e509ee18Sopenharmony_ci
65e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateBool(value);
66e509ee18Sopenharmony_ci    if (node == nullptr) {
67e509ee18Sopenharmony_ci        return false;
68e509ee18Sopenharmony_ci    }
69e509ee18Sopenharmony_ci
70e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToObject(object_, key, node);
71e509ee18Sopenharmony_ci    if (ret == 0) {
72e509ee18Sopenharmony_ci        cJSON_Delete(node);
73e509ee18Sopenharmony_ci        return false;
74e509ee18Sopenharmony_ci    }
75e509ee18Sopenharmony_ci
76e509ee18Sopenharmony_ci    return true;
77e509ee18Sopenharmony_ci}
78e509ee18Sopenharmony_ci
79e509ee18Sopenharmony_cibool PtJson::Add(const char *key, int32_t value) const
80e509ee18Sopenharmony_ci{
81e509ee18Sopenharmony_ci    return Add(key, static_cast<double>(value));
82e509ee18Sopenharmony_ci}
83e509ee18Sopenharmony_ci
84e509ee18Sopenharmony_cibool PtJson::Add(const char *key, int64_t value) const
85e509ee18Sopenharmony_ci{
86e509ee18Sopenharmony_ci    return Add(key, static_cast<double>(value));
87e509ee18Sopenharmony_ci}
88e509ee18Sopenharmony_ci
89e509ee18Sopenharmony_cibool PtJson::Add(const char *key, uint32_t value) const
90e509ee18Sopenharmony_ci{
91e509ee18Sopenharmony_ci    return Add(key, static_cast<double>(value));
92e509ee18Sopenharmony_ci}
93e509ee18Sopenharmony_ci
94e509ee18Sopenharmony_cibool PtJson::Add(const char *key, double value) const
95e509ee18Sopenharmony_ci{
96e509ee18Sopenharmony_ci    ASSERT(key != nullptr && !Contains(key));
97e509ee18Sopenharmony_ci
98e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateNumber(value);
99e509ee18Sopenharmony_ci    if (node == nullptr) {
100e509ee18Sopenharmony_ci        return false;
101e509ee18Sopenharmony_ci    }
102e509ee18Sopenharmony_ci
103e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToObject(object_, key, node);
104e509ee18Sopenharmony_ci    if (ret == 0) {
105e509ee18Sopenharmony_ci        cJSON_Delete(node);
106e509ee18Sopenharmony_ci        return false;
107e509ee18Sopenharmony_ci    }
108e509ee18Sopenharmony_ci
109e509ee18Sopenharmony_ci    return true;
110e509ee18Sopenharmony_ci}
111e509ee18Sopenharmony_ci
112e509ee18Sopenharmony_cibool PtJson::Add(const char *key, const char *value) const
113e509ee18Sopenharmony_ci{
114e509ee18Sopenharmony_ci    ASSERT(key != nullptr && !Contains(key));
115e509ee18Sopenharmony_ci
116e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateString(value);
117e509ee18Sopenharmony_ci    if (node == nullptr) {
118e509ee18Sopenharmony_ci        return false;
119e509ee18Sopenharmony_ci    }
120e509ee18Sopenharmony_ci
121e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToObject(object_, key, node);
122e509ee18Sopenharmony_ci    if (ret == 0) {
123e509ee18Sopenharmony_ci        cJSON_Delete(node);
124e509ee18Sopenharmony_ci        return false;
125e509ee18Sopenharmony_ci    }
126e509ee18Sopenharmony_ci
127e509ee18Sopenharmony_ci    return true;
128e509ee18Sopenharmony_ci}
129e509ee18Sopenharmony_ci
130e509ee18Sopenharmony_cibool PtJson::Add(const char *key, const std::unique_ptr<PtJson> &value) const
131e509ee18Sopenharmony_ci{
132e509ee18Sopenharmony_ci    ASSERT(key != nullptr && !Contains(key));
133e509ee18Sopenharmony_ci
134e509ee18Sopenharmony_ci    cJSON *node = value->GetJson();
135e509ee18Sopenharmony_ci    if (node == nullptr) {
136e509ee18Sopenharmony_ci        return false;
137e509ee18Sopenharmony_ci    }
138e509ee18Sopenharmony_ci
139e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToObject(object_, key, node);
140e509ee18Sopenharmony_ci    if (ret == 0) {
141e509ee18Sopenharmony_ci        return false;
142e509ee18Sopenharmony_ci    }
143e509ee18Sopenharmony_ci
144e509ee18Sopenharmony_ci    return true;
145e509ee18Sopenharmony_ci}
146e509ee18Sopenharmony_ci
147e509ee18Sopenharmony_cibool PtJson::Push(bool value) const
148e509ee18Sopenharmony_ci{
149e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateBool(value);
150e509ee18Sopenharmony_ci    if (node == nullptr) {
151e509ee18Sopenharmony_ci        return false;
152e509ee18Sopenharmony_ci    }
153e509ee18Sopenharmony_ci
154e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToArray(object_, node);
155e509ee18Sopenharmony_ci    if (ret == 0) {
156e509ee18Sopenharmony_ci        cJSON_Delete(node);
157e509ee18Sopenharmony_ci        return false;
158e509ee18Sopenharmony_ci    }
159e509ee18Sopenharmony_ci
160e509ee18Sopenharmony_ci    return true;
161e509ee18Sopenharmony_ci}
162e509ee18Sopenharmony_ci
163e509ee18Sopenharmony_cibool PtJson::Push(int32_t value) const
164e509ee18Sopenharmony_ci{
165e509ee18Sopenharmony_ci    return Push(static_cast<double>(value));
166e509ee18Sopenharmony_ci}
167e509ee18Sopenharmony_ci
168e509ee18Sopenharmony_cibool PtJson::Push(int64_t value) const
169e509ee18Sopenharmony_ci{
170e509ee18Sopenharmony_ci    return Push(static_cast<double>(value));
171e509ee18Sopenharmony_ci}
172e509ee18Sopenharmony_ci
173e509ee18Sopenharmony_cibool PtJson::Push(uint32_t value) const
174e509ee18Sopenharmony_ci{
175e509ee18Sopenharmony_ci    return Push(static_cast<double>(value));
176e509ee18Sopenharmony_ci}
177e509ee18Sopenharmony_ci
178e509ee18Sopenharmony_cibool PtJson::Push(double value) const
179e509ee18Sopenharmony_ci{
180e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateNumber(value);
181e509ee18Sopenharmony_ci    if (node == nullptr) {
182e509ee18Sopenharmony_ci        return false;
183e509ee18Sopenharmony_ci    }
184e509ee18Sopenharmony_ci
185e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToArray(object_, node);
186e509ee18Sopenharmony_ci    if (ret == 0) {
187e509ee18Sopenharmony_ci        cJSON_Delete(node);
188e509ee18Sopenharmony_ci        return false;
189e509ee18Sopenharmony_ci    }
190e509ee18Sopenharmony_ci
191e509ee18Sopenharmony_ci    return true;
192e509ee18Sopenharmony_ci}
193e509ee18Sopenharmony_ci
194e509ee18Sopenharmony_cibool PtJson::Push(const char *value) const
195e509ee18Sopenharmony_ci{
196e509ee18Sopenharmony_ci    cJSON *node = cJSON_CreateString(value);
197e509ee18Sopenharmony_ci    if (node == nullptr) {
198e509ee18Sopenharmony_ci        return false;
199e509ee18Sopenharmony_ci    }
200e509ee18Sopenharmony_ci
201e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToArray(object_, node);
202e509ee18Sopenharmony_ci    if (ret == 0) {
203e509ee18Sopenharmony_ci        cJSON_Delete(node);
204e509ee18Sopenharmony_ci        return false;
205e509ee18Sopenharmony_ci    }
206e509ee18Sopenharmony_ci
207e509ee18Sopenharmony_ci    return true;
208e509ee18Sopenharmony_ci}
209e509ee18Sopenharmony_ci
210e509ee18Sopenharmony_cibool PtJson::Push(const std::unique_ptr<PtJson> &value) const
211e509ee18Sopenharmony_ci{
212e509ee18Sopenharmony_ci    if (value == nullptr) {
213e509ee18Sopenharmony_ci        return false;
214e509ee18Sopenharmony_ci    }
215e509ee18Sopenharmony_ci
216e509ee18Sopenharmony_ci    cJSON *node = value->GetJson();
217e509ee18Sopenharmony_ci    if (node == nullptr) {
218e509ee18Sopenharmony_ci        return false;
219e509ee18Sopenharmony_ci    }
220e509ee18Sopenharmony_ci
221e509ee18Sopenharmony_ci    cJSON_bool ret = cJSON_AddItemToArray(object_, node);
222e509ee18Sopenharmony_ci    if (ret == 0) {
223e509ee18Sopenharmony_ci        return false;
224e509ee18Sopenharmony_ci    }
225e509ee18Sopenharmony_ci
226e509ee18Sopenharmony_ci    return true;
227e509ee18Sopenharmony_ci}
228e509ee18Sopenharmony_ci
229e509ee18Sopenharmony_cibool PtJson::Remove(const char *key) const
230e509ee18Sopenharmony_ci{
231e509ee18Sopenharmony_ci    ASSERT(key != nullptr && Contains(key));
232e509ee18Sopenharmony_ci
233e509ee18Sopenharmony_ci    cJSON_DeleteItemFromObject(object_, key);
234e509ee18Sopenharmony_ci    return true;
235e509ee18Sopenharmony_ci}
236e509ee18Sopenharmony_ci
237e509ee18Sopenharmony_cibool PtJson::Contains(const char *key) const
238e509ee18Sopenharmony_ci{
239e509ee18Sopenharmony_ci    cJSON *node = cJSON_GetObjectItemCaseSensitive(object_, key);
240e509ee18Sopenharmony_ci    return node != nullptr;
241e509ee18Sopenharmony_ci}
242e509ee18Sopenharmony_ci
243e509ee18Sopenharmony_cistd::string PtJson::GetKey() const
244e509ee18Sopenharmony_ci{
245e509ee18Sopenharmony_ci    if (object_ == nullptr || object_->string == nullptr) {
246e509ee18Sopenharmony_ci        return "";
247e509ee18Sopenharmony_ci    }
248e509ee18Sopenharmony_ci
249e509ee18Sopenharmony_ci    return std::string(object_->string);
250e509ee18Sopenharmony_ci}
251e509ee18Sopenharmony_ci
252e509ee18Sopenharmony_cicJSON *PtJson::GetJson() const
253e509ee18Sopenharmony_ci{
254e509ee18Sopenharmony_ci    return object_;
255e509ee18Sopenharmony_ci}
256e509ee18Sopenharmony_ci
257e509ee18Sopenharmony_cibool PtJson::IsBool() const
258e509ee18Sopenharmony_ci{
259e509ee18Sopenharmony_ci    return cJSON_IsBool(object_) != 0;
260e509ee18Sopenharmony_ci}
261e509ee18Sopenharmony_ci
262e509ee18Sopenharmony_cibool PtJson::IsNumber() const
263e509ee18Sopenharmony_ci{
264e509ee18Sopenharmony_ci    return cJSON_IsNumber(object_) != 0;
265e509ee18Sopenharmony_ci}
266e509ee18Sopenharmony_ci
267e509ee18Sopenharmony_cibool PtJson::IsString() const
268e509ee18Sopenharmony_ci{
269e509ee18Sopenharmony_ci    return cJSON_IsString(object_) != 0;
270e509ee18Sopenharmony_ci}
271e509ee18Sopenharmony_ci
272e509ee18Sopenharmony_cibool PtJson::IsObject() const
273e509ee18Sopenharmony_ci{
274e509ee18Sopenharmony_ci    return cJSON_IsObject(object_) != 0;
275e509ee18Sopenharmony_ci}
276e509ee18Sopenharmony_ci
277e509ee18Sopenharmony_cibool PtJson::IsArray() const
278e509ee18Sopenharmony_ci{
279e509ee18Sopenharmony_ci    return cJSON_IsArray(object_) != 0;
280e509ee18Sopenharmony_ci}
281e509ee18Sopenharmony_ci
282e509ee18Sopenharmony_cibool PtJson::IsNull() const
283e509ee18Sopenharmony_ci{
284e509ee18Sopenharmony_ci    return cJSON_IsNull(object_) != 0;
285e509ee18Sopenharmony_ci}
286e509ee18Sopenharmony_ci
287e509ee18Sopenharmony_cibool PtJson::GetBool(bool defaultValue) const
288e509ee18Sopenharmony_ci{
289e509ee18Sopenharmony_ci    if (!IsBool()) {
290e509ee18Sopenharmony_ci        return defaultValue;
291e509ee18Sopenharmony_ci    }
292e509ee18Sopenharmony_ci
293e509ee18Sopenharmony_ci    return cJSON_IsTrue(object_) != 0;
294e509ee18Sopenharmony_ci}
295e509ee18Sopenharmony_ci
296e509ee18Sopenharmony_ciint32_t PtJson::GetInt(int32_t defaultValue) const
297e509ee18Sopenharmony_ci{
298e509ee18Sopenharmony_ci    if (!IsNumber()) {
299e509ee18Sopenharmony_ci        return defaultValue;
300e509ee18Sopenharmony_ci    }
301e509ee18Sopenharmony_ci
302e509ee18Sopenharmony_ci    return static_cast<int32_t>(object_->valuedouble);
303e509ee18Sopenharmony_ci}
304e509ee18Sopenharmony_ci
305e509ee18Sopenharmony_ciint64_t PtJson::GetInt64(int64_t defaultValue) const
306e509ee18Sopenharmony_ci{
307e509ee18Sopenharmony_ci    if (!IsNumber()) {
308e509ee18Sopenharmony_ci        return defaultValue;
309e509ee18Sopenharmony_ci    }
310e509ee18Sopenharmony_ci
311e509ee18Sopenharmony_ci    return static_cast<int64_t>(object_->valuedouble);
312e509ee18Sopenharmony_ci}
313e509ee18Sopenharmony_ci
314e509ee18Sopenharmony_ciuint32_t PtJson::GetUInt(uint32_t defaultValue) const
315e509ee18Sopenharmony_ci{
316e509ee18Sopenharmony_ci    if (!IsNumber()) {
317e509ee18Sopenharmony_ci        return defaultValue;
318e509ee18Sopenharmony_ci    }
319e509ee18Sopenharmony_ci
320e509ee18Sopenharmony_ci    return static_cast<uint32_t>(object_->valuedouble);
321e509ee18Sopenharmony_ci}
322e509ee18Sopenharmony_ci
323e509ee18Sopenharmony_ciuint64_t PtJson::GetUInt64(uint64_t defaultValue) const
324e509ee18Sopenharmony_ci{
325e509ee18Sopenharmony_ci    if (!IsNumber()) {
326e509ee18Sopenharmony_ci        return defaultValue;
327e509ee18Sopenharmony_ci    }
328e509ee18Sopenharmony_ci
329e509ee18Sopenharmony_ci    return static_cast<uint64_t>(object_->valuedouble);
330e509ee18Sopenharmony_ci}
331e509ee18Sopenharmony_ci
332e509ee18Sopenharmony_cidouble PtJson::GetDouble(double defaultValue) const
333e509ee18Sopenharmony_ci{
334e509ee18Sopenharmony_ci    if (!IsNumber()) {
335e509ee18Sopenharmony_ci        return defaultValue;
336e509ee18Sopenharmony_ci    }
337e509ee18Sopenharmony_ci
338e509ee18Sopenharmony_ci    return object_->valuedouble;
339e509ee18Sopenharmony_ci}
340e509ee18Sopenharmony_ci
341e509ee18Sopenharmony_cistd::string PtJson::GetString() const
342e509ee18Sopenharmony_ci{
343e509ee18Sopenharmony_ci    if (!IsString()) {
344e509ee18Sopenharmony_ci        return "";
345e509ee18Sopenharmony_ci    }
346e509ee18Sopenharmony_ci
347e509ee18Sopenharmony_ci    return std::string(object_->valuestring);
348e509ee18Sopenharmony_ci}
349e509ee18Sopenharmony_ci
350e509ee18Sopenharmony_ciint32_t PtJson::GetSize() const
351e509ee18Sopenharmony_ci{
352e509ee18Sopenharmony_ci    return cJSON_GetArraySize(object_);
353e509ee18Sopenharmony_ci}
354e509ee18Sopenharmony_ci
355e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::Get(int32_t index) const
356e509ee18Sopenharmony_ci{
357e509ee18Sopenharmony_ci    return std::make_unique<PtJson>(cJSON_GetArrayItem(object_, index));
358e509ee18Sopenharmony_ci}
359e509ee18Sopenharmony_ci
360e509ee18Sopenharmony_ciResult PtJson::GetBool(const char *key, bool *value) const
361e509ee18Sopenharmony_ci{
362e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
363e509ee18Sopenharmony_ci    if (item == nullptr) {
364e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
365e509ee18Sopenharmony_ci    }
366e509ee18Sopenharmony_ci    if (cJSON_IsBool(item) == 0) {
367e509ee18Sopenharmony_ci        return Result::TYPE_ERROR;
368e509ee18Sopenharmony_ci    }
369e509ee18Sopenharmony_ci
370e509ee18Sopenharmony_ci    *value = cJSON_IsTrue(item) != 0;
371e509ee18Sopenharmony_ci    return Result::SUCCESS;
372e509ee18Sopenharmony_ci}
373e509ee18Sopenharmony_ci
374e509ee18Sopenharmony_ciResult PtJson::GetInt(const char *key, int32_t *value) const
375e509ee18Sopenharmony_ci{
376e509ee18Sopenharmony_ci    double result;
377e509ee18Sopenharmony_ci    Result ret = GetDouble(key, &result);
378e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
379e509ee18Sopenharmony_ci        *value = static_cast<int32_t>(result);
380e509ee18Sopenharmony_ci    }
381e509ee18Sopenharmony_ci    return ret;
382e509ee18Sopenharmony_ci}
383e509ee18Sopenharmony_ci
384e509ee18Sopenharmony_ciResult PtJson::GetInt64(const char *key, int64_t *value) const
385e509ee18Sopenharmony_ci{
386e509ee18Sopenharmony_ci    double result;
387e509ee18Sopenharmony_ci    Result ret = GetDouble(key, &result);
388e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
389e509ee18Sopenharmony_ci        *value = static_cast<int64_t>(result);
390e509ee18Sopenharmony_ci    }
391e509ee18Sopenharmony_ci    return ret;
392e509ee18Sopenharmony_ci}
393e509ee18Sopenharmony_ci
394e509ee18Sopenharmony_ciResult PtJson::GetUInt(const char *key, uint32_t *value) const
395e509ee18Sopenharmony_ci{
396e509ee18Sopenharmony_ci    double result;
397e509ee18Sopenharmony_ci    Result ret = GetDouble(key, &result);
398e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
399e509ee18Sopenharmony_ci        *value = static_cast<uint32_t>(result);
400e509ee18Sopenharmony_ci    }
401e509ee18Sopenharmony_ci    return ret;
402e509ee18Sopenharmony_ci}
403e509ee18Sopenharmony_ci
404e509ee18Sopenharmony_ciResult PtJson::GetUInt64(const char *key, uint64_t *value) const
405e509ee18Sopenharmony_ci{
406e509ee18Sopenharmony_ci    double result;
407e509ee18Sopenharmony_ci    Result ret = GetDouble(key, &result);
408e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
409e509ee18Sopenharmony_ci        *value = static_cast<uint64_t>(result);
410e509ee18Sopenharmony_ci    }
411e509ee18Sopenharmony_ci    return ret;
412e509ee18Sopenharmony_ci}
413e509ee18Sopenharmony_ci
414e509ee18Sopenharmony_ciResult PtJson::GetDouble(const char *key, double *value) const
415e509ee18Sopenharmony_ci{
416e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
417e509ee18Sopenharmony_ci    if (item == nullptr) {
418e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
419e509ee18Sopenharmony_ci    }
420e509ee18Sopenharmony_ci    if (cJSON_IsNumber(item) == 0) {
421e509ee18Sopenharmony_ci        return Result::TYPE_ERROR;
422e509ee18Sopenharmony_ci    }
423e509ee18Sopenharmony_ci
424e509ee18Sopenharmony_ci    *value = item->valuedouble;
425e509ee18Sopenharmony_ci    return Result::SUCCESS;
426e509ee18Sopenharmony_ci}
427e509ee18Sopenharmony_ci
428e509ee18Sopenharmony_ciResult PtJson::GetString(const char *key, std::string *value) const
429e509ee18Sopenharmony_ci{
430e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
431e509ee18Sopenharmony_ci    if (item == nullptr) {
432e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
433e509ee18Sopenharmony_ci    }
434e509ee18Sopenharmony_ci    if (cJSON_IsString(item) == 0) {
435e509ee18Sopenharmony_ci        return Result::TYPE_ERROR;
436e509ee18Sopenharmony_ci    }
437e509ee18Sopenharmony_ci
438e509ee18Sopenharmony_ci    *value = item->valuestring;
439e509ee18Sopenharmony_ci    return Result::SUCCESS;
440e509ee18Sopenharmony_ci}
441e509ee18Sopenharmony_ci
442e509ee18Sopenharmony_ciResult PtJson::GetObject(const char *key, std::unique_ptr<PtJson> *value) const
443e509ee18Sopenharmony_ci{
444e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
445e509ee18Sopenharmony_ci    if (item == nullptr) {
446e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
447e509ee18Sopenharmony_ci    }
448e509ee18Sopenharmony_ci    if (cJSON_IsObject(item) == 0) {
449e509ee18Sopenharmony_ci        return Result::TYPE_ERROR;
450e509ee18Sopenharmony_ci    }
451e509ee18Sopenharmony_ci
452e509ee18Sopenharmony_ci    *value = std::make_unique<PtJson>(item);
453e509ee18Sopenharmony_ci    return Result::SUCCESS;
454e509ee18Sopenharmony_ci}
455e509ee18Sopenharmony_ci
456e509ee18Sopenharmony_ciResult PtJson::GetArray(const char *key, std::unique_ptr<PtJson> *value) const
457e509ee18Sopenharmony_ci{
458e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
459e509ee18Sopenharmony_ci    if (item == nullptr) {
460e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
461e509ee18Sopenharmony_ci    }
462e509ee18Sopenharmony_ci    if (cJSON_IsArray(item) == 0) {
463e509ee18Sopenharmony_ci        return Result::TYPE_ERROR;
464e509ee18Sopenharmony_ci    }
465e509ee18Sopenharmony_ci
466e509ee18Sopenharmony_ci    *value = std::make_unique<PtJson>(item);
467e509ee18Sopenharmony_ci    return Result::SUCCESS;
468e509ee18Sopenharmony_ci}
469e509ee18Sopenharmony_ci
470e509ee18Sopenharmony_ciResult PtJson::GetAny(const char *key, std::unique_ptr<PtJson> *value) const
471e509ee18Sopenharmony_ci{
472e509ee18Sopenharmony_ci    cJSON *item = cJSON_GetObjectItem(object_, key);
473e509ee18Sopenharmony_ci    if (item == nullptr) {
474e509ee18Sopenharmony_ci        return Result::NOT_EXIST;
475e509ee18Sopenharmony_ci    }
476e509ee18Sopenharmony_ci
477e509ee18Sopenharmony_ci    *value = std::make_unique<PtJson>(item);
478e509ee18Sopenharmony_ci    return Result::SUCCESS;
479e509ee18Sopenharmony_ci}
480e509ee18Sopenharmony_ci}  // namespace panda::ecmascript
481