1
0
Fork 0
mirror of https://github.com/fastogt/fastocloud.git synced 2025-03-09 23:18:50 +00:00
fastocloud/src/base/stream_config_parse.cpp
2023-01-21 05:21:27 +03:00

188 lines
6.2 KiB
C++

/* Copyright (C) 2014-2022 FastoGT. All right reserved.
This file is part of fastocloud.
fastocloud is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
fastocloud is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with fastocloud. If not, see <http://www.gnu.org/licenses/>.
*/
#include "base/stream_config_parse.h"
#include <string>
#include <vector>
#include <json-c/json_tokener.h>
#include <json-c/linkhash.h>
#include <common/serializer/json_serializer.h>
namespace {
common::Value* MakeValueFromJson(json_object* obj) {
json_type obj_type = json_object_get_type(obj);
if (obj_type == json_type_null) {
return common::Value::CreateNullValue();
} else if (obj_type == json_type_boolean) {
return common::Value::CreateBooleanValue(json_object_get_boolean(obj));
} else if (obj_type == json_type_double) {
return common::Value::CreateDoubleValue(json_object_get_double(obj));
} else if (obj_type == json_type_int) {
int64_t jint = json_object_get_int64(obj);
return common::Value::CreateInteger64Value(jint);
} else if (obj_type == json_type_string) {
return common::Value::CreateStringValueFromBasicString(json_object_get_string(obj));
} else if (obj_type == json_type_object) {
common::HashValue* result = common::Value::CreateHashValue();
json_object_object_foreach(obj, key, val) {
json_type val_type = json_object_get_type(val);
common::Value* value = nullptr;
switch (val_type) {
case json_type_null:
value = common::Value::CreateNullValue();
break;
case json_type_boolean:
value = common::Value::CreateBooleanValue(json_object_get_boolean(val));
break;
case json_type_double:
value = common::Value::CreateDoubleValue(json_object_get_double(val));
break;
case json_type_int:
value = common::Value::CreateInteger64Value(json_object_get_int64(val));
break;
case json_type_string:
value = common::Value::CreateStringValueFromBasicString(json_object_get_string(val));
break;
case json_type_object:
value = MakeValueFromJson(val);
break;
case json_type_array:
common::ArrayValue* arr = common::Value::CreateArrayValue();
for (size_t i = 0; i < json_object_array_length(val); i++) {
json_object* item = json_object_array_get_idx(val, i);
arr->Append(MakeValueFromJson(item));
}
value = arr;
break;
}
result->Insert(key, value);
}
return result;
} else if (obj_type == json_type_array) {
common::ArrayValue* arr = common::Value::CreateArrayValue();
for (size_t i = 0; i < json_object_array_length(obj); i++) {
json_object* item = json_object_array_get_idx(obj, i);
arr->Append(MakeValueFromJson(item));
}
return arr;
}
DNOTREACHED();
return nullptr;
}
json_object* MakeJson(const common::Value* value) {
const common::Value::Type type = value->GetType();
if (type == common::Value::TYPE_NULL) {
return nullptr;
} else if (type == common::Value::TYPE_BOOLEAN) {
bool rbool;
if (value->GetAsBoolean(&rbool)) {
return json_object_new_boolean(rbool);
}
} else if (type == common::Value::TYPE_DOUBLE) {
double rdouble;
if (value->GetAsDouble(&rdouble)) {
return json_object_new_double(rdouble);
}
} else if (type == common::Value::TYPE_INTEGER64) {
int64_t rint;
if (value->GetAsInteger64(&rint)) {
return json_object_new_int64(rint);
}
} else if (type == common::Value::TYPE_STRING) {
common::Value::string_t rstring;
if (value->GetAsString(&rstring)) {
const std::string r = rstring.as_string();
return json_object_new_string(r.c_str());
}
} else if (type == common::Value::TYPE_HASH) {
json_object* result = json_object_new_object();
const common::HashValue* hash = nullptr;
if (value->GetAsHash(&hash)) {
for (auto it = hash->begin(); it != hash->end(); ++it) {
const common::Value::string_t key = it->first;
const std::string key_str = key.as_string();
const common::Value* value = it->second;
ignore_result(common::serializer::json_set_object(result, key_str.c_str(), MakeJson(value)));
}
}
return result;
} else if (type == common::Value::TYPE_ARRAY) {
json_object* arr = json_object_new_array();
const common::ArrayValue* arr_value = nullptr;
if (value->GetAsList(&arr_value)) {
for (size_t i = 0; i < arr_value->GetSize(); ++i) {
const common::Value* val = nullptr;
if (arr_value->Get(i, &val)) {
json_object* obj = MakeJson(val);
json_object_array_add(arr, obj);
}
}
}
return arr;
}
DNOTREACHED();
return nullptr;
}
} // namespace
namespace fastocloud {
std::unique_ptr<common::HashValue> MakeConfigFromJson(const std::string& json) {
if (json.empty()) {
return nullptr;
}
json_object* obj = json_tokener_parse(json.c_str());
if (!obj) {
return nullptr;
}
std::unique_ptr<common::HashValue> res = MakeConfigFromJson(obj);
json_object_put(obj);
return res;
}
std::unique_ptr<common::HashValue> MakeConfigFromJson(json_object* obj) {
json_type obj_type = json_object_get_type(obj);
if (obj_type == json_type_object) {
return std::unique_ptr<common::HashValue>(static_cast<common::HashValue*>(MakeValueFromJson(obj)));
}
return nullptr;
}
bool MakeJsonFromConfig(std::shared_ptr<common::HashValue> config, std::string* json) {
if (!config || !json) {
return false;
}
json_object* jobj = MakeJson(config.get());
if (!jobj) {
return false;
}
*json = json_object_get_string(jobj);
json_object_put(jobj);
return true;
}
} // namespace fastocloud