matrix_sdk/event_handler/
context.rs1use std::ops::Deref;
17
18use matrix_sdk_base::deserialized_responses::EncryptionInfo;
19use matrix_sdk_common::{SendOutsideWasm, SyncOutsideWasm};
20use ruma::push::Action;
21use serde_json::value::RawValue as RawJsonValue;
22
23use super::{EventHandlerData, EventHandlerHandle};
24use crate::{Client, Room};
25
26pub trait EventHandlerContext: Sized {
31 #[doc(hidden)]
32 fn from_data(_: &EventHandlerData<'_>) -> Option<Self>;
33}
34
35impl EventHandlerContext for Client {
36 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
37 Some(data.client.clone())
38 }
39}
40
41impl EventHandlerContext for EventHandlerHandle {
42 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
43 Some(data.handle.clone())
44 }
45}
46
47impl EventHandlerContext for Room {
54 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
55 data.room.clone()
56 }
57}
58
59#[derive(Clone, Debug)]
64pub struct RawEvent(pub Box<RawJsonValue>);
65
66impl Deref for RawEvent {
67 type Target = RawJsonValue;
68
69 fn deref(&self) -> &Self::Target {
70 &self.0
71 }
72}
73
74impl EventHandlerContext for RawEvent {
75 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
76 Some(Self(data.raw.to_owned()))
77 }
78}
79
80impl EventHandlerContext for Option<EncryptionInfo> {
81 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
82 Some(data.encryption_info.cloned())
83 }
84}
85
86impl EventHandlerContext for Vec<Action> {
87 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
88 Some(data.push_actions.to_owned())
89 }
90}
91
92#[derive(Debug)]
95pub struct Ctx<T>(pub T);
96
97impl<T: Clone + SendOutsideWasm + SyncOutsideWasm + 'static> EventHandlerContext for Ctx<T> {
98 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
99 let map = data.client.inner.event_handlers.context.read().unwrap();
100 map.get::<T>().cloned().map(Ctx)
101 }
102}
103
104impl<T> Deref for Ctx<T> {
105 type Target = T;
106
107 fn deref(&self) -> &Self::Target {
108 &self.0
109 }
110}
111
112impl EventHandlerContext for () {
115 fn from_data(_data: &EventHandlerData<'_>) -> Option<Self> {
116 Some(())
117 }
118}
119
120macro_rules! impl_context_for_tuple {
121 ( $( $ty:ident ),* $(,)? ) => {
122 #[allow(non_snake_case)]
123 impl< $( $ty ),* > EventHandlerContext for ( $( $ty ),* , )
124 where
125 $( $ty : EventHandlerContext, )*
126 {
127 fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
128 $(
129 let $ty = $ty ::from_data(data)?;
130 )*
131
132 Some(( $( $ty ),* , ))
133 }
134 }
135 };
136}
137
138impl_context_for_tuple!(A);
139impl_context_for_tuple!(A, B);
140impl_context_for_tuple!(A, B, C);
141impl_context_for_tuple!(A, B, C, D);
142impl_context_for_tuple!(A, B, C, D, E);
143impl_context_for_tuple!(A, B, C, D, E, F);
144impl_context_for_tuple!(A, B, C, D, E, F, G);
145impl_context_for_tuple!(A, B, C, D, E, F, G, H);