ruma_events/
member_hints.rs1use std::collections::BTreeSet;
8
9use ruma_common::OwnedUserId;
10use ruma_macros::EventContent;
11use serde::{Deserialize, Serialize};
12
13use crate::EmptyStateKey;
14
15#[derive(Clone, Debug, Default, Serialize, Deserialize, EventContent, PartialEq)]
20#[ruma_event(type = "io.element.functional_members", kind = State, state_key_type = EmptyStateKey)]
21#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
22pub struct MemberHintsEventContent {
23 pub service_members: BTreeSet<OwnedUserId>,
25}
26
27impl MemberHintsEventContent {
28 pub fn new(service_members: BTreeSet<OwnedUserId>) -> Self {
30 Self { service_members }
31 }
32}
33
34#[cfg(test)]
35mod test {
36 use std::collections::BTreeSet;
37
38 use ruma_common::user_id;
39 use serde_json::{from_value as from_json_value, json};
40 use strass::assert_let;
41
42 use super::*;
43 use crate::{AnyStateEvent, StateEvent};
44
45 #[test]
46 fn deserialize() {
47 let user_id = user_id!("@slackbot:matrix.org");
48
49 let data = json!({
50 "type": "io.element.functional_members",
51 "state_key": "",
52 "content": {
53 "service_members": [
54 user_id,
55 ]
56 },
57 "origin_server_ts": 111,
58 "event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
59 "room_id": "!1234:example.org",
60 "sender": "@user:example.org"
61 });
62
63 let event = from_json_value::<AnyStateEvent>(data)
64 .expect("We should be able to deserialize the member hints event");
65
66 assert_let!(AnyStateEvent::MemberHints(StateEvent::Original(event)) = event);
67
68 assert!(event.content.service_members.contains(user_id));
69
70 let data = json!({
71 "type": "m.member_hints",
72 "state_key": "",
73 "content": {
74 "service_members": [
75 user_id,
76 ]
77 },
78 "origin_server_ts": 111,
79 "event_id": "$3qfxjGYSu4sL25FtR0ep6vePOc",
80 "room_id": "!1234:example.org",
81 "sender": "@user:example.org"
82 });
83
84 let event = from_json_value::<AnyStateEvent>(data)
85 .expect("We should be able to deserialize the member hints event");
86
87 assert_let!(AnyStateEvent::MemberHints(StateEvent::Original(event)) = event);
88
89 assert!(event.content.service_members.contains(user_id));
90 }
91
92 #[test]
93 fn serialize() {
94 let user_id = user_id!("@slackbot:matrix.org");
95 let content = MemberHintsEventContent::new(BTreeSet::from([user_id.to_owned()]));
96
97 let serialized = serde_json::to_value(content)
98 .expect("We should be able to serialize the member hints content");
99
100 let expected = json!({
101 "service_members": [
102 user_id,
103 ]
104 });
105
106 assert_eq!(
107 expected, serialized,
108 "The serialized member hints content should match the expected one"
109 );
110 }
111}