Commit graph

43 commits

Author SHA1 Message Date
RumovZ
c521753057
Refactor error handling (#2136)
* Add crate snafu

* Replace all inline structs in AnkiError

* Derive Snafu on AnkiError

* Use snafu for card type errors

* Use snafu whatever error for InvalidInput

* Use snafu for NotFoundError and improve message

* Use snafu for FileIoError to attach context

Remove IoError.
Add some context-attaching helpers to replace code returning bare
io::Errors.

* Add more context-attaching io helpers

* Add message, context and backtrace to new snafus

* Utilize error context and backtrace on frontend

* Rename LocalizedError -> BackendError.
* Remove DocumentedError.
* Have all backend exceptions inherit BackendError.

* Rename localized(_description) -> message

* Remove accidentally committed experimental trait

* invalid_input_context -> ok_or_invalid

* ensure_valid_input! -> require!

* Always return `Err` from `invalid_input!`

Instead of a Result to unwrap, the macro accepts a source error now.

* new_tempfile_in_parent -> new_tempfile_in_parent_of

* ok_or_not_found -> or_not_found

* ok_or_invalid -> or_invalid

* Add crate convert_case

* Use unqualified lowercase type name

* Remove uses of snafu::ensure

* Allow public construction of InvalidInputErrors (dae)

Needed to port the AnkiDroid changes.

* Make into_protobuf() public (dae)

Also required for AnkiDroid. Not sure why it worked previously - possible
bug in older Rust version?
2022-10-21 18:02:12 +10:00
Damien Elmes
a39a3b4d34 Update to latest rules_rust and Rust 1.64 2022-09-24 11:12:58 +10:00
Damien Elmes
b392020798 fix clippy lints for latest Rust 2021-06-21 13:09:36 +10:00
Damien Elmes
cf2613e869 update Rust deps
- tokio 1.0
- updated reqwest, thanks to Rumo
- other minor dep updates

the reqwest build file has been split into two, as it was awkward
to manually update the combined file, and the platform gate is now
on the target in rslib/
2021-04-27 22:18:12 +10:00
Damien Elmes
64ebc32b3d tidy up Rust imports
rustfmt can do this automatically, but only when run with a nightly
toolchain, so it needs to be manually done for now - see rslib/rusfmt.toml
2021-04-18 18:38:54 +10:00
Damien Elmes
af37164fba move sync/network errors into separate file 2021-04-01 17:02:54 +10:00
Damien Elmes
094e4ad461 crate::err -> crate::error 2021-04-01 16:07:13 +10:00
Damien Elmes
dc81a7fed0 use mixed case for abbreviations in Rust code
So, this is fun. Apparently "DeckId" is considered preferable to the
"DeckID" were were using until now, and the latest clippy will start
warning about it. We could of course disable the warning, but probably
better to bite the bullet and switch to the naming that's generally
considered best.
2021-03-27 19:53:33 +10:00
Damien Elmes
06e00be985 specify I/O timeout
We need to be a bit conservative here due to buffer bloat - in the
upload case on a slow link, it can appear that no I/O is happening
when a buffer is draining.
2020-08-26 18:30:51 +10:00
Damien Elmes
0e5b7da62a login/full up/full down plugged in 2020-06-01 13:57:10 +10:00
Damien Elmes
ee6d7f82e7 rework progress handling
- client now polls status instead of backend pushing it
- supports multiple threads
- update throttling happens in one place
2020-06-01 13:57:10 +10:00
Damien Elmes
4fcb10bfa9 start on HTTP client for syncing 2020-06-01 13:57:10 +10:00
Damien Elmes
6495240914 add some timeouts
I'm waiting to hear back from the reqwests author on the best way to
handle this. For now, this change just adds short timeouts
to the quick requests, and will wait for up to an hour when sending/
receiving files to allow for the slow connection+large file case.
2020-04-01 10:03:54 +10:00
Damien Elmes
e3a57a4193 fix clippy lint on other platforms 2020-03-19 10:58:52 +10:00
Damien Elmes
617b18ff49 correctly handle NFD content in media DB from older Anki versions 2020-03-19 10:20:42 +10:00
Damien Elmes
6e30572e6d log sync errors 2020-03-10 09:43:48 +10:00
Damien Elmes
b4af0ca825 tweak logging 2020-03-10 09:30:05 +10:00
Damien Elmes
18cd841246 don't try to read file data when file marked as a deletion
If the user hadn't used the media check to clean up files with
invalid names on disk,  the long filename would break the 'automatically
rename long filenames when syncing' functionality, causing the original
long filename to be uploaded to AnkiWeb as an addition instead of
a deletion
2020-03-10 09:29:36 +10:00
Damien Elmes
ba4fe71eba make logging explicit, and support logging to a file 2020-02-29 20:44:01 +10:00
Damien Elmes
3a1fc74ec3 remove some unused imports 2020-02-29 15:21:11 +10:00
Damien Elmes
319390f0c6 more frequent progress updates 2020-02-17 08:40:17 +10:00
Damien Elmes
23483b0a57 mark deletions in media DB when files are deleted 2020-02-17 08:40:17 +10:00
Damien Elmes
1ff6cbc54d make sure renames generated during sync don't get immediately removed 2020-02-17 08:40:17 +10:00
Damien Elmes
d394aed5fd don't filter out invalid filenames when we're sending them as a deletion 2020-02-17 08:40:17 +10:00
Damien Elmes
bf50f88540 handle read errors during zip build 2020-02-17 08:40:17 +10:00
Damien Elmes
eddf9fdc44 clean up invalid media DB entries on the fly, instead of requiring DB check 2020-02-17 08:40:17 +10:00
Damien Elmes
7ae6244f6a log media DB change registration progress, and allow aborting it 2020-02-17 08:40:17 +10:00
Damien Elmes
e5f9ed5a5b move change tracking into separate file 2020-02-17 08:40:17 +10:00
Damien Elmes
5fe1bfc5b4 simplify code by accumulating stats at the source 2020-02-17 08:40:17 +10:00
Damien Elmes
4289f7a02a move sync_media() into MediaManager 2020-02-17 08:40:17 +10:00
Damien Elmes
32a3b5a020 tidy up sync.rs 2020-02-17 08:40:17 +10:00
Damien Elmes
9067bf98bd handle concurrent modifications and ankiweb terminating early 2020-02-17 08:40:17 +10:00
Damien Elmes
e0511c560b update dirmod as files added during sync 2020-02-17 08:40:17 +10:00
Damien Elmes
631bdc2a1e add debug line 2020-02-17 08:40:17 +10:00
Damien Elmes
23f5c7cb9b rename non-normalized filenames when downloading 2020-02-17 08:40:17 +10:00
Damien Elmes
98279add15 defer errors on upload to media check 2020-02-17 08:40:17 +10:00
Damien Elmes
0f7fc1e960 add proper version 2020-02-17 08:40:16 +10:00
Damien Elmes
6a64c8dfcc use enums for some common errors 2020-02-17 08:40:16 +10:00
Damien Elmes
ec9abf1ce5 pass in endpoint 2020-02-17 08:40:16 +10:00
Damien Elmes
ea4de9a6de connect media sync progress to Python, add a progress dialog 2020-02-17 08:40:16 +10:00
Damien Elmes
c82cff3836 add progress hook to media sync 2020-02-17 08:40:16 +10:00
Damien Elmes
5e5906f183 store sync state in a struct, and reuse ctx across methods 2020-02-17 08:40:16 +10:00
Damien Elmes
f20b5b8db6 media sync working, but unpolished 2020-02-17 08:40:16 +10:00