From 293b706c7402a5d7ecd61f503e75e660843e4844 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Wed, 11 Apr 2018 13:49:04 +0300 Subject: [PATCH] json_object draft GitOrigin-RevId: 571b710cc58c0271c0f78a9e1a1263b6858730f3 --- td/telegram/DeviceTokenManager.cpp | 9 +++++++-- tdutils/td/utils/JsonBuilder.h | 28 +++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/td/telegram/DeviceTokenManager.cpp b/td/telegram/DeviceTokenManager.cpp index 8182d6da..9f531649 100644 --- a/td/telegram/DeviceTokenManager.cpp +++ b/td/telegram/DeviceTokenManager.cpp @@ -203,8 +203,13 @@ void DeviceTokenManager::register_device(tl_object_ptr devi Slice auth_; }; - token = json_encode( - JsonWebPushToken(device_token->endpoint_, device_token->p256dh_base64url_, device_token->auth_base64url_)); + token = json_encode(json_object([&device_token](auto &o) { + o("endpoint", device_token->endpoint_); + o("keys", json_object([&device_token](auto &o) { + o("pb256df", device_token->p256dh_base64url_); + o("auth", device_token->auth_base64url_); + })); + })); } token_type = TokenType::WEB_PUSH; break; diff --git a/tdutils/td/utils/JsonBuilder.h b/tdutils/td/utils/JsonBuilder.h index 62b48ae2..7687e9fc 100644 --- a/tdutils/td/utils/JsonBuilder.h +++ b/tdutils/td/utils/JsonBuilder.h @@ -375,19 +375,23 @@ class JsonObjectScope : public JsonScope { } template JsonObjectScope &operator<<(std::tuple key_value) { - return *this << std::pair(std::get<0>(key_value), std::get<1>(key_value)); + return (*this)(std::get<0>(key_value), std::get<1>(key_value)); } template JsonObjectScope &operator<<(std::pair key_value) { + return (*this)(key_value.first, key_value.second); + } + template + JsonObjectScope &operator()(S &&key, T &&value) { CHECK(is_active()); if (is_first_) { *sb_ << ","; } else { is_first_ = true; } - jb_->enter_value() << key_value.first; + jb_->enter_value() << key; *sb_ << ":"; - jb_->enter_value() << key_value.second; + jb_->enter_value() << key; return *this; } JsonObjectScope &operator<<(const JsonRaw &key_value) { @@ -763,6 +767,24 @@ void to_json(JsonValueScope &jv, const T &value) { jv << value; } +template +class JsonObjectImpl : Jsonable { + public: + JsonObjectImpl(F &&f) : f_(std::forward(f)) { + } + void store(JsonValueScope *scope) const { + auto object = scope->enter_object(); + f_(object); + } + + private: + F f_; +}; +template +auto json_object(F &&f) { + return JsonObjectImpl(std::forward(f)); +} + bool has_json_object_field(JsonObject &object, Slice name); Result get_json_object_field(JsonObject &object, Slice name, JsonValue::Type type,