diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 9f2b2b7..34a6d91 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -83,7 +92,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -92,6 +101,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.6.2", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" @@ -201,7 +225,7 @@ checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -211,7 +235,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" dependencies = [ "serde", - "toml 0.7.3", + "toml 0.7.5", ] [[package]] @@ -248,9 +272,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70d3ad08698a0568b0562f22710fe6bfc1f4a61a367c77d0398c562eadd453a" +checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" dependencies = [ "smallvec", "target-lexicon", @@ -359,21 +383,20 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" dependencies = [ "bitflags", "core-foundation", - "foreign-types", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] @@ -410,22 +433,22 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset 0.8.0", + "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -464,7 +487,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -477,12 +500,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - [[package]] name = "darling" version = "0.20.1" @@ -504,7 +521,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -515,7 +532,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -624,7 +641,7 @@ checksum = "80663502655af01a2902dff3f06869330782267924bf1788410b74edcd93770a" dependencies = [ "cc", "rustc_version", - "toml 0.7.3", + "toml 0.7.5", "vswhom", "winreg", ] @@ -644,6 +661,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + [[package]] name = "errno" version = "0.3.1" @@ -689,7 +712,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version", ] @@ -706,6 +729,7 @@ dependencies = [ "sysinfo", "tauri", "tauri-build", + "tokio", "walkdir", ] @@ -728,7 +752,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.7.1", ] [[package]] @@ -820,7 +844,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -900,7 +924,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -917,7 +941,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -931,7 +955,7 @@ dependencies = [ "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -943,15 +967,15 @@ dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", "x11", ] [[package]] name = "generator" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e123d9ae7c02966b4d892e550bdc32164f05853cd40ab570650ad600596a8a" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ "cc", "libc", @@ -992,6 +1016,12 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "gio" version = "0.15.12" @@ -1018,7 +1048,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", "winapi", ] @@ -1064,7 +1094,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1094,7 +1124,7 @@ checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1135,7 +1165,7 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1158,6 +1188,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "heck" version = "0.3.3" @@ -1173,15 +1209,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.1" @@ -1276,11 +1303,10 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" dependencies = [ - "crossbeam-utils", "globset", "lazy_static", "log", @@ -1312,10 +1338,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "infer" version = "0.12.0" @@ -1360,7 +1396,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys 0.48.0", ] @@ -1422,9 +1458,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -1481,9 +1517,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.146" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "line-wrap" @@ -1583,20 +1619,20 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ "autocfg", ] [[package]] -name = "memoffset" -version = "0.9.0" +name = "miniz_oxide" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ - "autocfg", + "adler", ] [[package]] @@ -1730,11 +1766,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] @@ -1759,15 +1795,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "objc" version = "0.2.7" @@ -1796,6 +1823,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.30.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -1846,7 +1882,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1869,7 +1905,7 @@ dependencies = [ "libc", "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -2007,7 +2043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" dependencies = [ "base64 0.21.2", - "indexmap", + "indexmap 1.9.3", "line-wrap", "quick-xml", "serde", @@ -2024,7 +2060,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.7.1", ] [[package]] @@ -2081,9 +2117,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] @@ -2099,9 +2135,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -2189,12 +2225,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" -dependencies = [ - "cty", -] +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" @@ -2279,6 +2312,12 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -2387,14 +2426,14 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ "itoa 1.0.6", "ryu", @@ -2409,28 +2448,28 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] name = "serde_spanned" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" dependencies = [ "serde", ] [[package]] name = "serde_with" -version = "2.3.3" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" dependencies = [ - "base64 0.13.1", + "base64 0.21.2", "chrono", "hex", - "indexmap", + "indexmap 1.9.3", "serde", "serde_json", "serde_with_macros", @@ -2439,14 +2478,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "2.3.3" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -2483,9 +2522,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -2501,6 +2540,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.5" @@ -2528,6 +2576,16 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "soup2" version = "0.2.1" @@ -2616,9 +2674,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" dependencies = [ "proc-macro2", "quote", @@ -2655,14 +2713,14 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.1.0" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fa6fb9ee296c0dc2df41a656ca7948546d061958115ddb0bcaae43ad0d17d2" +checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" dependencies = [ - "cfg-expr 0.15.2", + "cfg-expr 0.15.3", "heck 0.4.1", "pkg-config", - "toml 0.7.3", + "toml 0.7.5", "version-compare 0.1.1", ] @@ -2737,15 +2795,15 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac" [[package]] name = "tauri" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d42ba3a2e8556722f31336a0750c10dbb6a81396a1c452977f515da83f69f842" +checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" dependencies = [ "anyhow", "cocoa", @@ -2790,9 +2848,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929b3bd1248afc07b63e33a6a53c3f82c32d0b0a5e216e4530e94c467e019389" +checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" dependencies = [ "anyhow", "cargo_toml", @@ -2803,14 +2861,13 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "winnow", ] [[package]] name = "tauri-codegen" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a2105f807c6f50b2fa2ce5abd62ef207bc6f14c9fcc6b8caec437f6fb13bde" +checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" dependencies = [ "base64 0.21.2", "brotli", @@ -2834,9 +2891,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8784cfe6f5444097e93c69107d1ac5e8f13d02850efa8d8f2a40fe79674cef46" +checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -2848,9 +2905,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b80ea3fcd5fefb60739a3b577b277e8fc30434538a2f5bba82ad7d4368c422" +checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" dependencies = [ "gtk", "http", @@ -2869,9 +2926,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1c396950b1ba06aee1b4ffe6c7cd305ff433ca0e30acbc5fa1a2f92a4ce70f1" +checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" dependencies = [ "cocoa", "gtk", @@ -2889,12 +2946,13 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6f9c2dafef5cbcf52926af57ce9561bd33bb41d7394f8bb849c0330260d864" +checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" dependencies = [ "brotli", "ctor", + "dunce", "glob", "heck 0.4.1", "html5ever", @@ -2922,7 +2980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.3", + "toml 0.7.5", ] [[package]] @@ -2973,7 +3031,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -2988,14 +3046,29 @@ dependencies = [ [[package]] name = "time" -version = "0.3.15" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ "itoa 1.0.6", - "libc", - "num_threads", "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", ] [[package]] @@ -3015,17 +3088,35 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "374442f06ee49c3a28a8fc9f01a2596fed7559c6b99b31279c3261778e77d84f" dependencies = [ "autocfg", + "backtrace", "bytes", + "libc", + "mio", "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", "windows-sys 0.48.0", ] +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.22", +] + [[package]] name = "toml" version = "0.5.11" @@ -3037,9 +3128,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" dependencies = [ "serde", "serde_spanned", @@ -3049,20 +3140,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" dependencies = [ - "indexmap", + "indexmap 2.0.0", "serde", "serde_spanned", "toml_datetime", @@ -3083,13 +3174,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -3193,9 +3284,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.3.3" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" +checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" dependencies = [ "getrandom 0.2.10", ] @@ -3268,9 +3359,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3278,24 +3369,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3303,22 +3394,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "webkit2gtk" @@ -3364,7 +3455,7 @@ dependencies = [ "pango-sys", "pkg-config", "soup2-sys", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -3456,7 +3547,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -3515,7 +3606,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -3535,9 +3626,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm 0.48.0", "windows_aarch64_msvc 0.48.0", @@ -3670,9 +3761,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" dependencies = [ "memchr", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e21b6a1..bbf459a 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,6 +22,7 @@ fuzzy-matcher = "*" rayon = "1.7.0" dirs = "5.0.1" notify = "6.0.1" +tokio = { version = "1.28.2", features = ["full"] } [features] # this feature is used for production builds or when `devPath` points to the filesystem diff --git a/src-tauri/src/filesystem/cache.rs b/src-tauri/src/filesystem/cache.rs new file mode 100644 index 0000000..3157e41 --- /dev/null +++ b/src-tauri/src/filesystem/cache.rs @@ -0,0 +1,156 @@ +use crate::{AppState, CachedPath, StateSafe, VolumeCache}; +use std::{fs}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::sync::{Arc, MutexGuard}; +use std::time::Duration; +use notify::{Event}; +use notify::event::{CreateKind, ModifyKind, RenameMode}; +use tokio::time; +use crate::filesystem::{DIRECTORY, FILE}; + +pub const CACHE_FILE_PATH: &str = "./system_cache.json"; + +/// Handles filesystem events, currently intended for cache invalidation. +pub struct FsEventHandler { + state_mux: StateSafe, + mountpoint: PathBuf, +} + +impl FsEventHandler { + pub fn new(state_mux: StateSafe, mountpoint: PathBuf) -> Self { + Self { state_mux, mountpoint } + } + + /// Gets the current volume from the cache + fn get_from_cache<'a>(&self, state: &'a mut AppState) -> &'a mut VolumeCache { + let mountpoint = self.mountpoint.to_string_lossy().to_string(); + + state.system_cache.get_mut(&mountpoint) + .unwrap_or_else(|| panic!("Failed to find mountpoint '{:?}' in cache.", self.mountpoint)) + } + + pub fn handle_create(&self, kind: CreateKind, path: &Path) { + let state = &mut self.state_mux.lock().unwrap(); + let current_volume = self.get_from_cache(state); + + let filename = path.file_name().unwrap().to_string_lossy().to_string(); + let file_type = match kind { + CreateKind::File => FILE, + CreateKind::Folder => DIRECTORY, + _ => return, // Other options are weird lol + }.to_string(); + + let file_path = path.to_string_lossy().to_string(); + current_volume.entry(filename).or_insert(vec![CachedPath{file_path, file_type}]); + } + + pub fn handle_delete(&self, path: &Path) { + let state = &mut self.state_mux.lock().unwrap(); + let current_volume = self.get_from_cache(state); + + let filename = path.file_name().unwrap().to_string_lossy().to_string(); + current_volume.remove(&filename); + } + + /// Removes file from cache, when `handle_rename_to` is called a new file is added to the cache in place. + pub fn handle_rename_from(&mut self, old_path: &Path) { + let state = &mut self.state_mux.lock().unwrap(); + let current_volume = self.get_from_cache(state); + + let old_path_string= old_path.to_string_lossy().to_string(); + let old_filename = old_path.file_name().unwrap().to_string_lossy().to_string(); + + let empty_vec = &mut Vec::new(); + let cached_paths = current_volume.get_mut(&old_filename).unwrap_or(empty_vec); + + // If there is only one item in the cached paths, this means it can only be the renamed file and therefore it should be removed from the hashmap + if cached_paths.len() <= 1 { + current_volume.remove(&old_filename); + return; + } + + cached_paths.retain(|path| path.file_path != old_path_string); + } + + /// Adds new file name & path to cache. + pub fn handle_rename_to(&self, new_path: &Path) { + let state = &mut self.state_mux.lock().unwrap(); + let current_volume = self.get_from_cache(state); + + let filename = new_path.file_name().unwrap().to_string_lossy().to_string(); + let file_type = if new_path.is_dir() { DIRECTORY } else { FILE }; + + let path_string = new_path.to_string_lossy().to_string(); + current_volume.entry(filename).or_insert(vec![CachedPath{file_path: path_string, file_type: String::from(file_type)}]); + } + + pub fn handle_event(&mut self, event: Event) { + let paths = event.paths; + + match event.kind { + notify::EventKind::Modify(modify_kind) => { + if modify_kind == ModifyKind::Name(RenameMode::From) { + self.handle_rename_from(&paths[0]); + } else if modify_kind == ModifyKind::Name(RenameMode::To) { + self.handle_rename_to(&paths[0]); + } + }, + notify::EventKind::Create(kind) => self.handle_create(kind, &paths[0]), + notify::EventKind::Remove(_) => self.handle_delete(&paths[0]), + _ => (), + } + } +} + +/// Starts a constant interval loop where the cache is updated every ~30 seconds. +pub fn run_cache_interval(state_mux: &StateSafe) { + let state_clone = Arc::clone(state_mux); + + tokio::spawn(async move { // We use tokio spawn because async closures with std spawn is unstable + let mut interval = time::interval(Duration::from_secs(30)); + interval.tick().await; // Wait 30 seconds before doing first re-cache + + loop { + interval.tick().await; + + let guard = &mut state_clone.lock().unwrap(); + save_to_cache(guard); + } + }); +} + +/// This takes in an Arc> and calls `save_to_cache` after locking it. +pub fn save_system_cache(state_mux: &StateSafe) { + let state = &mut state_mux.lock().unwrap(); + save_to_cache(state); +} + +/// Gets the cache from the state (in memory), encodes and saves it to the cache file path. +/// This needs optimising. +fn save_to_cache(state: &mut MutexGuard) { + let serialized_cache = serde_json::to_string(&state.system_cache).unwrap(); + + let mut file = fs::OpenOptions::new() + .write(true) + .truncate(true) + .open(CACHE_FILE_PATH) + .unwrap(); + + file.write_all(serialized_cache.as_bytes()).unwrap(); +} + +/// Reads and decodes the cache file and stores it in memory for quick access. +/// Returns false if the cache was unable to deserialize. +pub fn load_system_cache(state_mux: &StateSafe) -> bool { + let state = &mut state_mux.lock().unwrap(); + let file_contents = fs::read_to_string(CACHE_FILE_PATH).unwrap(); + + let deserialize_result = serde_json::from_str(&file_contents); + if let Ok(system_cache) = deserialize_result { + state.system_cache = system_cache; + return true; + } + + false +} \ No newline at end of file diff --git a/src-tauri/src/filesystem/mod.rs b/src-tauri/src/filesystem/mod.rs new file mode 100644 index 0000000..e146fe2 --- /dev/null +++ b/src-tauri/src/filesystem/mod.rs @@ -0,0 +1,37 @@ +pub mod cache; +pub mod volume; + +use std::fs::{read_dir}; +use crate::filesystem::volume::DirectoryChild; + +pub const DIRECTORY: &str = "directory"; +pub const FILE: &str = "file"; + +pub const fn bytes_to_gb(bytes: u64) -> u16 { (bytes / (1e+9 as u64)) as u16 } + +/// Searches and returns the files in a given directory. This is not recursive. +#[tauri::command] +pub fn open_directory(path: String) -> Vec { + let mut dir_children = Vec::new(); + + let Ok(directory) = read_dir(path) else { + return dir_children; + }; + + for entry in directory { + let entry = entry.unwrap(); + + let file_name = entry.file_name().to_str().unwrap().to_string(); + let entry_is_file = entry.file_type().unwrap().is_file(); + let entry = entry.path().to_str().unwrap().to_string(); + + if entry_is_file { + dir_children.push(DirectoryChild::File(file_name, entry)); + continue; + } + + dir_children.push(DirectoryChild::Directory(file_name, entry)); + } + + dir_children +} diff --git a/src-tauri/src/filesystem.rs b/src-tauri/src/filesystem/volume.rs similarity index 68% rename from src-tauri/src/filesystem.rs rename to src-tauri/src/filesystem/volume.rs index 2ee0aed..4b388c4 100644 --- a/src-tauri/src/filesystem.rs +++ b/src-tauri/src/filesystem/volume.rs @@ -2,20 +2,17 @@ use crate::{CachedPath, StateSafe}; use rayon::prelude::*; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use std::fs; -use std::fs::{read_dir, File}; -use std::io::Write; -use std::path::PathBuf; +use std::{fs, thread}; +use std::fs::{File}; +use std::path::{PathBuf}; use std::sync::{Arc, Mutex}; use sysinfo::{Disk, DiskExt, System, SystemExt}; -use tauri::State; +use tauri::{State}; use walkdir::WalkDir; - -const CACHE_FILE_PATH: &str = "./system_cache.json"; - -const fn bytes_to_gb(bytes: u64) -> u16 { - (bytes / (1e+9 as u64)) as u16 -} +use notify::{Watcher, RecursiveMode}; +use tokio::task::block_in_place; +use crate::filesystem::{bytes_to_gb, DIRECTORY, FILE}; +use crate::filesystem::cache::{CACHE_FILE_PATH, FsEventHandler, load_system_cache, run_cache_interval, save_system_cache}; #[derive(Serialize)] pub struct Volume { @@ -94,7 +91,7 @@ impl Volume { true => "Local Volume", false => volume_name, } - .to_string() + .to_string() }; let mountpoint = disk.mount_point().to_path_buf(); @@ -131,12 +128,8 @@ impl Volume { let file_path = entry.path().to_string_lossy().to_string(); let walkdir_filetype = entry.file_type(); - let file_type = if walkdir_filetype.is_dir() { - "directory" - } else { - "file" - } - .to_string(); + let file_type = if walkdir_filetype.is_dir() { DIRECTORY } else { FILE } + .to_string(); let cache_guard = &mut system_cache.lock().unwrap(); cache_guard @@ -148,6 +141,27 @@ impl Volume { }); }); } + + fn watch_changes(&self, state_mux: &StateSafe) { + let mut fs_event_manager = FsEventHandler::new(state_mux.clone(), self.mountpoint.clone()); + + let mut watcher = notify::recommended_watcher(move |res| { + match res { + Ok(event) => fs_event_manager.handle_event(event), + Err(e) => panic!("Failed to handle event: {:?}", e), + } + }).unwrap(); + + let path = self.mountpoint.clone(); + + thread::spawn(move || { + watcher.watch(&path, RecursiveMode::Recursive).unwrap(); + + block_in_place(|| loop { + thread::park(); + }) + }); + } } #[derive(Serialize, Deserialize, Clone)] @@ -156,26 +170,6 @@ pub enum DirectoryChild { Directory(String, String), } -/// Gets the cache from the state (in memory), encodes and saves it to the cache file path. -/// This needs optimising. -pub fn save_system_cache(state_mux: &StateSafe) { - let state = &mut state_mux.lock().unwrap(); - let serialized_cache = serde_json::to_string(&state.system_cache).unwrap(); - - let mut file = fs::OpenOptions::new() - .write(true) - .open(CACHE_FILE_PATH) - .unwrap(); - file.write_all(serialized_cache.as_bytes()).unwrap(); -} - -/// Reads and decodes the cache file and stores it in memory for quick access. -pub fn load_system_cache(state_mux: &StateSafe) { - let state = &mut state_mux.lock().unwrap(); - let file_contents = fs::read_to_string(CACHE_FILE_PATH).unwrap(); - state.system_cache = serde_json::from_str(&file_contents).unwrap(); -} - /// Gets list of volumes and returns them. /// If there is a cache stored on volume it is loaded. /// If there is no cache stored on volume, one is created as well as stored in memory. @@ -186,9 +180,9 @@ pub fn get_volumes(state_mux: State) -> Vec { let mut sys = System::new_all(); sys.refresh_all(); - let cache_exists = fs::metadata(CACHE_FILE_PATH).is_ok(); + let mut cache_exists = fs::metadata(CACHE_FILE_PATH).is_ok(); if cache_exists { - load_system_cache(&state_mux); + cache_exists = load_system_cache(&state_mux); } else { File::create(CACHE_FILE_PATH).unwrap(); } @@ -200,37 +194,12 @@ pub fn get_volumes(state_mux: State) -> Vec { volume.create_cache(&state_mux); } + volume.watch_changes(&state_mux); volumes.push(volume); } save_system_cache(&state_mux); + run_cache_interval(&state_mux); volumes } - -/// Searches and returns the files in a given directory. This is not recursive. -#[tauri::command] -pub fn open_directory(path: String) -> Vec { - let mut dir_children = Vec::new(); - - let Ok(directory) = read_dir(path) else { - return dir_children; - }; - - for entry in directory { - let entry = entry.unwrap(); - - let file_name = entry.file_name().to_str().unwrap().to_string(); - let entry_is_file = entry.file_type().unwrap().is_file(); - let entry = entry.path().to_str().unwrap().to_string(); - - if entry_is_file { - dir_children.push(DirectoryChild::File(file_name, entry)); - continue; - } - - dir_children.push(DirectoryChild::Directory(file_name, entry)); - } - - dir_children -} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ef21315..8c48c3a 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -4,7 +4,8 @@ mod filesystem; mod search; -use filesystem::{get_volumes, open_directory}; +use filesystem::open_directory; +use filesystem::volume::get_volumes; use search::search_directory; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -25,7 +26,8 @@ pub struct AppState { pub type StateSafe = Arc>; -fn main() { +#[tokio::main] +async fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![ get_volumes, @@ -35,5 +37,4 @@ fn main() { .manage(Arc::new(Mutex::new(AppState::default()))) .run(tauri::generate_context!()) .expect("error while running tauri application"); -} - +} \ No newline at end of file diff --git a/src-tauri/src/search.rs b/src-tauri/src/search.rs index c45cee0..8ee379a 100644 --- a/src-tauri/src/search.rs +++ b/src-tauri/src/search.rs @@ -1,10 +1,10 @@ -use crate::filesystem::DirectoryChild; use crate::StateSafe; use fuzzy_matcher::skim::SkimMatcherV2; use fuzzy_matcher::FuzzyMatcher; use std::path::Path; use std::time::Instant; use tauri::State; +use crate::filesystem::volume::DirectoryChild; const MINIMUM_SCORE: i16 = 20; diff --git a/src/App.tsx b/src/App.tsx index 939a820..79f8cbc 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -56,7 +56,7 @@ function App() { } async function getVolumes() { - if (volumes.length != 0) { + if (volumes.length > 0) { return; } @@ -64,22 +64,23 @@ function App() { setVolumes(newVolumes); } - async function updateCurrentDirectory() { - if (pathHistory[historyPlace] == "") { - return getVolumes(); + let render = 0; + + useEffect(() => { + if (render === 0) { + getVolumes().catch(console.error); } - await updateDirectoryContents(); - } + render += 1; // I don't know why but the use effect runs twice causing the "get_volumes" to be called twice. + }, []) useEffect(() => { if (pathHistory[historyPlace] == "") { - getVolumes().catch(console.error); setCurrentVolume(""); return; } - updateCurrentDirectory(); + updateDirectoryContents().catch(console.error); }, [historyPlace]); return (