ruma_client_api/membership/
joined_members.rs1pub mod v3 {
7 use std::collections::BTreeMap;
12
13 use ruma_common::{
14 api::{request, response, Metadata},
15 metadata, OwnedMxcUri, OwnedRoomId, OwnedUserId,
16 };
17 use serde::{Deserialize, Serialize};
18
19 const METADATA: Metadata = metadata! {
20 method: GET,
21 rate_limited: false,
22 authentication: AccessToken,
23 history: {
24 1.0 => "/_matrix/client/r0/rooms/:room_id/joined_members",
25 1.1 => "/_matrix/client/v3/rooms/:room_id/joined_members",
26 }
27 };
28
29 #[request(error = crate::Error)]
31 pub struct Request {
32 #[ruma_api(path)]
34 pub room_id: OwnedRoomId,
35 }
36
37 #[response(error = crate::Error)]
39 pub struct Response {
40 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 ruma_common::mxc_uri;
89 use serde_json::{from_value as from_json_value, json};
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_eq!(
102 member.avatar_url.as_deref(),
103 Some(mxc_uri!("mxc://localhost/wefuiwegh8742w"))
104 );
105
106 #[cfg(feature = "compat-empty-string-null")]
107 {
108 let member = from_json_value::<RoomMember>(json!({
109 "display_name": "alice",
110 "avatar_url": "",
111 }))
112 .unwrap();
113 assert_eq!(member.display_name.as_deref(), Some("alice"));
114 assert_eq!(member.avatar_url, None);
115 }
116 }
117 }
118}