Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
JSONRPC.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5namespace Stroika::Frameworks::WebService::JSONRPC {
6
7 /*
8 ********************************************************************************
9 ****************************** JSONRPC::Request ********************************
10 ********************************************************************************
11 */
12 inline const Foundation::DataExchange::ObjectVariantMapper Request::kMapper = [] () {
13 using namespace Foundation::DataExchange;
14 ObjectVariantMapper m;
15 using SEQ_OR_MAP_ = variant<Mapping<String, VariantValue>, Sequence<VariantValue>>;
16 m.Add<SEQ_OR_MAP_> (
17 [] ([[maybe_unused]] const ObjectVariantMapper& mapper, const SEQ_OR_MAP_* obj) -> VariantValue {
18 if (auto om = get_if<Mapping<String, VariantValue>> (obj)) {
19 return VariantValue{*om};
20 }
21 else if (auto os = get_if<Sequence<VariantValue>> (obj)) {
22 return VariantValue{*os};
23 }
24 else {
26 return VariantValue{};
27 }
28 },
29 [] ([[maybe_unused]] const ObjectVariantMapper& mapper, const VariantValue& d, SEQ_OR_MAP_* intoObj) -> void {
30 if (d.GetType () == VariantValue::eMap) {
31 *intoObj = d.As<Mapping<String, VariantValue>> ();
32 }
33 else if (d.GetType () == VariantValue::eArray) {
34 *intoObj = d.As<Sequence<VariantValue>> ();
35 }
36 else {
37 // not sure here - maybe throw - or just let this do the throwing
38 *intoObj = d.As<Sequence<VariantValue>> ();
39 }
40 });
41 m.AddCommonType<optional<SEQ_OR_MAP_>> ();
42 m.AddClass<Request> ({
43 {"jsonrpc"sv, &Request::jsonrpc},
44 {"params"sv, &Request::params},
45 {"id"sv, &Request::id},
46 });
47 return m;
48 }();
49
50 /*
51 ********************************************************************************
52 ****************************** JSONRPC::Error **********************************
53 ********************************************************************************
54 */
55 inline const Foundation::DataExchange::ObjectVariantMapper Error::kMapper = [] () {
56 using namespace Foundation::DataExchange;
57 ObjectVariantMapper m;
58 m.AddClass<Request> ({
59 {"code"sv, &Error::code},
60 {"message"sv, &Error::message},
61 {"data"sv, &Error::data},
62 });
63 return m;
64 }();
65
66 /*
67 ********************************************************************************
68 ***************************** JSONRPC::Response ********************************
69 ********************************************************************************
70 */
71 inline const Foundation::DataExchange::ObjectVariantMapper Response::kMapper = [] () {
72 using namespace Foundation::DataExchange;
73 ObjectVariantMapper m;
74 m += Error::kMapper;
75 m.AddCommonType<optional<Error>> ();
76 // todo - could 'subclass' this to assure exactly one of result or error but not both, or maybe redo as
77 // variant object so can be one thing or other?
78 m.AddClass<Response> ({
79 {"jsonrpc"sv, &Response::jsonrpc},
80 {"result"sv, &Response::result},
81 {"error"sv, &Response::error},
82 {"id"sv, &Response::id},
83 });
84 return m;
85 }();
86
87}
#define RequireNotReached()
Definition Assertions.h:385
optional< variant< Mapping< String, VariantValue >, Sequence< VariantValue > > > params
Definition JSONRPC.h:46