From 8e2422a0022f5bd8e7d1fe8d1ca7b259451869ea Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 2 Mar 2022 16:27:48 +0200 Subject: Add ability to serialize pre-serialized JSON value --- libbutl/json/serializer.cxx | 2 ++ libbutl/json/serializer.hxx | 12 ++++++++++++ libbutl/json/serializer.ixx | 15 +++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/libbutl/json/serializer.cxx b/libbutl/json/serializer.cxx index 84941ed..0e8b566 100644 --- a/libbutl/json/serializer.cxx +++ b/libbutl/json/serializer.cxx @@ -283,6 +283,8 @@ namespace butl // Fall through. case event::number: { + // Note: this event is also used by value_json_text(). + if (st != nullptr && name_expected (*st)) goto fail_unexpected_event; diff --git a/libbutl/json/serializer.hxx b/libbutl/json/serializer.hxx index fad91e2..b52bf65 100644 --- a/libbutl/json/serializer.hxx +++ b/libbutl/json/serializer.hxx @@ -235,6 +235,18 @@ namespace butl void value (std::nullptr_t); + // Serialize value as a pre-serialized JSON value. + // + // Note that the value is expected to be a valid (and suitable) UTF-8- + // encoded JSON text. Note also that if pretty-printing is enabled, + // the resulting output may not be correctly indented. + // + void + value_json_text (const char*); + + void + value_json_text (const std::string&); + // Serialize next JSON event. // // If check is false, then don't check whether the value is valid UTF-8 diff --git a/libbutl/json/serializer.ixx b/libbutl/json/serializer.ixx index 5b2c173..50fe397 100644 --- a/libbutl/json/serializer.ixx +++ b/libbutl/json/serializer.ixx @@ -151,6 +151,21 @@ namespace butl next (event::null); } + inline void buffer_serializer:: + value_json_text (const char* v) + { + // Use event::number (which doesn't involve any quoting) with a disabled + // check. + // + next (event::number, {v, strlen (v)}, false /* check */); + } + + inline void buffer_serializer:: + value_json_text (const std::string& v) + { + next (event::number, {v.c_str (), v.size ()}, false /* check */); + } + inline size_t buffer_serializer:: to_chars (char* b, size_t s, int v) { -- cgit v1.1