From b87ca6e747800170fddbfcfa892c0f1ee343c7b3 Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Thu, 26 Nov 2020 03:06:36 +0100 Subject: [PATCH] restructure code --- src/export_chat.rs | 81 +++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/src/export_chat.rs b/src/export_chat.rs index 0a915dc54..bab0ded14 100644 --- a/src/export_chat.rs +++ b/src/export_chat.rs @@ -20,9 +20,9 @@ //! ``` //! [`SaveMimeHeaders`]: ../config/enum.Config.html#variant.SaveMimeHeaders -use crate::constants::DC_GCM_ADDDAYMARKER; use crate::chat::*; use crate::constants::Viewtype; +use crate::constants::DC_GCM_ADDDAYMARKER; use crate::contact::*; use crate::context::Context; // use crate::error::Error; @@ -35,7 +35,6 @@ use std::path::Path; use zip::write::FileOptions; use crate::location::Location; -use futures::future::join_all; use serde::Serialize; #[derive(Debug)] @@ -191,31 +190,36 @@ impl ChatItemJSON { async fn export_chat_data(context: &Context, chat_id: ChatId) -> ExportChatResult { let mut blobs = Vec::new(); let mut chat_author_ids = Vec::new(); - // get all messages - let chat_items = get_chat_msgs(context, chat_id, DC_GCM_ADDDAYMARKER, None).await; - let message_futures = chat_items - .clone() - .into_iter() - .map(|chat_item| match chat_item { - ChatItem::Message { msg_id } => msg_id, - _ => MsgId::new_unset(), - }) - .filter(|msg_id| !msg_id.is_unset()) - .map(|msg_id| Message::load_from_db(context, msg_id)) - .collect::>(); - let messages: Vec> = - join_all(message_futures).await; - // push all referenced blobs and populate contactid list - for message in &messages { - if let Ok(msg) = &message { - let filename = msg.get_filename(); - if let Some(file) = filename { - // push referenced blobs (attachments) - blobs.push(file); - } - chat_author_ids.push(msg.from_id); + // message_ids var is used for writing message info to files + let mut message_ids: Vec = Vec::new(); + let mut message_json: Vec = Vec::new(); + + for item in get_chat_msgs(context, chat_id, DC_GCM_ADDDAYMARKER, None).await { + if let Some(json_item) = match item { + ChatItem::Message { msg_id } => match Message::load_from_db(context, msg_id).await { + Ok(message) => { + let filename = message.get_filename(); + if let Some(file) = filename { + // push referenced blobs (attachments) + blobs.push(file); + } + message_ids.push(message.id); + // populate contactid list + chat_author_ids.push(message.from_id); + Some(ChatItemJSON::from_message(&message, &context).await) + } + Err(error_message) => Some(ChatItemJSON::MessageError { + id: msg_id.to_u32(), + error: error_message.to_string(), + }), + }, + ChatItem::DayMarker { timestamp } => Some(ChatItemJSON::DayMarker { timestamp }), + ChatItem::Marker1 => None, + } { + message_json.push(json_item) } } + // deduplicate contact list and load the contacts chat_author_ids.sort(); chat_author_ids.dedup(); @@ -277,33 +281,6 @@ async fn export_chat_data(context: &Context, chat_id: ChatId) -> ExportChatResul None => None, }; - let mut message_ids: Vec = Vec::new(); - for message in &messages { - if let Ok(msg) = &message { - message_ids.push(msg.id); - } - } - drop(messages); - - let mut message_json: Vec = Vec::new(); - - for item in chat_items { - let json_item_result = match item { - ChatItem::Message { msg_id } => match Message::load_from_db(context, msg_id).await { - Ok(message) => Some(ChatItemJSON::from_message(&message, &context).await), - Err(error_message) => Some(ChatItemJSON::MessageError { - id: msg_id.to_u32(), - error: error_message.to_string(), - }), - }, - ChatItem::DayMarker { timestamp } => Some(ChatItemJSON::DayMarker { timestamp }), - ChatItem::Marker1 => None, - }; - if let Some(json_item) = json_item_result { - message_json.push(json_item) - } - } - let chat_json = ChatJSON { chat_json_version: 1, export_timestamp: time(),