Skip to content

Commit 1dbd6aa

Browse files
committed
room edit: don't use async_trait for EventSource either
1 parent 345ca27 commit 1dbd6aa

File tree

1 file changed

+39
-25
lines changed

1 file changed

+39
-25
lines changed

crates/matrix-sdk/src/room/edit.rs

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
//! Facilities to edit existing events.
1616
17+
use std::future::Future;
18+
1719
use matrix_sdk_base::deserialized_responses::SyncTimelineEvent;
1820
use ruma::{
1921
events::{
@@ -88,34 +90,42 @@ impl Room {
8890
}
8991
}
9092

91-
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
92-
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
9393
trait EventSource {
94-
async fn get_event(&self, event_id: &EventId) -> Result<SyncTimelineEvent, EditError>;
94+
fn get_event(
95+
&self,
96+
event_id: &EventId,
97+
) -> impl Future<Output = Result<SyncTimelineEvent, EditError>>;
9598
}
9699

97-
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
98-
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
99100
impl<'a> EventSource for &'a Room {
100-
async fn get_event(&self, event_id: &EventId) -> Result<SyncTimelineEvent, EditError> {
101-
match self.event_cache().await {
102-
Ok((event_cache, _drop_handles)) => {
103-
if let Some(event) = event_cache.event(event_id).await {
104-
return Ok(event);
101+
// This is written as a function returning a Future to avoid a performance
102+
// pitfall of rustc when using async_trait. See https://github.com/matrix-org/matrix-rust-sdk/pull/3880 for
103+
// details.
104+
#[allow(clippy::manual_async_fn)]
105+
fn get_event(
106+
&self,
107+
event_id: &EventId,
108+
) -> impl Future<Output = Result<SyncTimelineEvent, EditError>> {
109+
async {
110+
match self.event_cache().await {
111+
Ok((event_cache, _drop_handles)) => {
112+
if let Some(event) = event_cache.event(event_id).await {
113+
return Ok(event);
114+
}
115+
// Fallthrough: try with /event.
105116
}
106-
// Fallthrough: try with /event.
107-
}
108117

109-
Err(err) => {
110-
debug!("error when getting the event cache: {err}");
118+
Err(err) => {
119+
debug!("error when getting the event cache: {err}");
120+
}
111121
}
112-
}
113122

114-
trace!("trying with /event now");
115-
self.event(event_id, None)
116-
.await
117-
.map(Into::into)
118-
.map_err(|err| EditError::Fetch(Box::new(err)))
123+
trace!("trying with /event now");
124+
self.event(event_id, None)
125+
.await
126+
.map(Into::into)
127+
.map_err(|err| EditError::Fetch(Box::new(err)))
128+
}
119129
}
120130
}
121131

@@ -200,7 +210,10 @@ async fn make_edit_event<S: EventSource>(
200210

201211
#[cfg(test)]
202212
mod tests {
203-
use std::collections::BTreeMap;
213+
use std::{
214+
collections::BTreeMap,
215+
future::{ready, Future},
216+
};
204217

205218
use assert_matches2::{assert_let, assert_matches};
206219
use matrix_sdk_base::deserialized_responses::SyncTimelineEvent;
@@ -225,11 +238,12 @@ mod tests {
225238
events: BTreeMap<OwnedEventId, SyncTimelineEvent>,
226239
}
227240

228-
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
229-
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
230241
impl EventSource for TestEventCache {
231-
async fn get_event(&self, event_id: &EventId) -> Result<SyncTimelineEvent, EditError> {
232-
Ok(self.events.get(event_id).unwrap().clone())
242+
fn get_event(
243+
&self,
244+
event_id: &EventId,
245+
) -> impl Future<Output = Result<SyncTimelineEvent, EditError>> {
246+
ready(Ok(self.events.get(event_id).unwrap().clone()))
233247
}
234248
}
235249

0 commit comments

Comments
 (0)