Skip to content

Commit 12dfbb2

Browse files
committed
feat(sdk): Implement EventHandlerContext for tuples.
This patch implements `EventHandlerContext` for tuples where each part implements `EventHandlerContext` itself.
1 parent b546763 commit 12dfbb2

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

crates/matrix-sdk/src/event_handler/context.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,38 @@ impl<T> Deref for Ctx<T> {
107107
&self.0
108108
}
109109
}
110+
111+
// `EventHandlerContext` for tuples.
112+
113+
impl EventHandlerContext for () {
114+
fn from_data(_data: &EventHandlerData<'_>) -> Option<Self> {
115+
Some(())
116+
}
117+
}
118+
119+
macro_rules! impl_context_for_tuple {
120+
( $( $ty:ident ),* $(,)? ) => {
121+
#[allow(non_snake_case)]
122+
impl< $( $ty ),* > EventHandlerContext for ( $( $ty ),* , )
123+
where
124+
$( $ty : EventHandlerContext, )*
125+
{
126+
fn from_data(data: &EventHandlerData<'_>) -> Option<Self> {
127+
$(
128+
let $ty = $ty ::from_data(data)?;
129+
)*
130+
131+
Some(( $( $ty ),* , ))
132+
}
133+
}
134+
};
135+
}
136+
137+
impl_context_for_tuple!(A);
138+
impl_context_for_tuple!(A, B);
139+
impl_context_for_tuple!(A, B, C);
140+
impl_context_for_tuple!(A, B, C, D);
141+
impl_context_for_tuple!(A, B, C, D, E);
142+
impl_context_for_tuple!(A, B, C, D, E, F);
143+
impl_context_for_tuple!(A, B, C, D, E, F, G);
144+
impl_context_for_tuple!(A, B, C, D, E, F, G, H);

crates/matrix-sdk/src/event_handler/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,20 @@ mod tests {
753753
Ok(())
754754
}
755755

756+
#[async_test]
757+
#[allow(dependency_on_unit_never_type_fallback)]
758+
async fn test_add_event_handler_with_tuples() -> crate::Result<()> {
759+
let client = logged_in_client(None).await;
760+
761+
client.add_event_handler(
762+
|_ev: OriginalSyncRoomMemberEvent, (_room, _client): (Room, Client)| future::ready(()),
763+
);
764+
765+
// If it compiles, it works. No need to assert anything.
766+
767+
Ok(())
768+
}
769+
756770
#[async_test]
757771
#[allow(dependency_on_unit_never_type_fallback)]
758772
async fn test_remove_event_handler() -> crate::Result<()> {

0 commit comments

Comments
 (0)