tuwunel_service/rooms/state_res/
fetch_state.rs1use 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}