diff --git a/bindings/matrix-sdk-ffi/src/timeline/mod.rs b/bindings/matrix-sdk-ffi/src/timeline/mod.rs index 3b1ace9d3d2..a1d77bff982 100644 --- a/bindings/matrix-sdk-ffi/src/timeline/mod.rs +++ b/bindings/matrix-sdk-ffi/src/timeline/mod.rs @@ -48,8 +48,8 @@ use ruma::{ }, receipt::ReceiptThread, room::message::{ - ForwardThread, LocationMessageEventContent, MessageType, - RoomMessageEventContentWithoutRelation, + FormattedBody as RumaFormattedBody, ForwardThread, LocationMessageEventContent, + MessageType, RoomMessageEventContentWithoutRelation, }, AnyMessageLikeEventContent, }, @@ -289,6 +289,7 @@ impl Timeline { progress_watcher: Option>, use_send_queue: bool, ) -> Arc { + let formatted_caption = formatted_caption_from(&caption, &formatted_caption); SendAttachmentJoinHandle::new(RUNTIME.spawn(async move { let base_image_info = BaseImageInfo::try_from(&image_info) .map_err(|_| RoomError::InvalidAttachmentData)?; @@ -297,7 +298,7 @@ impl Timeline { let attachment_config = build_thumbnail_info(thumbnail_url, image_info.thumbnail_info)? .info(attachment_info) .caption(caption) - .formatted_caption(formatted_caption.map(Into::into)); + .formatted_caption(formatted_caption); self.send_attachment( url, @@ -321,6 +322,7 @@ impl Timeline { progress_watcher: Option>, use_send_queue: bool, ) -> Arc { + let formatted_caption = formatted_caption_from(&caption, &formatted_caption); SendAttachmentJoinHandle::new(RUNTIME.spawn(async move { let base_video_info: BaseVideoInfo = BaseVideoInfo::try_from(&video_info) .map_err(|_| RoomError::InvalidAttachmentData)?; @@ -351,6 +353,7 @@ impl Timeline { progress_watcher: Option>, use_send_queue: bool, ) -> Arc { + let formatted_caption = formatted_caption_from(&caption, &formatted_caption); SendAttachmentJoinHandle::new(RUNTIME.spawn(async move { let base_audio_info: BaseAudioInfo = BaseAudioInfo::try_from(&audio_info) .map_err(|_| RoomError::InvalidAttachmentData)?; @@ -383,6 +386,7 @@ impl Timeline { progress_watcher: Option>, use_send_queue: bool, ) -> Arc { + let formatted_caption = formatted_caption_from(&caption, &formatted_caption); SendAttachmentJoinHandle::new(RUNTIME.spawn(async move { let base_audio_info: BaseAudioInfo = BaseAudioInfo::try_from(&audio_info) .map_err(|_| RoomError::InvalidAttachmentData)?; @@ -710,6 +714,24 @@ impl Timeline { } } +/// Given a pair of optional `caption` and `formatted_caption` parameters, +/// return a formatted caption: +/// +/// - If a `formatted_caption` exists, return it. +/// - If it doesn't exist but there is a `caption`, parse it as markdown and +/// return the result. +/// - Return `None` if there are no `caption` or `formatted_caption` parameters. +fn formatted_caption_from( + caption: &Option, + formatted_caption: &Option, +) -> Option { + match (&caption, formatted_caption) { + (None, None) => None, + (Some(body), None) => RumaFormattedBody::markdown(body), + (_, Some(formated_body)) => Some(formated_body.clone().into()), + } +} + /// A handle to perform actions onto a local echo. #[derive(uniffi::Object)] pub struct SendHandle {