1#include <nlohmann/json.hpp>
2#include <string>
3
4#include "mtx/events/join_rules.hpp"
5
6using json = nlohmann::json;
7
8namespace mtx {
9namespace events {
10namespace state {
11
12std::string
13joinRuleToString(const JoinRule &rule)
14{
15 switch (rule) {
16 case JoinRule::Public:
17 return "public";
18 case JoinRule::Invite:
19 return "invite";
20 case JoinRule::Knock:
21 return "knock";
22 case JoinRule::Private:
23 return "private";
24 case JoinRule::Restricted:
25 return "restricted";
26 case JoinRule::KnockRestricted:
27 return "knock_restricted";
28 }
29
30 return "";
31}
32
33JoinRule
34stringToJoinRule(const std::string &rule)
35{
36 if (rule == "public")
37 return JoinRule::Public;
38 else if (rule == "invite")
39 return JoinRule::Invite;
40 else if (rule == "knock")
41 return JoinRule::Knock;
42 else if (rule == "restricted")
43 return JoinRule::Restricted;
44 else if (rule == "knock_restricted")
45 return JoinRule::KnockRestricted;
46
47 return JoinRule::Private;
48}
49
50void
51from_json(const json &obj, JoinAllowance &allowance)
52{
53 if (obj.value(key: "type", default_value: "") == "m.room_membership")
54 allowance.type = JoinAllowanceType::RoomMembership;
55 else
56 allowance.type = JoinAllowanceType::Unknown;
57
58 allowance.room_id = obj.value(key: "room_id", default_value: "");
59}
60
61void
62to_json(json &obj, const JoinAllowance &allowance)
63{
64 obj = nlohmann::json::object();
65 if (allowance.type == JoinAllowanceType::RoomMembership) {
66 obj["type"] = "m.room_membership";
67 obj["room_id"] = allowance.room_id;
68 }
69}
70
71void
72from_json(const json &obj, JoinRules &join_rules)
73{
74 join_rules.join_rule = stringToJoinRule(rule: obj.value(key: "join_rule", default_value: ""));
75
76 if (obj.contains(key: "allow"))
77 join_rules.allow = obj.at(key: "allow").get<decltype(join_rules.allow)>();
78}
79
80void
81to_json(json &obj, const JoinRules &join_rules)
82{
83 obj["join_rule"] = joinRuleToString(rule: join_rules.join_rule);
84
85 if (!join_rules.allow.empty())
86 obj["allow"] = join_rules.allow;
87}
88
89} // namespace state
90} // namespace events
91} // namespace mtx
92