1#include "mtx/events/spaces.hpp"
2
3#include <string>
4
5#include <nlohmann/json.hpp>
6
7namespace mtx {
8namespace events {
9namespace state {
10namespace space {
11
12void
13from_json(const nlohmann::json &obj, Parent &parent)
14{
15 if (obj.contains(key: "canonical") && obj.at(key: "canonical").is_boolean())
16 parent.canonical = obj.at(key: "canonical").get<bool>();
17 if (obj.contains(key: "via") && obj.at(key: "via").is_array() && !obj.at(key: "via").empty())
18 parent.via = obj.at(key: "via").get<std::vector<std::string>>();
19}
20
21void
22to_json(nlohmann::json &obj, const Parent &parent)
23{
24 obj = nlohmann::json::object();
25
26 // event without via is invalid.
27 if (!parent.via.has_value() || parent.via.value().empty())
28 return;
29
30 obj["via"] = parent.via.value();
31
32 if (parent.canonical)
33 obj["canonical"] = true;
34}
35
36static bool
37is_valid_order_str(std::string_view order)
38{
39 if (order.size() > 50)
40 return false;
41
42 for (auto c : order)
43 if (c < '\x20' || c > '\x7E')
44 return false;
45
46 return true;
47}
48
49void
50from_json(const nlohmann::json &obj, Child &child)
51{
52 if (obj.contains(key: "via") && obj.at(key: "via").is_array() && !obj.at(key: "via").empty())
53 child.via = obj.at(key: "via").get<std::vector<std::string>>();
54
55 if (obj.contains(key: "order") && obj.at(key: "order").is_string() &&
56 is_valid_order_str(order: obj.at(key: "order").get<std::string>()))
57 child.order = obj.at(key: "order").get<std::string>();
58
59 child.suggested = obj.value(key: "suggested", default_value: false);
60}
61
62void
63to_json(nlohmann::json &obj, const Child &child)
64{
65 obj = nlohmann::json::object();
66
67 // event without via is invalid.
68 if (!child.via.has_value() || child.via.value().empty())
69 return;
70
71 obj["via"] = child.via.value();
72
73 if (child.order && is_valid_order_str(order: child.order.value()))
74 obj["order"] = child.order.value();
75
76 if (child.suggested)
77 obj["suggested"] = true;
78}
79}
80} // namespace state
81} // namespace events
82} // namespace mtx
83