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]
32 pub struct Request {
33 #[ruma_api(path)]
35 pub room_id: OwnedRoomId,
36 }
37
38 #[response]
40 pub struct Response {
41 pub joined: BTreeMap<OwnedUserId, RoomMember>,
43 }
44
45 impl Request {
46 pub fn new(room_id: OwnedRoomId) -> Self {
48 Self { room_id }
49 }
50 }
51
52 impl Response {
53 pub fn new(joined: BTreeMap<OwnedUserId, RoomMember>) -> Self {
55 Self { joined }
56 }
57 }
58
59 #[derive(Clone, Debug, Default, Deserialize, Serialize)]
61 #[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
62 pub struct RoomMember {
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub display_name: Option<String>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
72 #[cfg_attr(
73 feature = "compat-empty-string-null",
74 serde(default, deserialize_with = "ruma_common::serde::empty_string_as_none")
75 )]
76 pub avatar_url: Option<OwnedMxcUri>,
77 }
78
79 impl RoomMember {
80 pub fn new() -> Self {
82 Default::default()
83 }
84 }
85
86 #[cfg(test)]
87 mod tests {
88 use serde_json::{from_value as from_json_value, json};
89 use strass::assert_variant_eq;
90
91 use super::RoomMember;
92
93 #[test]
94 fn deserialize_room_member() {
95 let member = from_json_value::<RoomMember>(json!({
96 "display_name": "alice",
97 "avatar_url": "mxc://localhost/wefuiwegh8742w",
98 }))
99 .unwrap();
100 assert_eq!(member.display_name.as_deref(), Some("alice"));
101 assert_variant_eq!(member.avatar_url, Some("mxc://localhost/wefuiwegh8742w"));
102
103 #[cfg(feature = "compat-empty-string-null")]
104 {
105 let member = from_json_value::<RoomMember>(json!({
106 "display_name": "alice",
107 "avatar_url": "",
108 }))
109 .unwrap();
110 assert_eq!(member.display_name.as_deref(), Some("alice"));
111 assert_eq!(member.avatar_url, None);
112 }
113 }
114 }
115}