From bb27eb3f0867e9cfa199c32c28104be3d98928cc Mon Sep 17 00:00:00 2001 From: RumovZ Date: Sat, 16 Apr 2022 17:12:16 +0200 Subject: [PATCH] Let import_apkg() take a progress func --- rslib/src/backend/progress.rs | 1 + rslib/src/import_export/mod.rs | 1 + .../package/apkg/import/cards.rs | 2 +- .../package/apkg/import/decks.rs | 2 +- .../package/apkg/import/media.rs | 26 ++++++++++++++----- .../import_export/package/apkg/import/mod.rs | 22 +++++++++++----- .../package/apkg/import/notes.rs | 2 +- 7 files changed, 40 insertions(+), 16 deletions(-) diff --git a/rslib/src/backend/progress.rs b/rslib/src/backend/progress.rs index a21bede23..442efcf7e 100644 --- a/rslib/src/backend/progress.rs +++ b/rslib/src/backend/progress.rs @@ -110,6 +110,7 @@ pub(super) fn progress_to_proto(progress: Option, tr: &I18n) -> pb::Pr match progress { ImportProgress::Collection => tr.importing_importing_collection(), ImportProgress::Media(n) => tr.importing_processed_media_file(n), + ImportProgress::MediaCheck(n) => tr.media_check_checked(n), } .into(), ), diff --git a/rslib/src/import_export/mod.rs b/rslib/src/import_export/mod.rs index 324a11186..0b40b1f50 100644 --- a/rslib/src/import_export/mod.rs +++ b/rslib/src/import_export/mod.rs @@ -9,4 +9,5 @@ pub mod package; pub enum ImportProgress { Collection, Media(usize), + MediaCheck(usize), } diff --git a/rslib/src/import_export/package/apkg/import/cards.rs b/rslib/src/import_export/package/apkg/import/cards.rs index 9df564708..c5009dd45 100644 --- a/rslib/src/import_export/package/apkg/import/cards.rs +++ b/rslib/src/import_export/package/apkg/import/cards.rs @@ -65,7 +65,7 @@ impl Collection { } } -impl<'a> Context<'a> { +impl Context<'_, F> { pub(super) fn import_cards_and_revlog( &mut self, imported_notes: &HashMap, diff --git a/rslib/src/import_export/package/apkg/import/decks.rs b/rslib/src/import_export/package/apkg/import/decks.rs index 35b035a54..5de4654c5 100644 --- a/rslib/src/import_export/package/apkg/import/decks.rs +++ b/rslib/src/import_export/package/apkg/import/decks.rs @@ -26,7 +26,7 @@ impl<'d> DeckContext<'d> { } } -impl Context<'_> { +impl Context<'_, F> { pub(super) fn import_decks_and_configs(&mut self) -> Result> { let mut ctx = DeckContext::new(self.target_col, self.usn); ctx.import_deck_configs(mem::take(&mut self.data.deck_configs))?; diff --git a/rslib/src/import_export/package/apkg/import/media.rs b/rslib/src/import_export/package/apkg/import/media.rs index 504265fdd..e5a8ca426 100644 --- a/rslib/src/import_export/package/apkg/import/media.rs +++ b/rslib/src/import_export/package/apkg/import/media.rs @@ -7,9 +7,12 @@ use zip::ZipArchive; use super::Context; use crate::{ - import_export::package::{ - media::{extract_media_entries, SafeMediaEntry}, - Meta, + import_export::{ + package::{ + media::{extract_media_entries, SafeMediaEntry}, + Meta, + }, + ImportProgress, }, media::{ files::{add_hash_suffix_to_file_stem, sha1_of_reader}, @@ -29,14 +32,20 @@ pub(super) struct MediaUseMap { unchecked: Vec, } -impl<'a> Context<'a> { +impl Result<()>> Context<'_, F> { pub(super) fn prepare_media(&mut self) -> Result { - let existing_sha1s = self.target_col.all_existing_sha1s()?; + let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok(); + let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?; prepare_media(&mut self.archive, &existing_sha1s) } pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> { + let mut counter = 0; for entry in media_map.used_entries() { + counter += 1; + if counter % 10 == 0 { + (self.progress_fn)(ImportProgress::Media(counter))?; + } entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?; } Ok(()) @@ -44,9 +53,12 @@ impl<'a> Context<'a> { } impl Collection { - fn all_existing_sha1s(&mut self) -> Result> { + fn all_existing_sha1s( + &mut self, + progress_fn: impl FnMut(usize) -> bool, + ) -> Result> { let mgr = MediaManager::new(&self.media_folder, &self.media_db)?; - mgr.all_checksums(|_| true, &self.log) + mgr.all_checksums(progress_fn, &self.log) } } diff --git a/rslib/src/import_export/package/apkg/import/mod.rs b/rslib/src/import_export/package/apkg/import/mod.rs index d63641fdb..94c3d7de6 100644 --- a/rslib/src/import_export/package/apkg/import/mod.rs +++ b/rslib/src/import_export/package/apkg/import/mod.rs @@ -15,32 +15,41 @@ use zip::ZipArchive; use crate::{ collection::CollectionBuilder, - import_export::{gather::ExchangeData, package::Meta}, + import_export::{gather::ExchangeData, package::Meta, ImportProgress}, prelude::*, search::SearchNode, }; -struct Context<'a> { +struct Context<'a, F> { target_col: &'a mut Collection, archive: ZipArchive, data: ExchangeData, usn: Usn, + progress_fn: F, } impl Collection { - pub fn import_apkg(&mut self, path: impl AsRef) -> Result> { + pub fn import_apkg( + &mut self, + path: impl AsRef, + progress_fn: impl FnMut(ImportProgress) -> Result<()>, + ) -> Result> { let file = File::open(path)?; let archive = ZipArchive::new(file)?; self.transact(Op::Import, |col| { - let mut ctx = Context::new(archive, col)?; + let mut ctx = Context::new(archive, col, progress_fn)?; ctx.import() }) } } -impl<'a> Context<'a> { - fn new(mut archive: ZipArchive, target_col: &'a mut Collection) -> Result { +impl<'a, F: FnMut(ImportProgress) -> Result<()>> Context<'a, F> { + fn new( + mut archive: ZipArchive, + target_col: &'a mut Collection, + progress_fn: F, + ) -> Result { let data = ExchangeData::gather_from_archive(&mut archive, SearchNode::WholeCollection, true)?; let usn = target_col.usn()?; @@ -49,6 +58,7 @@ impl<'a> Context<'a> { archive, data, usn, + progress_fn, }) } diff --git a/rslib/src/import_export/package/apkg/import/notes.rs b/rslib/src/import_export/package/apkg/import/notes.rs index 9f3a15537..c35b8ad0c 100644 --- a/rslib/src/import_export/package/apkg/import/notes.rs +++ b/rslib/src/import_export/package/apkg/import/notes.rs @@ -43,7 +43,7 @@ impl NoteMeta { } } -impl Context<'_> { +impl Context<'_, F> { pub(super) fn import_notes_and_notetypes( &mut self, media_map: &mut MediaUseMap,