Skip to content

Commit 553995c

Browse files
committed
feat(sdk): Implement EventHandlerContext for tuples.
This patch implements `EventHandlerContext` for tuples where each part implements `EventHandlerContext` itself.
1 parent 36b96cc commit 553995c

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,39 @@ 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+
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+
138+
impl_context_for_tuple!(A);
139+
impl_context_for_tuple!(A, B);
140+
impl_context_for_tuple!(A, B, C);
141+
impl_context_for_tuple!(A, B, C, D);
142+
impl_context_for_tuple!(A, B, C, D, E);
143+
impl_context_for_tuple!(A, B, C, D, E, F);
144+
impl_context_for_tuple!(A, B, C, D, E, F, G);
145+
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)