diff options
| author | levlam <levlam@telegram.org> | 2019-12-08 10:44:41 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2019-12-08 10:44:41 +0300 |
| commit | 95bee165231fd789124ff23e9f4d2a89069c99dd (patch) | |
| tree | 16011d983d11a89877a10923d5c91aa38959f140 | |
| parent | 8c495d99e67659794683df8399848a3af2ca51e6 (diff) | |
Simplify td_api_json more.
GitOrigin-RevId: 4df61a045e381a4577321c87a2b393747992127e
| -rw-r--r-- | td/generate/tl_json_converter.cpp | 31 | ||||
| -rw-r--r-- | td/telegram/ClientJson.cpp | 2 | ||||
| -rw-r--r-- | td/tl/tl_json.h | 43 | ||||
| -rw-r--r-- | tdtl/td/tl/tl_simple.h | 6 |
4 files changed, 50 insertions, 32 deletions
diff --git a/td/generate/tl_json_converter.cpp b/td/generate/tl_json_converter.cpp index fff685577..75f98f49e 100644 --- a/td/generate/tl_json_converter.cpp +++ b/td/generate/tl_json_converter.cpp @@ -26,7 +26,7 @@ void gen_to_json_constructor(StringBuilder &sb, const T *constructor, bool is_he sb << "void to_json(JsonValueScope &jv, " << "const td_api::" << tl::simple::gen_cpp_name(constructor->name) << " &object)"; if (is_header) { - sb << ";\n"; + sb << ";\n\n"; return; } sb << " {\n"; @@ -54,7 +54,7 @@ void gen_to_json_constructor(StringBuilder &sb, const T *constructor, bool is_he sb << " }\n"; } } - sb << "}\n"; + sb << "}\n\n"; } void gen_to_json(StringBuilder &sb, const tl::simple::Schema &schema, bool is_header, Mode mode) { @@ -66,13 +66,13 @@ void gen_to_json(StringBuilder &sb, const tl::simple::Schema &schema, bool is_he auto type_name = tl::simple::gen_cpp_name(custom_type->name); sb << "void to_json(JsonValueScope &jv, const td_api::" << type_name << " &object)"; if (is_header) { - sb << ";\n"; + sb << ";\n\n"; } else { sb << " {\n" << " td_api::downcast_call(const_cast<td_api::" << type_name << " &>(object), [&jv](const auto &object) { " "to_json(jv, object); });\n" - << "}\n"; + << "}\n\n"; } } for (auto *constructor : custom_type->constructors) { @@ -91,23 +91,16 @@ template <class T> void gen_from_json_constructor(StringBuilder &sb, const T *constructor, bool is_header) { sb << "Status from_json(td_api::" << tl::simple::gen_cpp_name(constructor->name) << " &to, JsonObject &from)"; if (is_header) { - sb << ";\n"; + sb << ";\n\n"; } else { sb << " {\n"; for (auto &arg : constructor->args) { - sb << " {\n"; - sb << " auto value = get_json_object_field_force(from, \"" << tl::simple::gen_cpp_name(arg.name) << "\");\n"; - sb << " if (value.type() != td::JsonValue::Type::Null) {\n"; - if (arg.type->type == tl::simple::Type::Bytes) { - sb << " TRY_STATUS(from_json_bytes(to." << tl::simple::gen_cpp_field_name(arg.name) << ", value));\n"; - } else { - sb << " TRY_STATUS(from_json(to." << tl::simple::gen_cpp_field_name(arg.name) << ", value));\n"; - } - sb << " }\n"; - sb << " }\n"; + sb << " TRY_STATUS(from_json" << (arg.type->type == tl::simple::Type::Bytes ? "_bytes" : "") << "(to." + << tl::simple::gen_cpp_field_name(arg.name) << ", get_json_object_field_force(from, \"" + << tl::simple::gen_cpp_name(arg.name) << "\")));\n"; } sb << " return Status::OK();\n"; - sb << "}\n"; + sb << "}\n\n"; } } @@ -132,7 +125,7 @@ using Vec = std::vector<std::pair<int32, std::string>>; void gen_tl_constructor_from_string(StringBuilder &sb, Slice name, const Vec &vec, bool is_header) { sb << "Result<int32> tl_constructor_from_string(td_api::" << name << " *object, const std::string &str)"; if (is_header) { - sb << ";\n"; + sb << ";\n\n"; return; } sb << " {\n"; @@ -153,7 +146,7 @@ void gen_tl_constructor_from_string(StringBuilder &sb, Slice name, const Vec &ve << " return Status::Error(PSLICE() << \"Unknown class \\\"\" << str << \"\\\"\");\n" << " }\n" << " return it->second;\n"; - sb << "}\n"; + sb << "}\n\n"; } void gen_tl_constructor_from_string(StringBuilder &sb, const tl::simple::Schema &schema, bool is_header, Mode mode) { @@ -221,7 +214,7 @@ void gen_json_converter_file(const tl::simple::Schema &schema, const std::string sb << "#include <unordered_map>\n\n"; } sb << "namespace td {\n"; - sb << "namespace td_api{\n"; + sb << "namespace td_api{\n\n"; gen_tl_constructor_from_string(sb, schema, is_header, mode); gen_from_json(sb, schema, is_header, mode); gen_to_json(sb, schema, is_header, mode); diff --git a/td/telegram/ClientJson.cpp b/td/telegram/ClientJson.cpp index 02b7dd733..9f858687e 100644 --- a/td/telegram/ClientJson.cpp +++ b/td/telegram/ClientJson.cpp @@ -45,7 +45,7 @@ static std::pair<td_api::object_ptr<td_api::Function>, string> to_request(Slice } td_api::object_ptr<td_api::Function> func; - auto status = from_json(func, json_value); + auto status = from_json(func, std::move(json_value)); if (status.is_error()) { return {get_return_error_function(PSLICE() << "Failed to parse JSON object as TDLib request: " << status.error().message()), diff --git a/td/tl/tl_json.h b/td/tl/tl_json.h index 7c5751417..5323750f8 100644 --- a/td/tl/tl_json.h +++ b/td/tl/tl_json.h @@ -76,8 +76,11 @@ void to_json(JsonValueScope &jv, const std::vector<T> &v) { } } -inline Status from_json(int32 &to, JsonValue &from) { +inline Status from_json(int32 &to, JsonValue from) { if (from.type() != JsonValue::Type::Number && from.type() != JsonValue::Type::String) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected Number, got " << from.type()); } Slice number = from.type() == JsonValue::Type::String ? from.get_string() : from.get_number(); @@ -85,10 +88,13 @@ inline Status from_json(int32 &to, JsonValue &from) { return Status::OK(); } -inline Status from_json(bool &to, JsonValue &from) { +inline Status from_json(bool &to, JsonValue from) { if (from.type() != JsonValue::Type::Boolean) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } int32 x = 0; - auto status = from_json(x, from); + auto status = from_json(x, std::move(from)); if (status.is_ok()) { to = x != 0; return Status::OK(); @@ -99,8 +105,11 @@ inline Status from_json(bool &to, JsonValue &from) { return Status::OK(); } -inline Status from_json(int64 &to, JsonValue &from) { +inline Status from_json(int64 &to, JsonValue from) { if (from.type() != JsonValue::Type::Number && from.type() != JsonValue::Type::String) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected String or Number, got " << from.type()); } Slice number = from.type() == JsonValue::Type::String ? from.get_string() : from.get_number(); @@ -108,24 +117,33 @@ inline Status from_json(int64 &to, JsonValue &from) { return Status::OK(); } -inline Status from_json(double &to, JsonValue &from) { +inline Status from_json(double &to, JsonValue from) { if (from.type() != JsonValue::Type::Number) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected Number, got " << from.type()); } to = to_double(from.get_number()); return Status::OK(); } -inline Status from_json(string &to, JsonValue &from) { +inline Status from_json(string &to, JsonValue from) { if (from.type() != JsonValue::Type::String) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected String, got " << from.type()); } to = from.get_string().str(); return Status::OK(); } -inline Status from_json_bytes(string &to, JsonValue &from) { +inline Status from_json_bytes(string &to, JsonValue from) { if (from.type() != JsonValue::Type::String) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected String, got " << from.type()); } TRY_RESULT_ASSIGN(to, base64_decode(from.get_string())); @@ -133,14 +151,17 @@ inline Status from_json_bytes(string &to, JsonValue &from) { } template <class T> -Status from_json(std::vector<T> &to, JsonValue &from) { +Status from_json(std::vector<T> &to, JsonValue from) { if (from.type() != JsonValue::Type::Array) { + if (from.type() == JsonValue::Type::Null) { + return Status::OK(); + } return Status::Error(PSLICE() << "Expected Array, got " << from.type()); } to = std::vector<T>(from.get_array().size()); size_t i = 0; for (auto &value : from.get_array()) { - TRY_STATUS(from_json(to[i], value)); + TRY_STATUS(from_json(to[i], std::move(value))); i++; } return Status::OK(); @@ -162,7 +183,7 @@ class DowncastHelper : public T { }; template <class T> -std::enable_if_t<!std::is_constructible<T>::value, Status> from_json(tl_object_ptr<T> &to, JsonValue &from) { +std::enable_if_t<!std::is_constructible<T>::value, Status> from_json(tl_object_ptr<T> &to, JsonValue from) { if (from.type() != JsonValue::Type::Object) { if (from.type() == JsonValue::Type::Null) { to = nullptr; @@ -198,7 +219,7 @@ std::enable_if_t<!std::is_constructible<T>::value, Status> from_json(tl_object_p } template <class T> -std::enable_if_t<std::is_constructible<T>::value, Status> from_json(tl_object_ptr<T> &to, JsonValue &from) { +std::enable_if_t<std::is_constructible<T>::value, Status> from_json(tl_object_ptr<T> &to, JsonValue from) { if (from.type() != JsonValue::Type::Object) { if (from.type() == JsonValue::Type::Null) { to = nullptr; diff --git a/tdtl/td/tl/tl_simple.h b/tdtl/td/tl/tl_simple.h index ea53a0620..b7d99cd31 100644 --- a/tdtl/td/tl/tl_simple.h +++ b/tdtl/td/tl/tl_simple.h @@ -21,7 +21,6 @@ namespace td { namespace tl { namespace simple { -// TL type is std::string gen_cpp_name(std::string name) { for (std::size_t i = 0; i < name.size(); i++) { @@ -132,9 +131,11 @@ class Schema { void mark_result(const Type *type) { do_mark(type, true); } + void mark_query(const Type *type) { do_mark(type, false); } + void do_mark(const Type *type, bool is_result) { if (type->type == Type::Vector) { return do_mark(type->vector_value_type, is_result); @@ -190,6 +191,7 @@ class Schema { } return type; } + const CustomType *get_custom_type(const tl_type *from_type) { auto *type = get_type(from_type); assert(type->type == Type::Custom); @@ -213,6 +215,7 @@ class Schema { } return constructor; } + const Function *get_function(const tl_combinator *from) { auto &function = function_by_id[from->id]; if (!function) { @@ -230,6 +233,7 @@ class Schema { } return function; } + const Type *get_type(const tl_tree *tree) { assert(tree->get_type() == NODE_TYPE_TYPE); auto *type_tree = static_cast<const tl_tree_type *>(tree); |
