matrix_sdk_ui/spaces/
room.rs1use matrix_sdk::{Room, RoomHero, RoomState};
16use ruma::{
17 OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId,
18 events::room::{guest_access::GuestAccess, history_visibility::HistoryVisibility},
19 room::{JoinRuleSummary, RoomSummary, RoomType},
20};
21
22#[derive(Debug, Clone, PartialEq)]
25pub struct SpaceRoom {
26 pub room_id: OwnedRoomId,
28 pub canonical_alias: Option<OwnedRoomAliasId>,
30 pub name: Option<String>,
32 pub topic: Option<String>,
34 pub avatar_url: Option<OwnedMxcUri>,
36 pub room_type: Option<RoomType>,
38 pub num_joined_members: u64,
40 pub join_rule: Option<JoinRuleSummary>,
42 pub world_readable: Option<bool>,
44 pub guest_can_join: bool,
46
47 pub children_count: u64,
49 pub state: Option<RoomState>,
51 pub heroes: Option<Vec<RoomHero>>,
53}
54
55impl SpaceRoom {
56 pub(crate) fn new_from_summary(
59 summary: &RoomSummary,
60 known_room: Option<Room>,
61 children_count: u64,
62 ) -> Self {
63 Self {
64 room_id: summary.room_id.clone(),
65 canonical_alias: summary.canonical_alias.clone(),
66 name: summary.name.clone(),
67 topic: summary.topic.clone(),
68 avatar_url: summary.avatar_url.clone(),
69 room_type: summary.room_type.clone(),
70 num_joined_members: summary.num_joined_members.into(),
71 join_rule: Some(summary.join_rule.clone()),
72 world_readable: Some(summary.world_readable),
73 guest_can_join: summary.guest_can_join,
74 children_count,
75 state: known_room.as_ref().map(|r| r.state()),
76 heroes: known_room.map(|r| r.heroes()),
77 }
78 }
79
80 pub(crate) fn new_from_known(known_room: Room, children_count: u64) -> Self {
82 let room_info = known_room.clone_info();
83
84 Self {
85 room_id: room_info.room_id().to_owned(),
86 canonical_alias: room_info.canonical_alias().map(ToOwned::to_owned),
87 name: room_info.name().map(ToOwned::to_owned),
88 topic: room_info.topic().map(ToOwned::to_owned),
89 avatar_url: room_info.avatar_url().map(ToOwned::to_owned),
90 room_type: room_info.room_type().cloned(),
91 num_joined_members: known_room.joined_members_count(),
92 join_rule: room_info.join_rule().cloned().map(Into::into),
93 world_readable: room_info
94 .history_visibility()
95 .map(|vis| *vis == HistoryVisibility::WorldReadable),
96 guest_can_join: known_room.guest_access() == GuestAccess::CanJoin,
97 children_count,
98 state: Some(known_room.state()),
99 heroes: Some(room_info.heroes().to_vec()),
100 }
101 }
102}