diff options
| author | levlam <levlam@telegram.org> | 2018-12-10 04:01:02 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2018-12-10 04:01:02 +0300 |
| commit | e2b8b72541e2e87884f2868499b10f36898047bc (patch) | |
| tree | bec28be1fb6304a6ec5ed73f41ce4ecacce2c651 /td/telegram/JsonValue.cpp | |
| parent | c4c9707f7a8f744979d6316fff6e3f73b296f1fd (diff) | |
Add td_api::JsonValue support.
GitOrigin-RevId: b79580a42f72c195c7c76d213f277702ee035907
Diffstat (limited to 'td/telegram/JsonValue.cpp')
| -rw-r--r-- | td/telegram/JsonValue.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/td/telegram/JsonValue.cpp b/td/telegram/JsonValue.cpp new file mode 100644 index 000000000..226ffc829 --- /dev/null +++ b/td/telegram/JsonValue.cpp @@ -0,0 +1,103 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/JsonValue.h" + +#include "td/utils/JsonBuilder.h" +#include "td/utils/misc.h" + +namespace td { + +static td_api::object_ptr<td_api::JsonValue> get_json_value_object(const JsonValue &json_value); + +static td_api::object_ptr<td_api::jsonObjectMember> get_json_value_member_object( + const std::pair<MutableSlice, JsonValue> &json_value_member) { + return td_api::make_object<td_api::jsonObjectMember>(json_value_member.first.str(), + get_json_value_object(json_value_member.second)); +} + +static td_api::object_ptr<td_api::JsonValue> get_json_value_object(const JsonValue &json_value) { + switch (json_value.type()) { + case JsonValue::Type::Null: + return td_api::make_object<td_api::jsonValueNull>(); + case JsonValue::Type::Boolean: + return td_api::make_object<td_api::jsonValueBoolean>(json_value.get_boolean()); + case JsonValue::Type::Number: + return td_api::make_object<td_api::jsonValueNumber>(to_double(json_value.get_number())); + case JsonValue::Type::String: + return td_api::make_object<td_api::jsonValueString>(json_value.get_string().str()); + case JsonValue::Type::Array: + return td_api::make_object<td_api::jsonValueArray>(transform(json_value.get_array(), get_json_value_object)); + case JsonValue::Type::Object: + return td_api::make_object<td_api::jsonValueObject>( + transform(json_value.get_object(), get_json_value_member_object)); + default: + UNREACHABLE(); + return nullptr; + } +} + +Result<td_api::object_ptr<td_api::JsonValue>> get_json_value(MutableSlice json) { + TRY_RESULT(json_value, json_decode(json)); + return get_json_value_object(json_value); +} + +namespace { + +class JsonableJsonValue : public Jsonable { + public: + explicit JsonableJsonValue(const td_api::JsonValue *json_value) : json_value_(json_value) { + } + void store(JsonValueScope *scope) const { + if (json_value_ == nullptr) { + *scope << JsonNull(); + return; + } + switch (json_value_->get_id()) { + case td_api::jsonValueNull::ID: + *scope << JsonNull(); + break; + case td_api::jsonValueBoolean::ID: + *scope << static_cast<const td_api::jsonValueBoolean *>(json_value_)->value_; + break; + case td_api::jsonValueNumber::ID: + *scope << static_cast<const td_api::jsonValueNumber *>(json_value_)->value_; + break; + case td_api::jsonValueString::ID: + *scope << static_cast<const td_api::jsonValueString *>(json_value_)->value_; + break; + case td_api::jsonValueArray::ID: { + auto array = scope->enter_array(); + for (auto &value : static_cast<const td_api::jsonValueArray *>(json_value_)->values_) { + array << JsonableJsonValue(value.get()); + } + break; + } + case td_api::jsonValueObject::ID: { + auto object = scope->enter_object(); + for (auto &member : static_cast<const td_api::jsonValueObject *>(json_value_)->members_) { + if (member != nullptr) { + object << ctie(member->key_, JsonableJsonValue(member->value_.get())); + } + } + break; + } + default: + UNREACHABLE(); + } + } + + private: + const td_api::JsonValue *json_value_; +}; + +} // namespace + +string get_json_string(const td_api::JsonValue *json_value) { + return json_encode<string>(JsonableJsonValue(json_value)); +} + +} // namespace td |
