Skip to content

Commit 90eb880

Browse files
authored
feat: add LDValue_SerializeJSON C binding (#458)
This adds a new API to the `LDValue` interface for serializing to a JSON string. Example: ```c LDValue foo = LDValue_NewBool(true); char *json = LDValue_SerializeJSON(foo); // json is the string 'true' LDMemory_FreeString(json); LDValue_Free(foo); ``` It's easier to view this PR commit to commit. The first one was necessary in order to access the boost::json tag_invoke implementations in `common`, where `LDValue` is implemented. Luckily, I only needed to pull over the `value` headers and some utilities. One thing to note is that boost serializes numbers using scientific notation (e.g. `17` serializes to `1.7E1`). Kind of an odd choice, but it is to JSON spec. BEGIN_COMMIT_OVERRIDE refactor: move json_errors, primitives, and value from internal to common lib feat: add LDValue_SerializeJSON C binding END_COMMIT_OVERRIDE
1 parent cd6bbd0 commit 90eb880

File tree

39 files changed

+130
-43
lines changed

39 files changed

+130
-43
lines changed

contract-tests/client-contract-tests/src/client_entity.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include <launchdarkly/context_builder.hpp>
77
#include <launchdarkly/serialization/json_context.hpp>
88
#include <launchdarkly/serialization/json_evaluation_reason.hpp>
9-
#include <launchdarkly/serialization/json_primitives.hpp>
10-
#include <launchdarkly/serialization/json_value.hpp>
9+
#include <launchdarkly/detail/serialization/json_primitives.hpp>
10+
#include <launchdarkly/detail/serialization/json_value.hpp>
1111
#include <launchdarkly/value.hpp>
1212

1313
#include <chrono>

contract-tests/server-contract-tests/src/client_entity.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include <launchdarkly/context_builder.hpp>
77
#include <launchdarkly/serialization/json_context.hpp>
88
#include <launchdarkly/serialization/json_evaluation_reason.hpp>
9-
#include <launchdarkly/serialization/json_primitives.hpp>
10-
#include <launchdarkly/serialization/json_value.hpp>
9+
#include <launchdarkly/detail/serialization/json_primitives.hpp>
10+
#include <launchdarkly/detail/serialization/json_value.hpp>
1111
#include <launchdarkly/server_side/serialization/json_all_flags_state.hpp>
1212
#include <launchdarkly/value.hpp>
1313

libs/client-sdk/src/data_sources/data_source_event_handler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <launchdarkly/encoding/base_64.hpp>
44
#include <launchdarkly/serialization/json_evaluation_result.hpp>
55
#include <launchdarkly/serialization/json_item_descriptor.hpp>
6-
#include <launchdarkly/serialization/json_primitives.hpp>
6+
#include <launchdarkly/detail/serialization/json_primitives.hpp>
77
#include <launchdarkly/serialization/value_mapping.hpp>
88

99
#include <boost/core/ignore_unused.hpp>

libs/client-sdk/src/flag_manager/flag_persistence.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include <launchdarkly/serialization/json_evaluation_result.hpp>
77
#include <launchdarkly/serialization/json_item_descriptor.hpp>
8-
#include <launchdarkly/serialization/json_primitives.hpp>
8+
#include <launchdarkly/detail/serialization/json_primitives.hpp>
99

1010
#include <utility>
1111

libs/common/include/launchdarkly/bindings/c/value.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,21 @@ LDValue_GetString(LDValue val);
191191
LD_EXPORT(unsigned int)
192192
LDValue_Count(LDValue val);
193193

194+
/**
195+
* Serializes the LDValue to a JSON value. The returning string should be
196+
* freed with @ref LDMemory_FreeString.
197+
*
198+
* Please note that numbers are serialized using scientific notation;
199+
* for example the number 17 would be serialized as '1.7E1'.
200+
*
201+
* @param val Target LDValue. Must not be NULL.
202+
* @return A string containing the JSON representation of the LDValue. The
203+
* string should be freed with @ref LDMemory_FreeString.
204+
*
205+
*/
206+
LD_EXPORT(char*)
207+
LDValue_SerializeJSON(LDValue val);
208+
194209
/**
195210
* Obtain iterator over an array-type @ref LDValue, otherwise NULL.
196211
*

libs/internal/include/launchdarkly/serialization/json_primitives.hpp renamed to libs/common/include/launchdarkly/detail/serialization/json_primitives.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include <launchdarkly/serialization/json_errors.hpp>
3+
#include <launchdarkly/detail/serialization/json_errors.hpp>
44
#include <tl/expected.hpp>
55

66
#include <boost/core/ignore_unused.hpp>

libs/internal/include/launchdarkly/serialization/json_value.hpp renamed to libs/common/include/launchdarkly/detail/serialization/json_value.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include <launchdarkly/serialization/json_errors.hpp>
3+
#include <launchdarkly/detail/serialization/json_errors.hpp>
44
#include <launchdarkly/value.hpp>
55

66
#include <boost/json/fwd.hpp>

libs/common/src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ file(GLOB HEADER_LIST CONFIGURE_DEPENDS
1414
"${LaunchDarklyCommonSdk_SOURCE_DIR}/include/launchdarkly/data/*.hpp"
1515
"${LaunchDarklyCommonSdk_SOURCE_DIR}/include/launchdarkly/logging/*.hpp"
1616
"${LaunchDarklyCommonSdk_SOURCE_DIR}/include/launchdarkly/data_sources/*.hpp"
17+
"${LaunchDarklyCommonSdk_SOURCE_DIR}/include/launchdarkly/data_sources/persistence/*.hpp"
1718
)
1819

1920
# Automatic library: static or dynamic based on user config.
@@ -53,6 +54,8 @@ add_library(${LIBNAME} OBJECT
5354
bindings/c/memory_routines.cpp
5455
bindings/c/data_source/error_info.cpp
5556
bindings/c/logging/log_level.cpp
57+
serialization/json_errors.cpp
58+
serialization/json_value.cpp
5659
log_level.cpp
5760
config/persistence_builder.cpp
5861
config/logging_builder.cpp

libs/common/src/bindings/c/value.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
#include <launchdarkly/detail/unreachable.hpp>
88
#include <launchdarkly/value.hpp>
99

10+
#include <launchdarkly/detail/serialization/json_value.hpp>
11+
12+
#include <boost/json.hpp>
13+
1014
using launchdarkly::Value;
1115

1216
#define AS_VALUE(x) reinterpret_cast<Value*>(x)
@@ -95,6 +99,18 @@ LD_EXPORT(unsigned int) LDValue_Count(LDValue val) {
9599
}
96100
}
97101

102+
LD_EXPORT(char*) LDValue_SerializeJSON(LDValue val) {
103+
LD_ASSERT_NOT_NULL(val);
104+
105+
auto const value = AS_VALUE(val);
106+
107+
auto boost_value = boost::json::value_from(*value);
108+
109+
std::string json = boost::json::serialize(boost_value);
110+
111+
return strdup(json.c_str());
112+
}
113+
98114
LD_EXPORT(LDValue_ArrayIter) LDValue_ArrayIter_New(LDValue val) {
99115
LD_ASSERT_NOT_NULL(val);
100116

0 commit comments

Comments
 (0)