From 3820df78c9cea5741ed054b0d30314136d2c933b Mon Sep 17 00:00:00 2001 From: nvh0412 Date: Sat, 16 Mar 2024 14:32:07 +1100 Subject: [PATCH] chore: Add the state machine for our FlashCard --- Cargo.lock | 2100 ++++++++++++++++- Cargo.toml | 3 + src/components/deck/deck_list.rs | 2 +- src/components/tab_bar_container.rs | 4 +- src/db.rs | 1 + src/models/card.rs | 25 + src/models/collection.rs | 11 +- src/models/deck.rs | 7 +- src/models/mod.rs | 6 +- src/models/queue.rs | 52 +- src/models/states/card_state.rs | 29 + src/models/states/learning_state.rs | 65 + src/models/states/mod.rs | 5 + src/models/states/new_state.rs | 32 + src/models/states/relearning_state.rs | 12 + src/models/states/review_state.rs | 18 + src/repositories/card_data.rs | 77 + src/repositories/flash_card.rs | 129 +- src/repositories/get_card.sql | 16 + src/repositories/mod.rs | 3 +- src/repositories/query_cards_in_deck.sql | 15 + .../query_cards_in_deck_by_queue.sql | 25 +- 22 files changed, 2443 insertions(+), 194 deletions(-) create mode 100644 src/models/card.rs create mode 100644 src/models/states/card_state.rs create mode 100644 src/models/states/learning_state.rs create mode 100644 src/models/states/mod.rs create mode 100644 src/models/states/new_state.rs create mode 100644 src/models/states/relearning_state.rs create mode 100644 src/models/states/review_state.rs create mode 100644 src/repositories/card_data.rs create mode 100644 src/repositories/get_card.sql create mode 100644 src/repositories/query_cards_in_deck.sql diff --git a/Cargo.lock b/Cargo.lock index e34a430..5c2bca6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.8.7" @@ -89,6 +100,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + [[package]] name = "async-channel" version = "1.9.0" @@ -250,6 +270,17 @@ version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +[[package]] +name = "async-trait" +version = "0.1.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "atomic" version = "0.5.3" @@ -300,6 +331,27 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "2.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95" +dependencies = [ + "serde", +] + [[package]] name = "bindgen" version = "0.65.1" @@ -323,6 +375,27 @@ dependencies = [ "which", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -382,11 +455,263 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "burn" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b703e5dae87b2146649b64af54688ff86e16cf69fd19d28c43c8f9656d7d7c" +dependencies = [ + "burn-core", + "burn-train", +] + +[[package]] +name = "burn-autodiff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f306e1b2e480fa0960c3130a68ca5e0fa54b3e33ed2fda7cf2121434703dd771" +dependencies = [ + "burn-common", + "burn-tensor", + "derive-new", + "spin", +] + +[[package]] +name = "burn-candle" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc87b644a2d83cc1b7c05d1176e9e24fb6394272256ab9ab8324ff7c4fe0e6a0" +dependencies = [ + "burn-tensor", + "candle-core", + "derive-new", + "half", +] + +[[package]] +name = "burn-common" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1267068969f094323b62693df0c3b45d3b08a0568f3c3467e6a5c3207e6807c8" +dependencies = [ + "async-trait", + "derive-new", + "getrandom", + "rand", + "serde", + "spin", + "uuid 1.7.0", + "web-time", +] + +[[package]] +name = "burn-compute" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b51588cf7c84976f6241a9ac5f77857712b8bf443dab77296c260785033fe8" +dependencies = [ + "burn-common", + "derive-new", + "dirs 5.0.1", + "hashbrown 0.14.3", + "log", + "md5", + "serde", + "serde_json", + "spin", + "web-time", +] + +[[package]] +name = "burn-core" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b11d8fd1e8c656eee1a0bb503b798c4583904dcaf7a369cbb8fdfd3acc3d0ab" +dependencies = [ + "bincode", + "burn-autodiff", + "burn-candle", + "burn-common", + "burn-dataset", + "burn-derive", + "burn-fusion", + "burn-ndarray", + "burn-tch", + "burn-tensor", + "burn-wgpu", + "derive-new", + "flate2", + "half", + "hashbrown 0.14.3", + "libm", + "log", + "rand", + "rmp-serde", + "serde", + "serde_json", + "spin", +] + +[[package]] +name = "burn-dataset" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6050891281ae38ee9dc24d1d5badd084247717b15e3dcdae562a81456a41c6e" +dependencies = [ + "csv", + "derive-new", + "dirs 5.0.1", + "gix-tempfile", + "image 0.24.9", + "r2d2", + "r2d2_sqlite", + "rand", + "rmp-serde", + "rusqlite", + "sanitize-filename", + "serde", + "serde_json", + "serde_rusqlite", + "strum 0.25.0", + "strum_macros 0.25.3", + "tempfile", + "thiserror", +] + +[[package]] +name = "burn-derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f149de5f32baa3f2191c374edab71e5a323bade05eb6092c702aed76cdcb7b" +dependencies = [ + "derive-new", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "burn-fusion" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f512f780beaefca46088c4e4a80595511fbc3b35545118281fbf49f1fca767b4" +dependencies = [ + "burn-common", + "burn-tensor", + "derive-new", + "hashbrown 0.14.3", + "log", + "serde", + "spin", +] + +[[package]] +name = "burn-ndarray" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aef9fb0b72a1c0a112ed51e35284fb663d3ba3fd98f3a3bfa32db39fd24ae4d" +dependencies = [ + "burn-autodiff", + "burn-common", + "burn-tensor", + "derive-new", + "libm", + "matrixmultiply", + "ndarray", + "num-traits", + "rand", + "rayon", + "spin", +] + +[[package]] +name = "burn-tch" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7aec36d836c5a11714480089738120899e2c91f6fe2e23abd09ec4a68a803" +dependencies = [ + "burn-tensor", + "half", + "libc", + "rand", + "tch", +] + +[[package]] +name = "burn-tensor" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad09aeb0f2428a4ee91f9876a7d71cef6feb1fcacdab6389362dd878ec5f9b27" +dependencies = [ + "burn-common", + "derive-new", + "half", + "hashbrown 0.14.3", + "libm", + "num-traits", + "rand", + "rand_distr", + "serde", +] + +[[package]] +name = "burn-train" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5536e98b23dd5047728f288e61e8a4d9fbffef6f55086d3483c2464758508d" +dependencies = [ + "burn-core", + "derive-new", + "log", + "serde", + "tracing-appender", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "burn-wgpu" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231d2deb14a02838c29dd5e90d1a87a9578d76bda7b02d5c7a77e5440ef6ae95" +dependencies = [ + "burn-common", + "burn-compute", + "burn-tensor", + "bytemuck", + "derive-new", + "futures-intrusive", + "hashbrown 0.14.3", + "log", + "num-traits", + "pollster 0.3.0", + "rand", + "serde", + "spin", + "text_placeholder", + "wgpu", +] + [[package]] name = "bytemuck" version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] [[package]] name = "byteorder" @@ -400,6 +725,48 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "candle-core" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db8659ea87ee8197d2fc627348916cce0561330ee7ae3874e771691d3cecb2f" +dependencies = [ + "byteorder", + "gemm", + "half", + "memmap2 0.9.4", + "num-traits", + "num_cpus", + "rand", + "rand_distr", + "rayon", + "safetensors 0.4.2", + "thiserror", + "yoke", + "zip", +] + [[package]] name = "castaway" version = "0.1.2" @@ -437,6 +804,7 @@ version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ + "jobserver", "libc", ] @@ -469,6 +837,16 @@ dependencies = [ "windows-targets 0.52.0", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.7.0" @@ -477,7 +855,7 @@ checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.1", ] [[package]] @@ -534,6 +912,16 @@ dependencies = [ "objc", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + [[package]] name = "collections" version = "0.1.0" @@ -548,6 +936,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "com-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" + [[package]] name = "concurrent-queue" version = "2.4.0" @@ -563,6 +957,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6" +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "convert_case" version = "0.4.0" @@ -653,6 +1053,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -687,6 +1096,12 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -698,22 +1113,43 @@ dependencies = [ ] [[package]] -name = "ctor" -version = "0.2.6" +name = "csv" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" dependencies = [ - "quote", - "syn 2.0.48", + "csv-core", + "itoa", + "ryu", + "serde", ] [[package]] -name = "curl" -version = "0.4.44" +name = "csv-core" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" dependencies = [ - "curl-sys", + "memchr", +] + +[[package]] +name = "ctor" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +dependencies = [ + "quote", + "syn 2.0.48", +] + +[[package]] +name = "curl" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +dependencies = [ + "curl-sys", "libc", "openssl-probe", "openssl-sys", @@ -737,6 +1173,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "d3d12" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" +dependencies = [ + "bitflags 2.4.2", + "libloading 0.8.1", + "winapi", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.3", + "lock_api", + "once_cell", + "parking_lot_core 0.9.9", +] + [[package]] name = "data-url" version = "0.1.1" @@ -766,6 +1226,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive-new" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -797,6 +1268,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -805,7 +1277,16 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" dependencies = [ - "dirs-sys", + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", ] [[package]] @@ -829,6 +1310,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -846,7 +1339,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.1", ] [[package]] @@ -867,6 +1360,16 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +[[package]] +name = "dyn-stack" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e53799688f5632f364f8fb387488dd05db9fe45db7011be066fc20e7027f8b" +dependencies = [ + "bytemuck", + "reborrow", +] + [[package]] name = "either" version = "1.9.0" @@ -882,6 +1385,18 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "env_logger" version = "0.9.3" @@ -977,6 +1492,22 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide 0.7.1", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -989,6 +1520,15 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "faster-hex" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" +dependencies = [ + "serde", +] + [[package]] name = "fastrand" version = "1.9.0" @@ -1004,6 +1544,15 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + [[package]] name = "flate2" version = "1.0.28" @@ -1026,6 +1575,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1063,7 +1624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e58903f4f8d5b58c7d300908e4ebe5289c1bfdf5587964330f12023b8ff17fd1" dependencies = [ "log", - "memmap2", + "memmap2 0.2.3", "ttf-parser 0.12.3", ] @@ -1139,6 +1700,23 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "fsrs" +version = "0.5.4" +source = "git+https://github.com/open-spaced-repetition/fsrs-rs#0634cb08b08fecb96b0b8a9caba4a5e6938e85bb" +dependencies = [ + "burn", + "itertools 0.12.1", + "log", + "ndarray", + "ndarray-rand", + "rand", + "rayon", + "serde", + "snafu", + "strum 0.26.2", +] + [[package]] name = "futf" version = "0.1.5" @@ -1191,6 +1769,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.12.1", +] + [[package]] name = "futures-io" version = "0.3.30" @@ -1266,6 +1855,124 @@ dependencies = [ "slab", ] +[[package]] +name = "gemm" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab24cc62135b40090e31a76a9b2766a501979f3070fa27f689c27ec04377d32" +dependencies = [ + "dyn-stack", + "gemm-c32", + "gemm-c64", + "gemm-common", + "gemm-f16", + "gemm-f32", + "gemm-f64", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c030d0b983d1e34a546b86e08f600c11696fde16199f971cd46c12e67512c0" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb5f2e79fefb9693d18e1066a557b4546cd334b226beadc68b11a8f9431852a" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e7ea062c987abcd8db95db917b4ffb4ecdfd0668471d8dc54734fdff2354e8" +dependencies = [ + "bytemuck", + "dyn-stack", + "half", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp", + "raw-cpuid", + "rayon", + "seq-macro", + "sysctl", +] + +[[package]] +name = "gemm-f16" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca4c06b9b11952071d317604acb332e924e817bd891bec8dfb494168c7cedd4" +dependencies = [ + "dyn-stack", + "gemm-common", + "gemm-f32", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a69f51aaefbd9cf12d18faf273d3e982d9d711f60775645ed5c8047b4ae113" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa397a48544fadf0b81ec8741e5c0fba0043008113f71f2034def1935645d2b0" +dependencies = [ + "dyn-stack", + "gemm-common", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1283,8 +1990,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1297,12 +2006,85 @@ dependencies = [ "weezl", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "gix-features" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d46a4a5c6bb5bebec9c0d18b65ada20e6517dbd7cf855b87dd4bbdce3a771b2" +dependencies = [ + "gix-hash", + "gix-trace", + "libc", +] + +[[package]] +name = "gix-fs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20e86eb040f5776a5ade092282e51cdcad398adb77d948b88d17583c2ae4e107" +dependencies = [ + "gix-features", +] + +[[package]] +name = "gix-hash" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8cf8c2266f63e582b7eb206799b63aa5fa68ee510ad349f637dfe2d0653de0" +dependencies = [ + "faster-hex", + "thiserror", +] + +[[package]] +name = "gix-tempfile" +version = "11.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388dd29114a86ec69b28d1e26d6d63a662300ecf61ab3f4cc578f7d7dc9e7e23" +dependencies = [ + "dashmap", + "gix-fs", + "libc", + "once_cell", + "parking_lot 0.12.1", + "signal-hook", + "signal-hook-registry", + "tempfile", +] + +[[package]] +name = "gix-trace" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b202d766a7fefc596e2cc6a89cda8ad8ad733aed82da635ac120691112a9b1" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + [[package]] name = "glob" version = "0.3.1" @@ -1322,6 +2104,80 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "glow" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.4.2", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.4.2", +] + +[[package]] +name = "gpu-allocator" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40fe17c8a05d60c38c0a4e5a3c802f2f1ceb66b76c67d96ffb34bef0475a7fad" +dependencies = [ + "backtrace", + "log", + "presser", + "thiserror", + "winapi", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +dependencies = [ + "bitflags 2.4.2", + "gpu-descriptor-types", + "hashbrown 0.14.3", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +dependencies = [ + "bitflags 2.4.2", +] + [[package]] name = "gpui" version = "0.1.0" @@ -1345,13 +2201,13 @@ dependencies = [ "foreign-types 0.3.2", "futures", "gpui_macros", - "image", - "itertools", + "image 0.23.14", + "itertools 0.10.5", "lazy_static", "linkme", "log", "media", - "metal", + "metal 0.21.0", "num_cpus", "objc", "ordered-float", @@ -1360,7 +2216,7 @@ dependencies = [ "pathfinder_geometry", "postage", "rand", - "raw-window-handle", + "raw-window-handle 0.6.0", "refineable", "resvg", "schemars", @@ -1398,12 +2254,36 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df00eed8d1f0db937f6be10e46e8072b0671accb504cf0f959c5c52c679f5b9" +[[package]] +name = "half" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", + "rand", + "rand_distr", + "serde", +] + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -1412,6 +2292,7 @@ checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", + "serde", ] [[package]] @@ -1423,6 +2304,21 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "hassle-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" +dependencies = [ + "bitflags 1.3.2", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", +] + [[package]] name = "heck" version = "0.4.1" @@ -1444,6 +2340,21 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "home" version = "0.5.9" @@ -1481,7 +2392,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -1512,14 +2423,32 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", - "gif", - "jpeg-decoder", + "gif 0.11.4", + "jpeg-decoder 0.1.22", "num-iter", "num-rational", "num-traits", - "png", + "png 0.16.8", "scoped_threadpool", - "tiff", + "tiff 0.6.1", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif 0.13.1", + "jpeg-decoder 0.3.1", + "num-traits", + "png 0.17.13", + "qoi", + "tiff 0.9.1", ] [[package]] @@ -1542,6 +2471,15 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -1598,12 +2536,30 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +[[package]] +name = "jobserver" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +dependencies = [ + "libc", +] + [[package]] name = "jpeg-decoder" version = "0.1.22" @@ -1613,6 +2569,15 @@ dependencies = [ "rayon", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + [[package]] name = "js-sys" version = "0.3.67" @@ -1622,6 +2587,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.1", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "kurbo" version = "0.8.3" @@ -1643,12 +2625,28 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.8.1" @@ -1659,6 +2657,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "libredox" version = "0.0.1" @@ -1766,6 +2770,25 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "num_cpus", + "once_cell", + "rawpointer", + "thread-tree", +] + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + [[package]] name = "media" version = "0.1.0" @@ -1777,7 +2800,7 @@ dependencies = [ "bytes", "core-foundation", "foreign-types 0.3.2", - "metal", + "metal 0.21.0", "objc", ] @@ -1796,6 +2819,16 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", + "stable_deref_trait", +] + [[package]] name = "metal" version = "0.21.0" @@ -1810,6 +2843,21 @@ dependencies = [ "objc", ] +[[package]] +name = "metal" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +dependencies = [ + "bitflags 2.4.2", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.17" @@ -1848,6 +2896,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", + "simd-adler32", +] + +[[package]] +name = "naga" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae585df4b6514cf8842ac0f1ab4992edc975892704835b549cf818dc0191249e" +dependencies = [ + "bit-set", + "bitflags 2.4.2", + "codespan-reporting", + "hexf-parse", + "indexmap 2.2.2", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ndarray" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", + "rayon", +] + +[[package]] +name = "ndarray-rand" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65608f937acc725f5b164dcf40f4f0bc5d67dc268ab8a649d3002606718c4588" +dependencies = [ + "ndarray", + "rand", + "rand_distr", ] [[package]] @@ -1864,10 +2967,13 @@ dependencies = [ "catppuccin", "chrono", "env_logger", + "fsrs", "gpui", "log", "rusqlite", "rust-embed", + "serde", + "serde_json", "time", "uuid 0.8.2", ] @@ -1882,6 +2988,26 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-complex" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +dependencies = [ + "bytemuck", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1927,6 +3053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1991,6 +3118,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-float" version = "2.10.1" @@ -2006,6 +3139,12 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking" version = "2.2.0" @@ -2060,6 +3199,23 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pathfinder_geometry" version = "0.5.1" @@ -2079,6 +3235,18 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -2158,6 +3326,19 @@ dependencies = [ "miniz_oxide 0.3.7", ] +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.7.1", +] + [[package]] name = "polling" version = "2.8.0" @@ -2194,6 +3375,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + [[package]] name = "postage" version = "0.5.0" @@ -2206,7 +3393,7 @@ dependencies = [ "log", "parking_lot 0.12.1", "pin-project", - "pollster", + "pollster 0.2.5", "static_assertions", "thiserror", ] @@ -2223,6 +3410,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + [[package]] name = "prettyplease" version = "0.2.16" @@ -2230,25 +3423,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.48", +] + +[[package]] +name = "proc-macro2" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" + +[[package]] +name = "pulp" +version = "0.18.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091bad01115892393939669b38f88ff2b70838e969a7ac172a9d06d05345a732" +dependencies = [ + "bytemuck", + "libm", + "num-complex", + "reborrow", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", ] [[package]] -name = "proc-macro2" -version = "1.0.78" +name = "r2d2" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" dependencies = [ - "unicode-ident", + "log", + "parking_lot 0.12.1", + "scheduled-thread-pool", ] [[package]] -name = "quote" -version = "1.0.35" +name = "r2d2_sqlite" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "4dc290b669d30e20751e813517bbe13662d020419c5c8818ff10b6e8bb7777f6" dependencies = [ - "proc-macro2", + "r2d2", + "rusqlite", + "uuid 1.7.0", ] [[package]] @@ -2281,12 +3523,49 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + [[package]] name = "raw-window-handle" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" version = "1.8.1" @@ -2313,6 +3592,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be9e29cb19c8fe84169fcb07f8f11e66bc9e6e0280efd4715c54818296f8a4a8" +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "redox_syscall" version = "0.2.16" @@ -2382,16 +3667,22 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + [[package]] name = "resvg" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09697862c5c3f940cbaffef91969c62188b5c8ed385b0aef43a5ff01ddc8000f" dependencies = [ - "jpeg-decoder", + "jpeg-decoder 0.1.22", "log", "pico-args", - "png", + "png 0.16.8", "rgb", "svgfilters", "tiny-skia", @@ -2407,6 +3698,43 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "roxmltree" version = "0.14.1" @@ -2513,6 +3841,43 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" + +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "rustybuzz" version = "0.3.0" @@ -2544,6 +3909,26 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "safetensors" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93279b86b3de76f820a8854dd06cbc33cfa57a417b19c47f6a25280112fb1df" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "safetensors" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d980e6bfb34436fb0a81e42bc41af43f11805bbbca443e7f68e9faaabe669ed" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "same-file" version = "1.0.6" @@ -2553,6 +3938,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "sanitize-filename" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "schannel" version = "0.1.23" @@ -2562,6 +3957,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot 0.12.1", +] + [[package]] name = "schemars" version = "0.8.16" @@ -2610,6 +4014,12 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +[[package]] +name = "seq-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" + [[package]] name = "serde" version = "1.0.196" @@ -2652,9 +4062,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "indexmap 2.2.2", "itoa", @@ -2662,6 +4072,27 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_rusqlite" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4600dac14aada464c5584d327baa164e372153309bc4c0fb1498bbfbaa5a028b" +dependencies = [ + "rusqlite", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2673,12 +4104,31 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2688,6 +4138,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simplecss" version = "0.2.1" @@ -2755,6 +4211,27 @@ dependencies = [ "futures-lite 1.13.0", ] +[[package]] +name = "snafu" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75976f4748ab44f6e5332102be424e7c2dc18daeaf7e725f2040c3ebb133512e" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b19911debfb8c2fb1107bc6cb2d61868aaf53a988449213959bb1b5b1ed95f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "socket2" version = "0.4.10" @@ -2765,6 +4242,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.2.0+1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +dependencies = [ + "bitflags 1.3.2", + "num-traits", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2777,6 +4279,53 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros 0.26.2", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.48", +] + +[[package]] +name = "strum_macros" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.48", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "sum_tree" version = "0.1.0" @@ -2912,6 +4461,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "sysctl" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" +dependencies = [ + "bitflags 2.4.2", + "byteorder", + "enum-as-inner", + "libc", + "thiserror", + "walkdir", +] + [[package]] name = "taffy" version = "0.3.11" @@ -2929,6 +4503,23 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" +[[package]] +name = "tch" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7cb00bc2770454b515388d45be7097a3ded2eca172f3dcdb7ca4cc06c40bf1" +dependencies = [ + "half", + "lazy_static", + "libc", + "ndarray", + "rand", + "safetensors 0.3.3", + "thiserror", + "torch-sys", + "zip", +] + [[package]] name = "tempfile" version = "3.9.0" @@ -2957,9 +4548,20 @@ dependencies = [ name = "termcolor" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "text_placeholder" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512104f982ce6f50def5340f9d7d14cc21f7a859e9ccd251aa19d12e1345c070" dependencies = [ - "winapi-util", + "hashbrown 0.13.2", + "serde", + "serde_json", ] [[package]] @@ -2988,17 +4590,47 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "thread-tree" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbd370cb847953a25954d9f63e14824a36113f8c72eecf6eccef5dc4b45d630" +dependencies = [ + "crossbeam-channel", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" dependencies = [ - "jpeg-decoder", + "jpeg-decoder 0.1.22", "miniz_oxide 0.4.4", "weezl", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder 0.3.1", + "weezl", +] + [[package]] name = "time" version = "0.3.32" @@ -3040,7 +4672,7 @@ dependencies = [ "arrayvec 0.5.2", "bytemuck", "cfg-if", - "png", + "png 0.16.8", "safe_arch", ] @@ -3068,6 +4700,21 @@ dependencies = [ "serde", ] +[[package]] +name = "torch-sys" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29e0244e5b148a31dd7fe961165037d1927754d024095c1013937532d7e73a22" +dependencies = [ + "anyhow", + "cc", + "libc", + "serde", + "serde_json", + "ureq", + "zip", +] + [[package]] name = "tracing" version = "0.1.40" @@ -3080,6 +4727,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.27" @@ -3098,6 +4757,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", ] [[package]] @@ -3110,6 +4770,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "ttf-parser" version = "0.9.0" @@ -3179,6 +4864,43 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +dependencies = [ + "base64 0.21.7", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "rustls-webpki", + "serde", + "serde_json", + "url", + "webpki-roots", +] + [[package]] name = "url" version = "2.5.0" @@ -3196,13 +4918,13 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef8352f317d8f9a918ba5154797fb2a93e2730244041cf7d5be35148266adfa5" dependencies = [ - "base64", + "base64 0.13.1", "data-url", "flate2", "fontdb", "kurbo", "log", - "memmap2", + "memmap2 0.2.3", "pico-args", "rctree", "roxmltree", @@ -3230,7 +4952,7 @@ source = "git+https://github.com/zed-industries/zed#e65a76f0ec7b5e12028d4f0fa0cf dependencies = [ "anyhow", "backtrace", - "dirs", + "dirs 3.0.2", "futures", "globset", "isahc", @@ -3269,8 +4991,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "getrandom", + "rand", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "value-bag" version = "1.7.0" @@ -3366,6 +5095,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.90" @@ -3395,12 +5136,143 @@ version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weezl" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "wgpu" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24" +dependencies = [ + "arrayvec 0.7.4", + "cfg-if", + "flume", + "js-sys", + "log", + "naga", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef91c1d62d1e9e81c79e600131a258edf75c9531cbdbde09c44a011a47312726" +dependencies = [ + "arrayvec 0.7.4", + "bit-vec", + "bitflags 2.4.2", + "codespan-reporting", + "log", + "naga", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle 0.5.2", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84ecc802da3eb67b4cf3dd9ea6fe45bbb47ef13e6c49c5c3240868a9cc6cdd9" +dependencies = [ + "android_system_properties", + "arrayvec 0.7.4", + "ash", + "bit-set", + "bitflags 2.4.2", + "block", + "core-graphics-types", + "d3d12", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.1", + "log", + "metal 0.27.0", + "naga", + "objc", + "once_cell", + "parking_lot 0.12.1", + "profiling", + "range-alloc", + "raw-window-handle 0.5.2", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd" +dependencies = [ + "bitflags 2.4.2", + "js-sys", + "web-sys", +] + [[package]] name = "which" version = "4.4.2" @@ -3413,6 +5285,12 @@ dependencies = [ "rustix 0.38.30", ] +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" @@ -3444,6 +5322,25 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -3594,6 +5491,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + [[package]] name = "xmlparser" version = "0.13.6" @@ -3618,6 +5521,30 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "yoke" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.32" @@ -3637,3 +5564,88 @@ dependencies = [ "quote", "syn 2.0.48", ] + +[[package]] +name = "zerofrom" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index 65f84bc..7cfa768 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,6 @@ log = "0.4.20" catppuccin = "1.4.0" rust-embed = "8.2.0" anyhow = "1.0.80" +fsrs = { git = "https://github.com/open-spaced-repetition/fsrs-rs" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0.114" diff --git a/src/components/deck/deck_list.rs b/src/components/deck/deck_list.rs index cb38de6..231daeb 100644 --- a/src/components/deck/deck_list.rs +++ b/src/components/deck/deck_list.rs @@ -115,7 +115,7 @@ impl RenderOnce for HocListItem { .p_2() .border_1() .rounded_xl() - .on_mouse_down(gpui::MouseButton::Left, move |e, cx| { + .on_mouse_down(gpui::MouseButton::Left, move |_e, cx| { StackableViewState::update( |state, cx| { state.push( diff --git a/src/components/tab_bar_container.rs b/src/components/tab_bar_container.rs index 9f51c3a..0dc6156 100644 --- a/src/components/tab_bar_container.rs +++ b/src/components/tab_bar_container.rs @@ -1,6 +1,6 @@ use std::{cell::RefCell, rc::Rc}; -use gpui::{div, prelude::*, EventEmitter, Render, StyleRefinement, View, WindowContext}; +use gpui::{div, prelude::*, EventEmitter, Render, View, WindowContext}; use crate::theme::Theme; @@ -42,7 +42,7 @@ pub enum TabEvent { impl EventEmitter for TabBarView {} impl Render for TabBarView { - fn render(&mut self, cx: &mut gpui::ViewContext) -> impl IntoElement {} + fn render(&mut self, _cx: &mut gpui::ViewContext) -> impl IntoElement {} } impl RenderOnce for TabBarContainer { diff --git a/src/db.rs b/src/db.rs index 5d2ec49..571a5b8 100644 --- a/src/db.rs +++ b/src/db.rs @@ -22,6 +22,7 @@ pub fn init_db(conn: &Connection) -> Result<()> { interval INTEGER NOT NULL, queue integer NOT NULL, due integer NOT NULL, + data text NOT NULL, FOREIGN KEY(deck_id) REFERENCES decks(id) )", [], diff --git a/src/models/card.rs b/src/models/card.rs new file mode 100644 index 0000000..6ea503f --- /dev/null +++ b/src/models/card.rs @@ -0,0 +1,25 @@ +use crate::{repositories::flash_card::CardQueue, FlashCard}; + +use super::states::{ + card_state::CardState, learning_state::LearningState, new_state::NewState, + review_state::ReviewState, +}; + +pub fn get_current_card_state(card: &FlashCard) -> CardState { + // get due from the card + let due = card.due; + let interval = card.interval; + let ef = card.ease_factor(); + + match *card.get_queue() { + CardQueue::New => NewState {}.into(), + CardQueue::Learning => LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + .into(), + CardQueue::Review => ReviewState {}.into(), + } +} diff --git a/src/models/collection.rs b/src/models/collection.rs index aa145e4..1c1b413 100644 --- a/src/models/collection.rs +++ b/src/models/collection.rs @@ -4,27 +4,18 @@ use gpui::{AppContext, Global}; use crate::{errors::Result, storage::sqlite::SqliteStorage}; -use super::{ - builder::Builder, - queue::{Queue, QueueBuilder}, -}; +use super::{builder::Builder, queue::Queue}; pub struct CollectionBuilder { collection_path: Option, - deck_id: Option, } impl CollectionBuilder { pub fn new(col_path: PathBuf) -> Self { CollectionBuilder { collection_path: Some(col_path), - deck_id: None, } } - - pub fn set_deck_id(&mut self, deck_id: usize) { - self.deck_id = Some(deck_id); - } } impl Builder for CollectionBuilder { diff --git a/src/models/deck.rs b/src/models/deck.rs index a998a1b..464de5c 100644 --- a/src/models/deck.rs +++ b/src/models/deck.rs @@ -7,12 +7,7 @@ pub fn get_decks(conn: &Connection) -> Vec { let decks_res = Deck::get_all_decks(&conn); match decks_res { - Ok(mut decks) => { - decks.iter_mut().for_each(|d| { - d.cards = FlashCard::get_all_cards_in_deck(d.id.unwrap(), &conn, 10).unwrap(); - }); - decks - } + Ok(mut decks) => decks, Err(e) => { eprintln!("Error getting decks: {}", e); vec![] diff --git a/src/models/mod.rs b/src/models/mod.rs index f354bd5..1ae867a 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,4 +1,6 @@ -pub mod deck; +pub mod builder; +pub mod card; pub mod collection; +pub mod deck; pub mod queue; -pub mod builder; +pub mod states; diff --git a/src/models/queue.rs b/src/models/queue.rs index 4f559b6..df202e5 100644 --- a/src/models/queue.rs +++ b/src/models/queue.rs @@ -4,24 +4,37 @@ use rusqlite::Connection; use crate::{errors::Result, repositories::flash_card::CardQueue, FlashCard}; -use super::{builder::Builder, collection::Collection, deck}; +use super::{ + builder::Builder, card::get_current_card_state, collection::Collection, + states::card_state::CardState, +}; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Stats { pub new: usize, pub learning: usize, pub review: usize, } -#[derive(Debug)] +#[derive(Clone)] pub struct Queue { pub stats: Stats, pub core: VecDeque, } -#[derive(Debug, Clone)] +#[derive(Clone)] +pub struct SchedulingStates { + pub current: CardState, + pub again: CardState, + pub hard: CardState, + pub good: CardState, + pub easy: CardState, +} + +#[derive(Clone)] pub struct QueueEntry { pub card_id: u32, + pub states: SchedulingStates, } pub struct QueueBuilder { @@ -46,27 +59,33 @@ impl QueueBuilder { } fn collect_new_cards(&mut self, conn: &Connection) { - FlashCard::for_each_new_card_in_deck(&conn, self.deck_id, CardQueue::New, |card| { + FlashCard::for_each_card_in_deck(&conn, self.deck_id, CardQueue::New, |card| { self.new.push(card.clone()); }) .unwrap_or_else(|e| { println!("Error collecting new cards: {:?}", e); }); - FlashCard::for_each_new_card_in_deck(&conn, self.deck_id, CardQueue::Learning, |card| { + FlashCard::for_each_card_in_deck(&conn, self.deck_id, CardQueue::Learning, |card| { self.learning.push(card.clone()); }) .unwrap_or_else(|e| { println!("Error collecting learning cards: {:?}", e); }); - FlashCard::for_each_new_card_in_deck(&conn, self.deck_id, CardQueue::Review, |card| { + FlashCard::for_each_card_in_deck(&conn, self.deck_id, CardQueue::Review, |card| { self.review.push(card.clone()); }) .unwrap_or_else(|e| { println!("Error collecting learning cards: {:?}", e); }); } + + fn get_scheduling_states(&self, card: &FlashCard) -> SchedulingStates { + let current_state: CardState = get_current_card_state(card); + + current_state.next_states() + } } impl Builder for QueueBuilder { @@ -79,21 +98,18 @@ impl Builder for QueueBuilder { let mut core_queue: VecDeque = VecDeque::new(); - self.review.iter().for_each(|card| { - core_queue.push_back(QueueEntry { - card_id: card.id.unwrap(), - }); - }); + let cards = self + .review + .iter() + .chain(self.learning.iter()) + .chain(self.new.iter()); - self.learning.iter().for_each(|card| { - core_queue.push_back(QueueEntry { - card_id: card.id.unwrap(), - }); - }); + cards.for_each(|card| { + let states = self.get_scheduling_states(card); - self.new.iter().for_each(|card| { core_queue.push_back(QueueEntry { card_id: card.id.unwrap(), + states, }); }); diff --git a/src/models/states/card_state.rs b/src/models/states/card_state.rs new file mode 100644 index 0000000..e1e9cc9 --- /dev/null +++ b/src/models/states/card_state.rs @@ -0,0 +1,29 @@ +use crate::models::queue::SchedulingStates; + +use super::{ + learning_state::LearningState, new_state::NewState, relearning_state::ReLearningState, + review_state::ReviewState, +}; + +#[derive(Clone)] +pub enum CardState { + New(NewState), + Learning(LearningState), + Review(ReviewState), + ReLearning(ReLearningState), +} + +pub trait CardStateTrait { + fn next_states(self) -> SchedulingStates; +} + +impl CardState { + pub fn next_states(self) -> SchedulingStates { + match self { + CardState::New(state) => state.next_states(), + CardState::Learning(state) => state.next_states(), + CardState::Review(state) => state.next_states(), + CardState::ReLearning(state) => state.next_states(), + } + } +} diff --git a/src/models/states/learning_state.rs b/src/models/states/learning_state.rs new file mode 100644 index 0000000..4d17e48 --- /dev/null +++ b/src/models/states/learning_state.rs @@ -0,0 +1,65 @@ +use fsrs::MemoryState; + +use super::card_state::{CardState, CardStateTrait}; +use crate::models::queue::SchedulingStates; + +#[derive(Clone)] +pub struct LearningState { + pub remaining_steps: u32, + pub scheduled_secs: u32, + pub elapsed_secs: u32, + pub memory_state: Option, +} + +impl CardStateTrait for LearningState { + fn next_states(self) -> SchedulingStates { + SchedulingStates { + again: self.answer_again().into(), + hard: self.answer_hard().into(), + good: self.answer_good().into(), + easy: self.answer_easy().into(), + current: self.into(), + } + } +} + +impl LearningState { + fn answer_again(&self) -> LearningState { + LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + } + fn answer_hard(&self) -> LearningState { + LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + } + fn answer_good(&self) -> LearningState { + LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + } + fn answer_easy(&self) -> LearningState { + LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + } +} + +impl Into for LearningState { + fn into(self) -> CardState { + CardState::Learning(self) + } +} diff --git a/src/models/states/mod.rs b/src/models/states/mod.rs new file mode 100644 index 0000000..592828f --- /dev/null +++ b/src/models/states/mod.rs @@ -0,0 +1,5 @@ +pub mod card_state; +pub mod learning_state; +pub mod new_state; +pub mod relearning_state; +pub mod review_state; diff --git a/src/models/states/new_state.rs b/src/models/states/new_state.rs new file mode 100644 index 0000000..5e55821 --- /dev/null +++ b/src/models/states/new_state.rs @@ -0,0 +1,32 @@ +use crate::models::queue::SchedulingStates; + +use super::{ + card_state::{CardState, CardStateTrait}, + learning_state::LearningState, +}; + +#[derive(Clone)] +pub struct NewState {} + +impl CardStateTrait for NewState { + fn next_states(self) -> SchedulingStates { + let next_state = LearningState { + remaining_steps: 0, + scheduled_secs: 0, + elapsed_secs: 0, + memory_state: None, + } + .next_states(); + + SchedulingStates { + current: self.into(), + ..next_state + } + } +} + +impl Into for NewState { + fn into(self) -> CardState { + CardState::New(self) + } +} diff --git a/src/models/states/relearning_state.rs b/src/models/states/relearning_state.rs new file mode 100644 index 0000000..9c09293 --- /dev/null +++ b/src/models/states/relearning_state.rs @@ -0,0 +1,12 @@ +use crate::models::queue::SchedulingStates; + +use super::card_state::CardStateTrait; + +#[derive(Clone)] +pub struct ReLearningState {} + +impl CardStateTrait for ReLearningState { + fn next_states(self) -> SchedulingStates { + todo!() + } +} diff --git a/src/models/states/review_state.rs b/src/models/states/review_state.rs new file mode 100644 index 0000000..f96e57d --- /dev/null +++ b/src/models/states/review_state.rs @@ -0,0 +1,18 @@ +use crate::models::queue::SchedulingStates; + +use super::card_state::{CardState, CardStateTrait}; + +#[derive(Clone)] +pub struct ReviewState {} + +impl CardStateTrait for ReviewState { + fn next_states(self) -> SchedulingStates { + todo!() + } +} + +impl Into for ReviewState { + fn into(self) -> CardState { + CardState::Review(self) + } +} diff --git a/src/repositories/card_data.rs b/src/repositories/card_data.rs new file mode 100644 index 0000000..600712a --- /dev/null +++ b/src/repositories/card_data.rs @@ -0,0 +1,77 @@ +use fsrs::MemoryState; +use rusqlite::types::{FromSql, ValueRef}; + +use serde::Deserialize; +use serde::Deserializer; +use serde::Serialize; +use serde_json::Value; + +pub(crate) fn default_on_invalid<'de, T, D>(deserializer: D) -> Result +where + T: Default + Deserialize<'de>, + D: Deserializer<'de>, +{ + let v: Value = Deserialize::deserialize(deserializer)?; + Ok(T::deserialize(v).unwrap_or_default()) +} + +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct CardData { + #[serde( + rename = "pos", + skip_serializing_if = "Option::is_none", + deserialize_with = "default_on_invalid" + )] + pub(crate) original_position: Option, + + #[serde( + rename = "s", + skip_serializing_if = "Option::is_none", + deserialize_with = "default_on_invalid" + )] + pub(crate) fsrs_stability: Option, + + #[serde( + rename = "d", + skip_serializing_if = "Option::is_none", + deserialize_with = "default_on_invalid" + )] + pub(crate) fsrs_difficulty: Option, + + #[serde( + rename = "dr", + skip_serializing_if = "Option::is_none", + deserialize_with = "default_on_invalid" + )] + pub(crate) fsrs_desired_retention: Option, + + #[serde(default, rename = "cd", skip_serializing_if = "meta_is_empty")] + pub(crate) custom_data: String, +} + +fn meta_is_empty(s: &str) -> bool { + matches!(s, "" | "{}") +} + +impl FromSql for CardData { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + if let ValueRef::Text(s) = value { + Ok(serde_json::from_slice(s).unwrap_or_default()) + } else { + Ok(Self::default()) + } + } +} + +impl CardData { + pub fn memory_state(&self) -> Option { + if let Some(stability) = self.fsrs_stability { + return Some(MemoryState { + stability: stability, + difficulty: self.fsrs_difficulty.unwrap_or_default(), + }); + } + None + } +} diff --git a/src/repositories/flash_card.rs b/src/repositories/flash_card.rs index cc1222f..007a7ed 100644 --- a/src/repositories/flash_card.rs +++ b/src/repositories/flash_card.rs @@ -1,6 +1,7 @@ use std::time::{Duration, SystemTime}; use chrono::{DateTime, Utc}; +use fsrs::MemoryState; use rusqlite::{ params, types::{FromSql, ValueRef}, @@ -9,6 +10,8 @@ use rusqlite::{ use time::OffsetDateTime; +use super::card_data::CardData; + #[derive(PartialEq, Debug, Clone)] pub enum Status { New, @@ -16,7 +19,7 @@ pub enum Status { Due, } -#[derive(Clone)] +#[derive(Debug, Clone)] pub enum CardQueue { New = 0, Learning = 1, @@ -47,9 +50,11 @@ pub struct FlashCard { creation_time: SystemTime, last_studied_time: Option, ef: f32, - interval: f64, - due: i32, + pub interval: f64, + pub due: i32, queue: CardQueue, + data: CardData, + memory_state: Option, } impl FlashCard { @@ -65,6 +70,14 @@ impl FlashCard { interval: 1.0, due: 0, queue: CardQueue::New, + data: CardData { + original_position: None, + fsrs_stability: None, + fsrs_difficulty: None, + fsrs_desired_retention: None, + custom_data: String::from("{}"), + }, + memory_state: None, } } @@ -84,78 +97,15 @@ impl FlashCard { self.queue = queue; } - /// Retrieves all cards in the specified deck from the database. - /// - /// # Arguments - /// - /// * `deck_id` - The ID of the deck to retrieve cards from. - /// * `conn` - The database connection. - /// - /// # Returns - /// - /// A `Result` containing a vector of `FlashCard` instances. - pub fn get_all_cards_in_deck( - deck_id: u32, - conn: &Connection, - limit: i16, - ) -> Result> { - let mut stmt = conn.prepare("SELECT id, question, answer, creation_time, last_studied_time, ef, interval, due, queue FROM cards WHERE deck_id = ?")?; - let card_iter = stmt.query_map(&[&deck_id.to_string()], |row| { - let creation_time: String = row.get(3)?; - let creation_time = DateTime::parse_from_rfc3339(&creation_time) - .unwrap() - .naive_utc(); - let creation_time = OffsetDateTime::from_unix_timestamp(creation_time.timestamp()) - .unwrap() - .into(); - - let last_studied_time: Result = row.get(4); - - let last_studied_time = if let Ok(last_studied_time) = last_studied_time { - let last_studied_time = DateTime::parse_from_rfc3339(&last_studied_time); - - match last_studied_time { - Ok(last_studied_time) => { - let last_studied_time = last_studied_time.naive_utc(); - let last_studied_time = - OffsetDateTime::from_unix_timestamp(last_studied_time.timestamp()) - .unwrap() - .into(); - - Some(last_studied_time) - } - Err(e) => { - println!("Error parsing last_studied_time: {}", e); - None - } - } - } else { - None - }; - - Ok(FlashCard { - id: Some(row.get(0)?), - deck_id, - question: row.get(1)?, - answer: row.get(2)?, - creation_time, - last_studied_time, - ef: row.get(5)?, - interval: row.get(6)?, - due: row.get(7).ok().unwrap_or_default(), - queue: row.get(8)?, - }) - })?; - - let mut cards = Vec::new(); - for card in card_iter { - cards.push(card?); - } + pub fn get_queue(&self) -> &CardQueue { + &self.queue + } - Ok(cards) + pub fn ease_factor(&self) -> f32 { + (self.ef as f32) / 1000.0 } - pub fn for_each_new_card_in_deck( + pub fn for_each_card_in_deck( conn: &Connection, deck_id: u32, queue: CardQueue, @@ -206,6 +156,8 @@ impl FlashCard { None }; + let card_data: CardData = row.get(10)?; + let card = FlashCard { id: Some(row.get(0)?), deck_id: row.get(1)?, @@ -217,6 +169,8 @@ impl FlashCard { interval: row.get(7)?, due: row.get(8)?, queue: row.get(9)?, + memory_state: card_data.memory_state(), + data: card_data, }; func(&card); @@ -236,9 +190,7 @@ impl FlashCard { /// /// A `Result` containing the loaded card, or an error if the operation fails. pub fn load(id: u32, conn: &Connection) -> Result { - let mut stmt = conn.prepare( - "SELECT id, deck_id, question, answer, creation_time, last_studied_time, ef, interval, queue, due FROM cards WHERE id = ?" - )?; + let mut stmt = conn.prepare(include_str!("get_card.sql"))?; let deck = stmt.query_row(&[&id], |row| { let creation_time: String = row.get(4)?; @@ -265,6 +217,8 @@ impl FlashCard { None }; + let data: CardData = row.get(10)?; + Ok(FlashCard { id: Some(row.get(0)?), deck_id: row.get(1)?, @@ -276,6 +230,8 @@ impl FlashCard { interval: row.get(7)?, due: row.get(8).ok().unwrap_or_default(), queue: row.get(9)?, + memory_state: data.memory_state(), + data, }) })?; @@ -397,26 +353,6 @@ mod test { use super::*; - #[test] - fn get_all_cards_in_deck() { - let conn = Connection::open_in_memory().unwrap(); - init_db(&conn).unwrap(); - - let mut deck = Deck::new("Test Deck"); - deck.save(&conn).unwrap(); - - let mut card = FlashCard::new( - deck.id.unwrap(), - "What is the capital of France?", - "Paris", - None, - ); - card.save(&conn).unwrap(); - - let cards = FlashCard::get_all_cards_in_deck(deck.id.unwrap(), &conn, 10).unwrap(); - assert_eq!(cards.len(), 1); - } - #[test] fn load() { let conn = Connection::open_in_memory().unwrap(); @@ -474,9 +410,6 @@ mod test { card.save(&conn).unwrap(); card.delete(&conn).unwrap(); - - let cards = FlashCard::get_all_cards_in_deck(deck.id.unwrap(), &conn, 10).unwrap(); - assert_eq!(cards.len(), 0); } #[test] diff --git a/src/repositories/get_card.sql b/src/repositories/get_card.sql new file mode 100644 index 0000000..f3dc266 --- /dev/null +++ b/src/repositories/get_card.sql @@ -0,0 +1,16 @@ +SELECT + id, + deck_id, + question, + answer, + creation_time, + last_studied_time, + ef, + interval, + queue, + due, + data +FROM + cards +WHERE + id = ? diff --git a/src/repositories/mod.rs b/src/repositories/mod.rs index 639490c..e4e67c0 100644 --- a/src/repositories/mod.rs +++ b/src/repositories/mod.rs @@ -1,2 +1,3 @@ -pub mod flash_card; +pub mod card_data; pub mod deck; +pub mod flash_card; diff --git a/src/repositories/query_cards_in_deck.sql b/src/repositories/query_cards_in_deck.sql new file mode 100644 index 0000000..2dc2ae1 --- /dev/null +++ b/src/repositories/query_cards_in_deck.sql @@ -0,0 +1,15 @@ +SELECT + id, + question, + answer, + creation_time, + last_studied_time, + ef, + interval, + due, + queue, + data +FROM + cards +WHERE + deck_id = ? diff --git a/src/repositories/query_cards_in_deck_by_queue.sql b/src/repositories/query_cards_in_deck_by_queue.sql index 16aa6b8..e90c20f 100644 --- a/src/repositories/query_cards_in_deck_by_queue.sql +++ b/src/repositories/query_cards_in_deck_by_queue.sql @@ -1,16 +1,17 @@ SELECT - id, + id, deck_id, - question, - answer, - creation_time, - last_studied_time, - ef, - interval, - due, - queue + question, + answer, + creation_time, + last_studied_time, + ef, + interval, + due, + queue, + data FROM - cards + cards WHERE - deck_id = ? - AND queue = ? + deck_id = ? + AND queue = ?