ruma_client_api/membership/
joined_members.rs1pub mod v3 {
7 use std::collections::BTreeMap;
12
13 use ruma_common::{
14 OwnedMxcUri, OwnedRoomId, OwnedUserId,
15 api::{auth_scheme::AccessToken, request, response},
16 metadata,
17 };
18 use serde::{Deserialize, Serialize};
19
20 metadata! {
21 method: GET,
22 rate_limited: false,
23 authentication: AccessToken,
24 history: {
25 1.0 => "/_matrix/client/r0/rooms/{room_id}/joined_members",
26 1.1 => "/_matrix/client/v3/rooms/{room_id}/joined_members",
27 }
28 }
29
30 #[request(error = crate::Error)]
32 pub struct Request {
33 #[ruma_api(path)]
35 pub room_id: OwnedRoomId,
36 }
37
38 #[response(error = crate::Error)]
40 pub struct Response {
41 pub joined: BTreeMap<OwnedUserId, RoomMember>,
44 }
45
46 impl Request {
47 pub fn new(room_id: OwnedRoomId) -> Self {
49 Self { room_id }
50 }
51 }
52
53 impl Response {
54 pub fn new(joined: BTreeMap<OwnedUserId, RoomMember>) -> Self {
56 Self { joined }
57 }
58 }
59
60 #[derive(Clone, Debug, Default, Deserialize, Serialize)]
62 #[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
63 pub struct RoomMember {
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub display_name: Option<String>,
67
68 #[serde(skip_serializing_if = "Option::is_none")]
73 #[cfg_attr(
74 feature = "compat-empty-string-null",
75 serde(default, deserialize_with = "ruma_common::serde::empty_string_as_none")
76 )]
77 pub avatar_url: Option<OwnedMxcUri>,
78 }
79
80 impl RoomMember {
81 pub fn new() -> Self {
83 Default::default()
84 }
85 }
86
87 #[cfg(test)]
88 mod tests {
89 use ruma_common::mxc_uri;
90 use serde_json::{from_value as from_json_value, json};
91
92 use super::RoomMember;
93
94 #[test]
95 fn deserialize_room_member() {
96 let member = from_json_value::<RoomMember>(json!({
97 "display_name": "alice",
98 "avatar_url": "mxc://localhost/wefuiwegh8742w",
99 }))
100 .unwrap();
101 assert_eq!(member.display_name.as_deref(), Some("alice"));
102 assert_eq!(
103 member.avatar_url.as_deref(),
104 Some(mxc_uri!("mxc://localhost/wefuiwegh8742w"))
105 );
106
107 #[cfg(feature = "compat-empty-string-null")]
108 {
109 let member = from_json_value::<RoomMember>(json!({
110 "display_name": "alice",
111 "avatar_url": "",
112 }))
113 .unwrap();
114 assert_eq!(member.display_name.as_deref(), Some("alice"));
115 assert_eq!(member.avatar_url, None);
116 }
117 }
118 }
119}