From 0173ebf384551579dfaf7d59d2fbfccb70c2f97f Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 22 Jun 2023 09:43:55 +1000 Subject: [PATCH] Fix lack of progress/error when importing a .colpkg We should be accessing the backend progress state, instead of the collection's state. --- proto/anki/collection.proto | 2 ++ rslib/src/backend/collection.rs | 43 +++------------------------ rslib/src/collection/mod.rs | 1 + rslib/src/collection/service.rs | 52 +++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 39 deletions(-) create mode 100644 rslib/src/collection/service.rs diff --git a/proto/anki/collection.proto b/proto/anki/collection.proto index e82ca9f04..bf8b53cbb 100644 --- a/proto/anki/collection.proto +++ b/proto/anki/collection.proto @@ -33,6 +33,8 @@ service BackendCollectionService { // If a backup is running, wait for it to complete. Will return an error // if the backup encountered an error. rpc AwaitBackupCompletion(generic.Empty) returns (generic.Empty); + rpc LatestProgress(generic.Empty) returns (Progress); + rpc SetWantsAbort(generic.Empty) returns (generic.Empty); } message OpenCollectionRequest { diff --git a/rslib/src/backend/collection.rs b/rslib/src/backend/collection.rs index bce92bba3..5203a9195 100644 --- a/rslib/src/backend/collection.rs +++ b/rslib/src/backend/collection.rs @@ -82,49 +82,14 @@ impl BackendCollectionService for Backend { self.await_backup_completion()?; Ok(()) } -} -impl crate::services::CollectionService for Collection { - fn check_database(&mut self) -> Result { - { - self.check_database() - .map(|problems| anki_proto::collection::CheckDatabaseResponse { - problems: problems.to_i18n_strings(&self.tr), - }) - } - } - - fn get_undo_status(&mut self) -> Result { - Ok(self.undo_status().into_protobuf(&self.tr)) - } - - fn undo(&mut self) -> Result { - self.undo().map(|out| out.into_protobuf(&self.tr)) - } - - fn redo(&mut self) -> Result { - self.redo().map(|out| out.into_protobuf(&self.tr)) - } - - fn add_custom_undo_entry(&mut self, input: generic::String) -> Result { - Ok(self.add_custom_undo_step(input.val).into()) - } - - fn merge_undo_entries( - &mut self, - input: generic::UInt32, - ) -> Result { - let starting_from = input.val as usize; - self.merge_undoable_ops(starting_from).map(Into::into) - } - - fn latest_progress(&mut self) -> Result { - let progress = self.state.progress.lock().unwrap().last_progress; + fn latest_progress(&self) -> Result { + let progress = self.progress_state.lock().unwrap().last_progress; Ok(progress_to_proto(progress, &self.tr)) } - fn set_wants_abort(&mut self) -> Result<()> { - self.state.progress.lock().unwrap().want_abort = true; + fn set_wants_abort(&self) -> Result<()> { + self.progress_state.lock().unwrap().want_abort = true; Ok(()) } } diff --git a/rslib/src/collection/mod.rs b/rslib/src/collection/mod.rs index 9829b7215..4604f0145 100644 --- a/rslib/src/collection/mod.rs +++ b/rslib/src/collection/mod.rs @@ -2,6 +2,7 @@ // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html pub mod backup; +mod service; pub(crate) mod timestamps; mod transact; pub(crate) mod undo; diff --git a/rslib/src/collection/service.rs b/rslib/src/collection/service.rs new file mode 100644 index 000000000..57fd89ec7 --- /dev/null +++ b/rslib/src/collection/service.rs @@ -0,0 +1,52 @@ +// Copyright: Ankitects Pty Ltd and contributors +// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html +use anki_proto::generic; + +use crate::collection::Collection; +use crate::error; +use crate::progress::progress_to_proto; + +impl crate::services::CollectionService for Collection { + fn check_database(&mut self) -> error::Result { + { + self.check_database() + .map(|problems| anki_proto::collection::CheckDatabaseResponse { + problems: problems.to_i18n_strings(&self.tr), + }) + } + } + + fn get_undo_status(&mut self) -> error::Result { + Ok(self.undo_status().into_protobuf(&self.tr)) + } + + fn undo(&mut self) -> error::Result { + self.undo().map(|out| out.into_protobuf(&self.tr)) + } + + fn redo(&mut self) -> error::Result { + self.redo().map(|out| out.into_protobuf(&self.tr)) + } + + fn add_custom_undo_entry(&mut self, input: generic::String) -> error::Result { + Ok(self.add_custom_undo_step(input.val).into()) + } + + fn merge_undo_entries( + &mut self, + input: generic::UInt32, + ) -> error::Result { + let starting_from = input.val as usize; + self.merge_undoable_ops(starting_from).map(Into::into) + } + + fn latest_progress(&mut self) -> error::Result { + let progress = self.state.progress.lock().unwrap().last_progress; + Ok(progress_to_proto(progress, &self.tr)) + } + + fn set_wants_abort(&mut self) -> error::Result<()> { + self.state.progress.lock().unwrap().want_abort = true; + Ok(()) + } +}