Skip to content

Commit 26eaca4

Browse files
authored
Merge pull request #745 from evoskuil/master
Make json_t embeddable in value_t (copied).
2 parents b59ec6e + 3f2bf8a commit 26eaca4

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

include/bitcoin/network/channels/channel_rpc.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,37 @@
2828

2929
namespace libbitcoin {
3030
namespace network {
31+
32+
// TODO: Interface argument provides templated dispatch for rpc protocols.
33+
// TODO: transport independent sender methods in each are duck typed for rpc protocol.
34+
// TODO: network::channel_trpc<Interface> : network::channel
35+
// TODO: network::channel_wrpc<Interface> : network::channel_ws
36+
// : network::channel_http
37+
// : network::channel
38+
//
39+
// TODO: reused channel state unique to electrum/bitcoind.
40+
// TODO: server::channel_electrum_base
41+
// TODO: server::channel_bitcoind_base
42+
//
43+
// TODO: aliases.
44+
// TODO: server::channel_electrum_tcp : channel_electrum_base, network::channel_trpc<electrum>
45+
// TODO: server::channel_electrum_web : channel_electrum_base, network::channel_wrpc<electrum>
46+
// TODO: server::channel_bitcoind_tcp : channel_bitcoind_base, network::channel_trpc<bitcoind>
47+
// TODO: server::channel_bitcoind_web : channel_bitcoind_base, network::channel_wrpc<bitcoind>
48+
//
49+
// TODO: base sender methods for passthrough to channel senders.
50+
// TODO: these could be implemented in the two protocols to reduce compile time.
51+
// TODO: network::protocol_rpc<Channel> : network::protocol
52+
//
53+
// TODO: reused protocol logic unique to electrum/bitcoind.
54+
// TODO: server::protocol_electrum<Channel> : network::protocol_rpc<Channel>
55+
// TODO: server::protocol_bitcoind<Channel> : network::protocol_rpc<Channel>
56+
//
57+
// TODO: aliases.
58+
// TODO: server::protocol_electrum_tcp : network::protocol_electrum<channel_electrum_tcp>
59+
// TODO: server::protocol_electrum_web : network::protocol_electrum<channel_electrum_web>
60+
// TODO: server::protocol_bitcoind_tcp : network::protocol_bitcoind<channel_bitcoind_tcp>
61+
// TODO: server::protocol_bitcoind_web : network::protocol_bitcoind<channel_bitcoind_web>
3162

3263
/// Read rpc-request and send rpc-response, dispatch to Interface.
3364
template <typename Interface>

include/bitcoin/network/messages/rpc/model.hpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ using string_t = std::string;
4646
using array_t = std::vector<value_t>;
4747
using object_t = std::unordered_map<string_t, value_t>;
4848
using any_t = rpc::any;
49+
using json_t = boost::json::value;
4950

5051
struct value_t
5152
{
53+
/// 88 bytes (object_t).
5254
using inner_t = std::variant
5355
<
5456
/// json-rpc
@@ -72,7 +74,10 @@ struct value_t
7274

7375
/// type-erased shared_ptr<Type>, not json deserializable.
7476
/// Pass ptr via any_t and specify it directly in the handler.
75-
any_t
77+
any_t,
78+
79+
/// Embeds json DOM.
80+
json_t
7681
>;
7782

7883
/// Explicit initialization constructors.
@@ -94,6 +99,8 @@ struct value_t
9499
value_t(uint16_t value) NOEXCEPT : inner_{ value } {}
95100
value_t(uint32_t value) NOEXCEPT : inner_{ value } {}
96101
value_t(uint64_t value) NOEXCEPT : inner_{ value } {}
102+
value_t(const json_t& value) NOEXCEPT : inner_{ value } {}
103+
value_t(json_t&& value) NOEXCEPT : inner_{ std::move(value) } {}
97104
value_t(const any_t& value) NOEXCEPT : inner_{ value } {}
98105
value_t(any_t&& value) NOEXCEPT : inner_{ std::move(value) } {}
99106

@@ -113,6 +120,7 @@ struct value_t
113120
ALTERNATIVE_VARIANT_ASSIGNMENT(value_t, uint16_t, inner_)
114121
ALTERNATIVE_VARIANT_ASSIGNMENT(value_t, uint32_t, inner_)
115122
ALTERNATIVE_VARIANT_ASSIGNMENT(value_t, uint64_t, inner_)
123+
ALTERNATIVE_VARIANT_ASSIGNMENT(value_t, json_t, inner_)
116124
ALTERNATIVE_VARIANT_ASSIGNMENT(value_t, any_t, inner_)
117125

118126
inner_t& value() NOEXCEPT

src/messages/rpc/model.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ DEFINE_JSON_FROM_TAG(value_t)
112112
{
113113
value = visit;
114114
},
115+
[&](const json_t& visit) NOEXCEPT
116+
{
117+
// This is a deep copy.
118+
value = visit;
119+
},
115120
[&](const array_t& visit) THROWS
116121
{
117122
value.emplace_array();
@@ -173,7 +178,7 @@ DEFINE_JSON_FROM_TAG(identity_t)
173178
{
174179
[&](null_t) NOEXCEPT
175180
{
176-
value = boost::json::value{};
181+
value = json_t{};
177182
},
178183
[&](code_t visit) NOEXCEPT
179184
{
@@ -332,7 +337,7 @@ DEFINE_JSON_FROM_TAG(response_t)
332337
else if (instance.jsonrpc == version::v1 ||
333338
instance.jsonrpc == version::undefined)
334339
{
335-
object["error"] = boost::json::value{};
340+
object["error"] = json_t{};
336341
}
337342

338343
if (instance.result.has_value())
@@ -342,7 +347,7 @@ DEFINE_JSON_FROM_TAG(response_t)
342347
else if (instance.jsonrpc == version::v1 ||
343348
instance.jsonrpc == version::undefined)
344349
{
345-
object["result"] = boost::json::value{};
350+
object["result"] = json_t{};
346351
}
347352

348353
value = object;

0 commit comments

Comments
 (0)