diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/json/flex_buffers | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/json/flex_buffers')
-rw-r--r-- | library/cpp/json/flex_buffers/cvt.cpp | 139 | ||||
-rw-r--r-- | library/cpp/json/flex_buffers/cvt.h | 20 | ||||
-rw-r--r-- | library/cpp/json/flex_buffers/ut/cvt_ut.cpp | 21 | ||||
-rw-r--r-- | library/cpp/json/flex_buffers/ut/ya.make | 9 | ||||
-rw-r--r-- | library/cpp/json/flex_buffers/ya.make | 16 |
5 files changed, 205 insertions, 0 deletions
diff --git a/library/cpp/json/flex_buffers/cvt.cpp b/library/cpp/json/flex_buffers/cvt.cpp new file mode 100644 index 0000000000..fee0cea0b8 --- /dev/null +++ b/library/cpp/json/flex_buffers/cvt.cpp @@ -0,0 +1,139 @@ +#include "cvt.h" + +#include <flatbuffers/flexbuffers.h> + +#include <library/cpp/json/fast_sax/parser.h> +#include <library/cpp/json/json_reader.h> + +#include <util/generic/vector.h> +#include <util/stream/output.h> +#include <util/stream/input.h> +#include <util/memory/pool.h> + +using namespace NJson; + +namespace { + struct TJsonToFlexCallbacks: public TJsonCallbacks { + inline TJsonToFlexCallbacks() + : P(8192) + { + } + + bool OnNull() override { + B.Null(); + + return true; + } + + bool OnBoolean(bool v) override { + B.Bool(v); + + return true; + } + + bool OnInteger(long long v) override { + B.Int(v); + + return true; + } + + bool OnUInteger(unsigned long long v) override { + B.UInt(v); + + return true; + } + + bool OnDouble(double v) override { + B.Double(v); + + return true; + } + + bool OnString(const TStringBuf& v) override { + B.String(v.data(), v.size()); + + return true; + } + + bool OnOpenMap() override { + S.push_back(B.StartMap()); + + return true; + } + + bool OnMapKey(const TStringBuf& v) override { + auto iv = P.AppendCString(v); + + B.Key(iv.data(), iv.size()); + + return true; + } + + bool OnCloseMap() override { + B.EndMap(PopOffset()); + + return true; + } + + bool OnOpenArray() override { + S.push_back(B.StartVector()); + + return true; + } + + bool OnCloseArray() override { + B.EndVector(PopOffset(), false, false); + + return true; + } + + bool OnStringNoCopy(const TStringBuf& s) override { + return OnString(s); + } + + bool OnMapKeyNoCopy(const TStringBuf& s) override { + return OnMapKey(s); + } + + bool OnEnd() override { + B.Finish(); + + Y_ENSURE(S.empty()); + + return true; + } + + void OnError(size_t, TStringBuf reason) override { + ythrow yexception() << reason; + } + + inline size_t PopOffset() { + auto res = S.back(); + + S.pop_back(); + + return res; + } + + inline auto& Buffer() { + return B.GetBuffer(); + } + + flexbuffers::Builder B; + TVector<size_t> S; + TMemoryPool P; + }; +} + +void NJson::ConvertJsonToFlexBuffers(TStringBuf input, TFlexBuffersData& result) { + TJsonToFlexCallbacks cb; + + ReadJsonFast(input, &cb); + result.swap(const_cast<std::vector<ui8>&>(cb.Buffer())); +} + +TString NJson::FlexToString(const TFlexBuffersData& v) { + auto root = flexbuffers::GetRoot(v.data(), v.size()); + + return TString(root.ToString()); +} diff --git a/library/cpp/json/flex_buffers/cvt.h b/library/cpp/json/flex_buffers/cvt.h new file mode 100644 index 0000000000..82d2874268 --- /dev/null +++ b/library/cpp/json/flex_buffers/cvt.h @@ -0,0 +1,20 @@ +#pragma once + +#include <util/generic/vector.h> +#include <util/generic/strbuf.h> +#include <util/generic/string.h> + +namespace NJson { + using TFlexBuffersData = TVector<ui8>; + + TString FlexToString(const TFlexBuffersData& v); + void ConvertJsonToFlexBuffers(TStringBuf input, TFlexBuffersData& result); + + inline TFlexBuffersData ConvertJsonToFlexBuffers(TStringBuf input) { + TFlexBuffersData result; + + ConvertJsonToFlexBuffers(input, result); + + return result; + } +} diff --git a/library/cpp/json/flex_buffers/ut/cvt_ut.cpp b/library/cpp/json/flex_buffers/ut/cvt_ut.cpp new file mode 100644 index 0000000000..9fffef4d38 --- /dev/null +++ b/library/cpp/json/flex_buffers/ut/cvt_ut.cpp @@ -0,0 +1,21 @@ +#include <library/cpp/testing/unittest/registar.h> +#include <library/cpp/json/flex_buffers/cvt.h> + +using namespace NJson; + +static auto JSON = R"({ + "a": { + "b": [1, 2, 3], + "c": ["x", "y", 3, "z"] + } +})"; + +static auto RES = R"({ a: { b: [ 1, 2, 3 ], c: [ "x", "y", 3, "z" ] } })"; + +Y_UNIT_TEST_SUITE(JsonToFlex) { + Y_UNIT_TEST(Test1) { + auto buf = ConvertJsonToFlexBuffers(JSON); + + UNIT_ASSERT_VALUES_EQUAL(FlexToString(buf), RES); + } +} diff --git a/library/cpp/json/flex_buffers/ut/ya.make b/library/cpp/json/flex_buffers/ut/ya.make new file mode 100644 index 0000000000..3fdc93f88e --- /dev/null +++ b/library/cpp/json/flex_buffers/ut/ya.make @@ -0,0 +1,9 @@ +UNITTEST_FOR(library/cpp/json/flex_buffers) + +OWNER(pg) + +SRCS( + cvt_ut.cpp +) + +END() diff --git a/library/cpp/json/flex_buffers/ya.make b/library/cpp/json/flex_buffers/ya.make new file mode 100644 index 0000000000..3ece5e3703 --- /dev/null +++ b/library/cpp/json/flex_buffers/ya.make @@ -0,0 +1,16 @@ +LIBRARY() + +OWNER(pg) + +ADDINCL(contrib/libs/flatbuffers/include) + +PEERDIR( + library/cpp/json + contrib/libs/flatbuffers +) + +SRCS( + cvt.cpp +) + +END() |