Skip to main content

tuwunel_service/rooms/state_res/
fetch_state.rs

1use ruma::{
2	UserId,
3	events::{StateEventType, room::member::MembershipState},
4};
5use tuwunel_core::{
6	Result, err,
7	matrix::{Event, StateKey},
8};
9
10use super::events::{
11	JoinRule, RoomCreateEvent, RoomJoinRulesEvent, RoomMemberEvent, RoomPowerLevelsEvent,
12	RoomThirdPartyInviteEvent, member::RoomMemberEventResultExt,
13};
14
15pub(super) trait FetchStateExt<Pdu: Event> {
16	async fn room_create_event(&self) -> Result<RoomCreateEvent<Pdu>>;
17
18	async fn user_membership(&self, user_id: &UserId) -> Result<MembershipState>;
19
20	async fn room_power_levels_event(&self) -> Option<RoomPowerLevelsEvent<Pdu>>;
21
22	async fn join_rule(&self) -> Result<JoinRule>;
23
24	async fn room_third_party_invite_event(
25		&self,
26		token: &str,
27	) -> Option<RoomThirdPartyInviteEvent<Pdu>>;
28}
29
30impl<Fetch, Fut, Pdu> FetchStateExt<Pdu> for &Fetch
31where
32	Fetch: Fn(StateEventType, StateKey) -> Fut + Sync,
33	Fut: Future<Output = Result<Pdu>>,
34	Pdu: Event,
35{
36	async fn room_create_event(&self) -> Result<RoomCreateEvent<Pdu>> {
37		self(StateEventType::RoomCreate, "".into())
38			.await
39			.map(RoomCreateEvent::new)
40			.map_err(|e| err!("no `m.room.create` event in current state: {e}"))
41	}
42
43	async fn user_membership(&self, user_id: &UserId) -> Result<MembershipState> {
44		self(StateEventType::RoomMember, user_id.as_str().into())
45			.await
46			.map(RoomMemberEvent::new)
47			.membership()
48	}
49
50	async fn room_power_levels_event(&self) -> Option<RoomPowerLevelsEvent<Pdu>> {
51		self(StateEventType::RoomPowerLevels, "".into())
52			.await
53			.map(RoomPowerLevelsEvent::new)
54			.ok()
55	}
56
57	async fn join_rule(&self) -> Result<JoinRule> {
58		self(StateEventType::RoomJoinRules, "".into())
59			.await
60			.map(RoomJoinRulesEvent::new)
61			.map_err(|e| err!("no `m.room.join_rules` event in current state: {e}"))?
62			.join_rule()
63	}
64
65	async fn room_third_party_invite_event(
66		&self,
67		token: &str,
68	) -> Option<RoomThirdPartyInviteEvent<Pdu>> {
69		self(StateEventType::RoomThirdPartyInvite, token.into())
70			.await
71			.ok()
72			.map(RoomThirdPartyInviteEvent::new)
73	}
74}