diff --git a/Cargo.lock b/Cargo.lock index 615d2bfd..50af9f50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -351,7 +351,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap 2.10.0", + "indexmap", "lexical-core", "memchr", "num", @@ -423,56 +423,6 @@ dependencies = [ "regex-syntax 0.8.5", ] -[[package]] -name = "ashpd" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" -dependencies = [ - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.8.5", - "serde", - "serde_repr", - "tokio", - "url", - "zbus 4.4.0", -] - -[[package]] -name = "ashpd" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" -dependencies = [ - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "raw-window-handle 0.6.2", - "serde", - "serde_repr", - "tokio", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus 5.9.0", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - [[package]] name = "async-channel" version = "2.5.0" @@ -502,53 +452,6 @@ dependencies = [ "zstd-safe", ] -[[package]] -name = "async-io" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.0.8", - "slab", - "windows-sys 0.60.2", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix 1.0.8", -] - [[package]] name = "async-recursion" version = "1.1.1" @@ -560,24 +463,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "async-signal" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.0.8", - "signal-hook-registry", - "slab", - "windows-sys 0.60.2", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -600,12 +485,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.89" @@ -617,29 +496,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "atk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "atoi" version = "2.0.0" @@ -1077,7 +933,7 @@ dependencies = [ "http-body 0.4.6", "http-body 1.0.1", "http-body-util", - "itoa 1.0.15", + "itoa", "num-integer", "pin-project-lite", "pin-utils", @@ -1126,7 +982,7 @@ dependencies = [ "http-body-util", "hyper 1.7.0", "hyper-util", - "itoa 1.0.15", + "itoa", "matchit", "memchr", "mime", @@ -1186,15 +1042,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" -[[package]] -name = "base62" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10e52a7bcb1d6beebee21fb5053af9e3cbb7a7ed1a4909e534040e676437ab1f" -dependencies = [ - "rustversion", -] - [[package]] name = "base64" version = "0.21.7" @@ -1270,9 +1117,6 @@ name = "bitflags" version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" -dependencies = [ - "serde", -] [[package]] name = "blake2" @@ -1296,12 +1140,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -1320,37 +1158,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "block2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" -dependencies = [ - "objc2 0.6.2", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - [[package]] name = "brotli" version = "7.0.0" @@ -1393,16 +1200,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "bumpalo" version = "3.19.0" @@ -1474,31 +1271,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.9.2", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.69", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - [[package]] name = "camino" version = "1.1.11" @@ -1565,12 +1337,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cexpr" version = "0.6.0" @@ -1580,27 +1346,6 @@ dependencies = [ "nom 7.1.3", ] -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" version = "1.0.1" @@ -1659,7 +1404,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ "chrono", - "phf 0.12.1", + "phf", ] [[package]] @@ -1708,7 +1453,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.8", + "libloading", ] [[package]] @@ -1739,7 +1484,7 @@ version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.106", @@ -1760,81 +1505,12 @@ dependencies = [ "cc", ] -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" -dependencies = [ - "bitflags 2.9.2", - "block", - "cocoa-foundation 0.2.1", - "core-foundation 0.10.1", - "core-graphics 0.24.0", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" -dependencies = [ - "bitflags 2.9.2", - "block", - "core-foundation 0.10.1", - "core-graphics-types 0.2.0", - "objc", -] - [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - [[package]] name = "comfy-table" version = "7.1.4" @@ -1854,16 +1530,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - [[package]] name = "const-oid" version = "0.9.6" @@ -1896,27 +1562,6 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "const-serialize" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08259976d62c715c4826cb4a3d64a3a9e5c5f68f964ff6087319857f569f93a6" -dependencies = [ - "const-serialize-macro", - "serde", -] - -[[package]] -name = "const-serialize-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04382d0d9df7434af6b1b49ea1a026ef39df1b0738b1cc373368cf175354f6eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "const-str" version = "0.6.4" @@ -1963,21 +1608,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -2004,54 +1634,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.9.2", - "core-foundation 0.10.1", - "core-graphics-types 0.2.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.9.2", - "core-foundation 0.10.1", - "libc", -] - [[package]] name = "cpufeatures" version = "0.2.17" @@ -2241,33 +1823,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "cssparser" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa 0.4.8", - "matches", - "phf 0.8.0", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.106", -] - [[package]] name = "csv" version = "1.3.1" @@ -2275,7 +1830,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", - "itoa 1.0.15", + "itoa", "ryu", "serde", ] @@ -2368,19 +1923,6 @@ dependencies = [ "syn 2.0.106", ] -[[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.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "dashmap" version = "6.1.0" @@ -2395,12 +1937,6 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - [[package]] name = "datafusion" version = "46.0.1" @@ -2460,7 +1996,7 @@ checksum = "998a6549e6ee4ee3980e05590b2960446a56b343ea30199ef38acd0e0b9036e2" dependencies = [ "arrow", "async-trait", - "dashmap 6.1.0", + "dashmap", "datafusion-common", "datafusion-execution", "datafusion-expr", @@ -2506,7 +2042,7 @@ dependencies = [ "base64 0.22.1", "half", "hashbrown 0.14.5", - "indexmap 2.10.0", + "indexmap", "libc", "log", "object_store", @@ -2575,7 +2111,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0938f9e5b6bc5782be4111cdfb70c02b7b5451bf34fd57e4de062a7f7c4e31f1" dependencies = [ "arrow", - "dashmap 6.1.0", + "dashmap", "datafusion-common", "datafusion-expr", "futures", @@ -2601,7 +2137,7 @@ dependencies = [ "datafusion-functions-aggregate-common", "datafusion-functions-window-common", "datafusion-physical-expr-common", - "indexmap 2.10.0", + "indexmap", "paste", "recursive", "serde_json", @@ -2616,7 +2152,7 @@ checksum = "18f0a851a436c5a2139189eb4617a54e6a9ccb9edc96c4b3c83b3bb7c58b950e" dependencies = [ "arrow", "datafusion-common", - "indexmap 2.10.0", + "indexmap", "itertools 0.14.0", "paste", ] @@ -2770,7 +2306,7 @@ dependencies = [ "datafusion-common", "datafusion-expr", "datafusion-physical-expr", - "indexmap 2.10.0", + "indexmap", "itertools 0.14.0", "log", "recursive", @@ -2793,7 +2329,7 @@ dependencies = [ "datafusion-physical-expr-common", "half", "hashbrown 0.14.5", - "indexmap 2.10.0", + "indexmap", "itertools 0.14.0", "log", "paste", @@ -2855,7 +2391,7 @@ dependencies = [ "futures", "half", "hashbrown 0.14.5", - "indexmap 2.10.0", + "indexmap", "itertools 0.14.0", "log", "parking_lot", @@ -2873,37 +2409,13 @@ dependencies = [ "bigdecimal", "datafusion-common", "datafusion-expr", - "indexmap 2.10.0", + "indexmap", "log", "recursive", "regex", "sqlparser", ] -[[package]] -name = "dbus" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" -dependencies = [ - "libc", - "libdbus-sys", - "winapi", -] - -[[package]] -name = "dbus-secret-service" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" -dependencies = [ - "dbus", - "futures-util", - "num", - "once_cell", - "rand 0.8.5", -] - [[package]] name = "deflate64" version = "0.1.9" @@ -2983,19 +2495,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case 0.4.0", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.106", -] - [[package]] name = "diff" version = "0.1.13" @@ -3026,445 +2525,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "dioxus" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a247114500f1a78e87022defa8173de847accfada8e8809dfae23a118a580c" -dependencies = [ - "dioxus-cli-config", - "dioxus-config-macro", - "dioxus-core", - "dioxus-core-macro", - "dioxus-desktop", - "dioxus-devtools", - "dioxus-document", - "dioxus-fullstack", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-logger", - "dioxus-mobile", - "dioxus-router", - "dioxus-signals", - "dioxus-web", - "manganis", - "warnings", -] - -[[package]] -name = "dioxus-cli-config" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd16948f1ffdb068dd9a64812158073a4250e2af4e98ea31fdac0312e6bce86" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "dioxus-config-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75cbf582fbb1c32d34a1042ea675469065574109c95154468710a4d73ee98b49" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "dioxus-core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c03f451a119e47433c16e2d8eb5b15bf7d6e6734eb1a4c47574e6711dadff8d" -dependencies = [ - "const_format", - "dioxus-core-types", - "futures-channel", - "futures-util", - "generational-box", - "longest-increasing-subsequence", - "rustc-hash 1.1.0", - "rustversion", - "serde", - "slab", - "slotmap", - "tracing", - "warnings", -] - -[[package]] -name = "dioxus-core-macro" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "105c954caaaedf8cd10f3d1ba576b01e18aa8d33ad435182125eefe488cf0064" -dependencies = [ - "convert_case 0.6.0", - "dioxus-rsx", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "dioxus-core-types" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91a82fccfa48574eb7aa183e297769540904694844598433a9eb55896ad9f93b" -dependencies = [ - "once_cell", -] - -[[package]] -name = "dioxus-desktop" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b0cca3e7a10a4a3df37ea52c4cc7a53e5c9233489e03ee3f2829471fc3099a" -dependencies = [ - "async-trait", - "base64 0.22.1", - "cocoa 0.25.0", - "core-foundation 0.9.4", - "dioxus-cli-config", - "dioxus-core", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "dunce", - "futures-channel", - "futures-util", - "generational-box", - "global-hotkey", - "infer", - "jni", - "lazy-js-bundle", - "muda 0.11.5", - "ndk", - "ndk-context", - "ndk-sys", - "objc", - "objc_id", - "once_cell", - "rfd 0.14.1", - "rustc-hash 1.1.0", - "serde", - "serde_json", - "signal-hook", - "slab", - "tao", - "thiserror 1.0.69", - "tokio", - "tracing", - "tray-icon", - "urlencoding", - "webbrowser", - "wry", -] - -[[package]] -name = "dioxus-devtools" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a7300f1e8181218187b03502044157eef04e0a25b518117c5ef9ae1096880" -dependencies = [ - "dioxus-core", - "dioxus-devtools-types", - "dioxus-signals", - "serde", - "serde_json", - "tracing", - "tungstenite", - "warnings", -] - -[[package]] -name = "dioxus-devtools-types" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f62434973c0c9c5a3bc42e9cd5e7070401c2062a437fb5528f318c3e42ebf4ff" -dependencies = [ - "dioxus-core", - "serde", -] - -[[package]] -name = "dioxus-document" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "802a2014d1662b6615eec0a275745822ee4fc66aacd9d0f2fb33d6c8da79b8f2" -dependencies = [ - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-html", - "futures-channel", - "futures-util", - "generational-box", - "lazy-js-bundle", - "serde", - "serde_json", - "tracing", -] - -[[package]] -name = "dioxus-fullstack" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe99b48a1348eec385b5c4bd3e80fd863b0d3b47257d34e2ddc58754dec5d128" -dependencies = [ - "base64 0.22.1", - "bytes", - "ciborium", - "dioxus-desktop", - "dioxus-devtools", - "dioxus-history", - "dioxus-lib", - "dioxus-mobile", - "dioxus-web", - "dioxus_server_macro", - "futures-channel", - "futures-util", - "generational-box", - "once_cell", - "serde", - "server_fn", - "tracing", - "web-sys", -] - -[[package]] -name = "dioxus-history" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ae4e22616c698f35b60727313134955d885de2d32e83689258e586ebc9b7909" -dependencies = [ - "dioxus-core", - "tracing", -] - -[[package]] -name = "dioxus-hooks" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "948e2b3f20d9d4b2c300aaa60281b1755f3298684448920b27106da5841896d0" -dependencies = [ - "dioxus-core", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "rustversion", - "slab", - "tracing", - "warnings", -] - -[[package]] -name = "dioxus-html" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c9a40e6fee20ce7990095492dedb6a753eebe05e67d28271a249de74dc796d" -dependencies = [ - "async-trait", - "dioxus-core", - "dioxus-core-macro", - "dioxus-core-types", - "dioxus-hooks", - "dioxus-html-internal-macro", - "enumset", - "euclid", - "futures-channel", - "generational-box", - "keyboard-types", - "lazy-js-bundle", - "rustversion", - "serde", - "serde_json", - "serde_repr", - "tracing", -] - -[[package]] -name = "dioxus-html-internal-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ba87b53688a2c9f619ecdf4b3b955bc1f08bd0570a80a0d626c405f6d14a76" -dependencies = [ - "convert_case 0.6.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "dioxus-interpreter-js" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330707b10ca75cb0eb05f9e5f8d80217cd0d7e62116a8277ae363c1a09b57a22" -dependencies = [ - "dioxus-core", - "dioxus-core-types", - "dioxus-html", - "js-sys", - "lazy-js-bundle", - "rustc-hash 1.1.0", - "serde", - "sledgehammer_bindgen", - "sledgehammer_utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus-lib" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5405b71aa9b8b0c3e0d22728f12f34217ca5277792bd315878cc6ecab7301b72" -dependencies = [ - "dioxus-config-macro", - "dioxus-core", - "dioxus-core-macro", - "dioxus-document", - "dioxus-history", - "dioxus-hooks", - "dioxus-html", - "dioxus-rsx", - "dioxus-signals", - "warnings", -] - -[[package]] -name = "dioxus-logger" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545961e752f6c8bf59c274951b3c8b18a106db6ad2f9e2035b29e1f2a3e899b1" -dependencies = [ - "console_error_panic_hook", - "dioxus-cli-config", - "tracing", - "tracing-subscriber", - "tracing-wasm", -] - -[[package]] -name = "dioxus-mobile" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1295388909f427758993f32a571e0f8698d6ce0f125fa0e81b8bfdec3fa952" -dependencies = [ - "dioxus-cli-config", - "dioxus-desktop", - "dioxus-lib", - "jni", - "libc", - "once_cell", -] - -[[package]] -name = "dioxus-router" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7266a76fc9e4a91f56499d1d1aecfff7168952b6627a6008b4e9748d6bf863e4" -dependencies = [ - "dioxus-cli-config", - "dioxus-history", - "dioxus-lib", - "dioxus-router-macro", - "rustversion", - "tracing", - "url", - "urlencoding", -] - -[[package]] -name = "dioxus-router-macro" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2743ffb79e9a7d33d779c87d6deea2a6c047d0736012f95d63b909b83f0a6fd2" -dependencies = [ - "proc-macro2", - "quote", - "slab", - "syn 2.0.106", -] - -[[package]] -name = "dioxus-rsx" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb588e05800b5a7eb90b2f40fca5bbd7626e823fb5e1ba21e011de649b45aa1" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "dioxus-signals" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10e032dbb3a2c0386ec8b8ee59bc20b5aeb67038147c855801237b45b13d72ac" -dependencies = [ - "dioxus-core", - "futures-channel", - "futures-util", - "generational-box", - "once_cell", - "parking_lot", - "rustc-hash 1.1.0", - "tracing", - "warnings", -] - -[[package]] -name = "dioxus-web" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7c12475c3d360058b8afe1b68eb6dfc9cbb7dcd760aed37c5f85c561c83ed1" -dependencies = [ - "async-trait", - "ciborium", - "dioxus-cli-config", - "dioxus-core", - "dioxus-core-types", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-html", - "dioxus-interpreter-js", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "js-sys", - "lazy-js-bundle", - "rustc-hash 1.1.0", - "serde", - "serde-wasm-bindgen", - "serde_json", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus_server_macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "371a5b21989a06b53c5092e977b3f75d0e60a65a4c15a2aa1d07014c3b2dda97" -dependencies = [ - "proc-macro2", - "quote", - "server_fn_macro", - "syn 2.0.106", -] - [[package]] name = "dirs" version = "6.0.0" @@ -3486,24 +2546,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.9.2", - "block2 0.6.1", - "libc", - "objc2 0.6.2", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -3515,65 +2557,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading 0.8.8", -] - -[[package]] -name = "dlopen2" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "dtoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - [[package]] name = "dunce" version = "1.0.5" @@ -3657,40 +2640,13 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - [[package]] name = "enum-as-inner" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ + "heck", "proc-macro2", "quote", "syn 2.0.106", @@ -3743,16 +2699,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "euclid" -version = "0.22.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" -dependencies = [ - "num-traits", - "serde", -] - [[package]] name = "event-listener" version = "5.4.1" @@ -3780,15 +2726,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - [[package]] name = "ff" version = "0.12.1" @@ -3799,16 +2736,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - [[package]] name = "figment" version = "0.10.19" @@ -3921,33 +2848,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -3972,16 +2872,6 @@ dependencies = [ "libc", ] -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - [[package]] name = "futures" version = "0.3.31" @@ -4030,19 +2920,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.31" @@ -4084,124 +2961,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generational-box" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a673cf4fb0ea6a91aa86c08695756dfe875277a912cdbf33db9a9f62d47ed82b" -dependencies = [ - "parking_lot", - "tracing", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -4212,17 +2971,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -4266,177 +3014,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.9.2", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.69", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" -[[package]] -name = "global-hotkey" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b436093d1598b05e3b7fddc097b2bad32763f53a1beb25ab6f9718c6a60acd09" -dependencies = [ - "bitflags 2.9.2", - "cocoa 0.25.0", - "crossbeam-channel", - "keyboard-types", - "objc", - "once_cell", - "thiserror 1.0.69", - "windows-sys 0.52.0", - "x11-dl", -] - -[[package]] -name = "globset" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags 1.3.2", - "ignore", - "walkdir", -] - -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http 1.3.1", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - [[package]] name = "group" version = "0.12.1" @@ -4448,58 +3031,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "gtk" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "h2" version = "0.3.27" @@ -4512,7 +3043,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.10.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -4531,7 +3062,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.10.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -4549,12 +3080,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -4576,12 +3101,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -4643,20 +3162,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "html5ever" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" -dependencies = [ - "log", - "mac", - "markup5ever", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "http" version = "0.2.12" @@ -4665,7 +3170,7 @@ checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -4676,7 +3181,7 @@ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -4755,7 +3260,7 @@ dependencies = [ "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.15", + "itoa", "pin-project-lite", "socket2 0.5.10", "tokio", @@ -4779,7 +3284,7 @@ dependencies = [ "http-body 1.0.1", "httparse", "httpdate", - "itoa 1.0.15", + "itoa", "pin-project-lite", "pin-utils", "smallvec", @@ -4873,7 +3378,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core", ] [[package]] @@ -4998,32 +3503,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.9", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.10.0" @@ -5034,15 +3513,6 @@ dependencies = [ "hashbrown 0.15.5", ] -[[package]] -name = "infer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6c16b11a665b26aeeb9b1d7f954cdeb034be38dd00adab4f2ae921a8fee804" -dependencies = [ - "cfb", -] - [[package]] name = "inlinable_string" version = "0.1.15" @@ -5078,15 +3548,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "integer-encoding" version = "3.0.4" @@ -5141,15 +3602,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -5177,63 +3629,12 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - [[package]] name = "jobserver" version = "0.1.33" @@ -5269,32 +3670,6 @@ dependencies = [ "simple_asn1", ] -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.9.2", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "keyring" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c" -dependencies = [ - "byteorder", - "dbus-secret-service", - "log", - "security-framework 2.11.1", - "security-framework 3.3.0", - "windows-sys 0.60.2", - "zeroize", -] - [[package]] name = "kqueue" version = "1.1.1" @@ -5315,25 +3690,6 @@ dependencies = [ "libc", ] -[[package]] -name = "kuchikiki" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" -dependencies = [ - "cssparser", - "html5ever", - "indexmap 1.9.3", - "matches", - "selectors", -] - -[[package]] -name = "lazy-js-bundle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49596223b9d9d4947a14a25c142a6e7d8ab3f27eb3ade269d238bb8b5c267e2" - [[package]] name = "lazy_static" version = "1.5.0" @@ -5413,55 +3769,12 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - [[package]] name = "libc" version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" -[[package]] -name = "libdbus-sys" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" -dependencies = [ - "pkg-config", -] - -[[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.8" @@ -5507,25 +3820,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "libxdo" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db" -dependencies = [ - "libxdo-sys", -] - -[[package]] -name = "libxdo-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212" -dependencies = [ - "libc", - "x11", -] - [[package]] name = "libz-sys" version = "1.1.22" @@ -5588,12 +3882,6 @@ dependencies = [ "value-bag", ] -[[package]] -name = "longest-increasing-subsequence" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" - [[package]] name = "lru" version = "0.12.5" @@ -5658,71 +3946,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "manganis" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317af44b15e7605b85f04525449a3bb631753040156c9b318e6cba8a3ea4ef73" -dependencies = [ - "const-serialize", - "manganis-core", - "manganis-macro", -] - -[[package]] -name = "manganis-core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38bee65cc725b2bba23b5dbb290f57c8be8fadbe2043fb7e2ce73022ea06519" -dependencies = [ - "const-serialize", - "dioxus-cli-config", - "dioxus-core-types", - "serde", -] - -[[package]] -name = "manganis-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f4f71310913c40174d9f0cfcbcb127dad0329ecdb3945678a120db22d3d065" -dependencies = [ - "dunce", - "manganis-core", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "markup5ever" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" -dependencies = [ - "log", - "phf 0.10.1", - "phf_codegen 0.10.0", - "string_cache", - "string_cache_codegen", - "tendril", -] - [[package]] name = "matchers" version = "0.1.0" @@ -5732,12 +3955,6 @@ dependencies = [ "regex-automata 0.1.10", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.8.4" @@ -5804,7 +4021,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", - "simd-adler32", ] [[package]] @@ -5819,80 +4035,12 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "muda" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c47e7625990fc1af2226ea4f34fb2412b03c12639fcb91868581eb3a6893453" -dependencies = [ - "cocoa 0.25.0", - "crossbeam-channel", - "gtk", - "keyboard-types", - "libxdo", - "objc", - "once_cell", - "png", - "thiserror 1.0.69", - "windows-sys 0.52.0", -] - -[[package]] -name = "muda" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "libxdo", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "once_cell", - "png", - "thiserror 1.0.69", - "windows-sys 0.59.0", -] - [[package]] name = "multimap" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.9.2", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle 0.6.2", - "thiserror 1.0.69", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - [[package]] name = "neli" version = "0.6.5" @@ -5928,12 +4076,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nix" version = "0.29.0" @@ -5957,15 +4099,8 @@ dependencies = [ "cfg-if", "cfg_aliases", "libc", - "memoffset", ] -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - [[package]] name = "nom" version = "7.1.3" @@ -5985,15 +4120,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "normpath" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "notify" version = "8.2.0" @@ -6190,7 +4316,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.106", @@ -6218,7 +4344,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d5c6c0ef9702176a570f06ad94f3198bc29c524c8b498f1b9346e1b1bdcbb3a" dependencies = [ "bitflags 2.9.2", - "libloading 0.8.8", + "libloading", "nvml-wrapper-sys", "static_assertions", "thiserror 1.0.69", @@ -6231,94 +4357,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd23dbe2eb8d8335d2bce0299e0a07d6a63c089243d626ca75b770a962ff49e6" dependencies = [ - "libloading 0.8.8", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.9.2", - "block2 0.5.1", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" -dependencies = [ - "bitflags 2.9.2", - "block2 0.6.1", - "objc2 0.6.2", - "objc2-core-foundation", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.9.2", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "libloading", ] [[package]] @@ -6328,60 +4367,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.2", - "dispatch2", - "objc2 0.6.2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" -dependencies = [ - "bitflags 2.9.2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.2", - "block2 0.5.1", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" -dependencies = [ - "bitflags 2.9.2", - "block2 0.6.1", - "objc2 0.6.2", - "objc2-core-foundation", ] [[package]] @@ -6394,49 +4379,6 @@ dependencies = [ "objc2-core-foundation", ] -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.2", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.2", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - [[package]] name = "object" version = "0.36.7" @@ -6604,16 +4546,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "outref" version = "0.5.2" @@ -6637,31 +4569,6 @@ dependencies = [ "sha2 0.10.9", ] -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "parking" version = "2.2.1" @@ -6833,27 +4740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset 0.5.7", - "indexmap 2.10.0", -] - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_macros", - "phf_shared 0.8.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_shared 0.10.0", + "indexmap", ] [[package]] @@ -6862,98 +4749,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ - "phf_shared 0.12.1", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.5", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher 0.3.11", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher 1.0.1", + "phf_shared", ] [[package]] @@ -6962,7 +4758,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" dependencies = [ - "siphasher 1.0.1", + "siphasher", ] [[package]] @@ -6997,17 +4793,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "pkcs1" version = "0.7.5" @@ -7073,45 +4858,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", -] - -[[package]] -name = "pollster" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" - -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - [[package]] name = "poly1305" version = "0.8.0" @@ -7159,12 +4905,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - [[package]] name = "pretty_assertions" version = "1.4.1" @@ -7185,64 +4925,15 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.7", -] - [[package]] name = "proc-macro-crate" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.27", + "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" version = "1.0.101" @@ -7291,7 +4982,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" dependencies = [ - "heck 0.5.0", + "heck", "itertools 0.14.0", "log", "multimap", @@ -7462,20 +5153,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - [[package]] name = "rand" version = "0.8.5" @@ -7497,16 +5174,6 @@ dependencies = [ "rand_core 0.9.3", ] -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -7527,15 +5194,6 @@ dependencies = [ "rand_core 0.9.3", ] -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - [[package]] name = "rand_core" version = "0.6.4" @@ -7554,36 +5212,6 @@ dependencies = [ "getrandom 0.3.3", ] -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - [[package]] name = "rayon" version = "1.11.0" @@ -7791,7 +5419,6 @@ dependencies = [ "js-sys", "log", "mime", - "mime_guess", "percent-encoding", "pin-project-lite", "quinn", @@ -7826,53 +5453,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rfd" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" -dependencies = [ - "ashpd 0.8.1", - "block", - "dispatch", - "js-sys", - "log", - "objc", - "objc-foundation", - "objc_id", - "pollster 0.3.0", - "raw-window-handle 0.6.2", - "urlencoding", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "rfd" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" -dependencies = [ - "ashpd 0.11.0", - "block2 0.6.1", - "dispatch2", - "js-sys", - "log", - "objc2 0.6.2", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "pollster 0.4.0", - "raw-window-handle 0.6.2", - "urlencoding", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.59.0", -] - [[package]] name = "ring" version = "0.17.14" @@ -8016,60 +5596,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "rust-i18n" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda2551fdfaf6cc5ee283adc15e157047b92ae6535cf80f6d4962d05717dc332" -dependencies = [ - "globwalk", - "once_cell", - "regex", - "rust-i18n-macro", - "rust-i18n-support", - "smallvec", -] - -[[package]] -name = "rust-i18n-macro" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22baf7d7f56656d23ebe24f6bb57a5d40d2bce2a5f1c503e692b5b2fa450f965" -dependencies = [ - "glob", - "once_cell", - "proc-macro2", - "quote", - "rust-i18n-support", - "serde", - "serde_json", - "serde_yaml", - "syn 2.0.106", -] - -[[package]] -name = "rust-i18n-support" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "940ed4f52bba4c0152056d771e563b7133ad9607d4384af016a134b58d758f19" -dependencies = [ - "arc-swap", - "base62", - "globwalk", - "itertools 0.11.0", - "lazy_static", - "normpath", - "once_cell", - "proc-macro2", - "regex", - "serde", - "serde_json", - "serde_yaml", - "siphasher 1.0.1", - "toml", - "triomphe", -] - [[package]] name = "rustc-demangle" version = "0.1.26" @@ -8381,26 +5907,6 @@ dependencies = [ "xxhash-rust", ] -[[package]] -name = "rustfs-gui" -version = "0.0.5" -dependencies = [ - "chrono", - "dioxus", - "dirs", - "hex", - "keyring", - "rfd 0.15.4", - "rust-embed", - "rust-i18n", - "serde", - "serde_json", - "sha2 0.10.9", - "tokio", - "tracing-appender", - "tracing-subscriber", -] - [[package]] name = "rustfs-iam" version = "0.0.5" @@ -8479,7 +5985,7 @@ dependencies = [ "async-trait", "axum", "chrono", - "dashmap 6.1.0", + "dashmap", "form_urlencoded", "futures", "once_cell", @@ -8716,7 +6222,7 @@ dependencies = [ "serde", "sha1 0.10.6", "sha2 0.10.9", - "siphasher 1.0.1", + "siphasher", "snap", "sysinfo", "tempfile", @@ -8949,7 +6455,7 @@ dependencies = [ "http-body-util", "httparse", "hyper 1.7.0", - "itoa 1.0.15", + "itoa", "md-5", "memchr", "mime", @@ -9028,12 +6534,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -9106,26 +6606,6 @@ dependencies = [ "libc", ] -[[package]] -name = "selectors" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more", - "fxhash", - "log", - "matches", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", - "thin-slice", -] - [[package]] name = "semver" version = "1.0.26" @@ -9135,15 +6615,6 @@ dependencies = [ "serde", ] -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - [[package]] name = "seq-macro" version = "0.3.6" @@ -9180,17 +6651,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde-wasm-bindgen" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - [[package]] name = "serde-xml-rs" version = "0.6.0" @@ -9240,7 +6700,7 @@ version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ - "itoa 1.0.15", + "itoa", "memchr", "ryu", "serde", @@ -9252,32 +6712,10 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ - "itoa 1.0.15", + "itoa", "serde", ] -[[package]] -name = "serde_qs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" -dependencies = [ - "percent-encoding", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "serde_spanned" version = "0.6.9" @@ -9294,24 +6732,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.15", + "itoa", "ryu", "serde", ] -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.10.0", - "itoa 1.0.15", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "serial_test" version = "3.2.0" @@ -9337,69 +6762,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "server_fn" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" -dependencies = [ - "bytes", - "const_format", - "dashmap 5.5.3", - "futures", - "gloo-net", - "http 1.3.1", - "js-sys", - "once_cell", - "reqwest", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn_macro_default", - "thiserror 1.0.69", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaaf648c6967aef78177c0610478abb5a3455811f401f3c62d10ae9bd3901a1" -dependencies = [ - "const_format", - "convert_case 0.6.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro_default" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" -dependencies = [ - "server_fn_macro", - "syn 2.0.106", -] - -[[package]] -name = "servo_arc" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - [[package]] name = "sha1" version = "0.10.6" @@ -9482,16 +6844,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signal-hook" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" -dependencies = [ - "libc", - "signal-hook-registry", -] - [[package]] name = "signal-hook-registry" version = "1.4.6" @@ -9545,12 +6897,6 @@ dependencies = [ "time", ] -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "siphasher" version = "1.0.1" @@ -9563,45 +6909,6 @@ version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" -[[package]] -name = "sledgehammer_bindgen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" -dependencies = [ - "sledgehammer_bindgen_macro", - "wasm-bindgen", -] - -[[package]] -name = "sledgehammer_bindgen_macro" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f62f06db0370222f7f498ef478fce9f8df5828848d1d3517e3331936d7074f55" -dependencies = [ - "quote", - "syn 2.0.106", -] - -[[package]] -name = "sledgehammer_utils" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" -dependencies = [ - "rustc-hash 1.1.0", -] - -[[package]] -name = "slotmap" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" -dependencies = [ - "serde", - "version_check", -] - [[package]] name = "smallvec" version = "1.15.1" @@ -9627,7 +6934,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1961e2ef424c1424204d3a5d6975f934f56b6d50ff5732382d84ebf460e147f7" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.106", @@ -9659,32 +6966,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - [[package]] name = "spin" version = "0.9.8" @@ -9771,31 +7052,6 @@ dependencies = [ "thiserror 2.0.15", ] -[[package]] -name = "string_cache" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" -dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.11.3", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", -] - [[package]] name = "strsim" version = "0.11.1" @@ -9817,7 +7073,7 @@ version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.106", @@ -9860,7 +7116,7 @@ version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f214f427ad94a553e5ca5514c95c6be84667cbc5568cce957f03f3477d03d5c" dependencies = [ - "itoa 1.0.15", + "itoa", "ryu", "sval", ] @@ -9871,7 +7127,7 @@ version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ed34b32e638dec9a99c8ac92d0aa1220d40041026b625474c2b6a4d6f4feb" dependencies = [ - "itoa 1.0.15", + "itoa", "ryu", "sval", ] @@ -9974,7 +7230,7 @@ dependencies = [ "ntapi", "objc2-core-foundation", "objc2-io-kit", - "windows 0.61.3", + "windows", ] [[package]] @@ -9998,76 +7254,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.30.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" -dependencies = [ - "bitflags 2.9.2", - "cocoa 0.26.1", - "core-foundation 0.10.1", - "core-graphics 0.24.0", - "crossbeam-channel", - "dispatch", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "instant", - "jni", - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc", - "once_cell", - "parking_lot", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows 0.58.0", - "windows-core 0.58.0", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - [[package]] name = "temp-env" version = "0.3.6" @@ -10090,17 +7276,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - [[package]] name = "test-case" version = "3.3.1" @@ -10134,12 +7309,6 @@ dependencies = [ "test-case-core", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -10227,7 +7396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", - "itoa 1.0.15", + "itoa", "libc", "num-conv", "num_threads", @@ -10314,7 +7483,6 @@ dependencies = [ "slab", "socket2 0.6.0", "tokio-macros", - "tracing", "windows-sys 0.59.0", ] @@ -10422,7 +7590,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.27", + "toml_edit", ] [[package]] @@ -10434,40 +7602,18 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.10.0", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.10.0", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", "toml_write", - "winnow 0.7.12", + "winnow", ] [[package]] @@ -10580,7 +7726,7 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "indexmap 2.10.0", + "indexmap", "pin-project-lite", "slab", "sync_wrapper", @@ -10639,18 +7785,6 @@ 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 1.0.69", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.30" @@ -10743,17 +7877,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "tracing-wasm" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" -dependencies = [ - "tracing", - "tracing-subscriber", - "wasm-bindgen", -] - [[package]] name = "transform-stream" version = "0.3.1" @@ -10763,62 +7886,12 @@ dependencies = [ "futures-core", ] -[[package]] -name = "tray-icon" -version = "0.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadd75f5002e2513eaa19b2365f533090cc3e93abd38788452d9ea85cff7b48a" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda 0.15.3", - "objc2 0.6.2", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.1", - "once_cell", - "png", - "thiserror 2.0.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "triomphe" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" -dependencies = [ - "arc-swap", - "serde", - "stable_deref_trait", -] - [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 1.3.1", - "httparse", - "log", - "rand 0.8.5", - "sha1 0.10.6", - "thiserror 1.0.69", - "utf-8", -] - [[package]] name = "twox-hash" version = "1.6.3" @@ -10873,17 +7946,6 @@ dependencies = [ "tz-rs", ] -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - [[package]] name = "uncased" version = "0.9.10" @@ -10933,12 +7995,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - [[package]] name = "untrusted" version = "0.9.0" @@ -10954,7 +8010,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -10963,12 +8018,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -11054,12 +8103,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" @@ -11091,34 +8134,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "warnings" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" -dependencies = [ - "pin-project", - "tracing", - "warnings-macro", -] - -[[package]] -name = "warnings-macro" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -11218,66 +8233,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.0.8", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.2", - "rustix 1.0.8", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.2", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml 0.37.5", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "pkg-config", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -11298,67 +8253,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webbrowser" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" -dependencies = [ - "core-foundation 0.9.4", - "home", - "jni", - "log", - "ndk-context", - "objc", - "raw-window-handle 0.5.2", - "url", - "web-sys", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - [[package]] name = "webpki-roots" version = "1.0.2" @@ -11368,42 +8262,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "webview2-com" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows 0.58.0", - "windows-core 0.58.0", - "windows-implement 0.58.0", - "windows-interface 0.58.0", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "webview2-com-sys" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" -dependencies = [ - "thiserror 1.0.69", - "windows 0.58.0", - "windows-core 0.58.0", -] - [[package]] name = "which" version = "4.4.2" @@ -11456,16 +8314,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" -dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.61.3" @@ -11473,7 +8321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", - "windows-core 0.61.2", + "windows-core", "windows-future", "windows-link", "windows-numerics", @@ -11485,20 +8333,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", + "windows-core", ] [[package]] @@ -11507,11 +8342,11 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement", + "windows-interface", "windows-link", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-result", + "windows-strings", ] [[package]] @@ -11520,22 +8355,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core 0.61.2", + "windows-core", "windows-link", "windows-threading", ] -[[package]] -name = "windows-implement" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "windows-implement" version = "0.60.0" @@ -11547,17 +8371,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - [[package]] name = "windows-interface" version = "0.59.1" @@ -11581,7 +8394,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core 0.61.2", + "windows-core", "windows-link", ] @@ -11592,17 +8405,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", + "windows-result", + "windows-strings", ] [[package]] @@ -11614,16 +8418,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows-strings" version = "0.4.2" @@ -11633,24 +8427,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -11678,36 +8454,6 @@ dependencies = [ "windows-targets 0.53.3", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -11750,27 +8496,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-version" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -11783,18 +8508,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -11807,18 +8520,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -11843,18 +8544,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -11867,18 +8556,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -11891,18 +8568,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -11915,18 +8580,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -11939,15 +8592,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.7.12" @@ -11984,67 +8628,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "wry" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac0099a336829fbf54c26b5f620c68980ebbe37196772aeaf6118df4931b5cb0" -dependencies = [ - "base64 0.22.1", - "block", - "cocoa 0.26.1", - "core-graphics 0.24.0", - "crossbeam-channel", - "dpi", - "dunce", - "gdkx11", - "gtk", - "html5ever", - "http 1.3.1", - "javascriptcore-rs", - "jni", - "kuchikiki", - "libc", - "ndk", - "objc", - "objc_id", - "once_cell", - "percent-encoding", - "raw-window-handle 0.6.2", - "sha2 0.10.9", - "soup3", - "tao-macros", - "thiserror 1.0.69", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows 0.58.0", - "windows-core 0.58.0", - "windows-version", - "x11-dl", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - [[package]] name = "xattr" version = "1.5.1" @@ -12055,16 +8638,6 @@ dependencies = [ "rustix 1.0.8", ] -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "xml-rs" version = "0.8.27" @@ -12122,118 +8695,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-process", - "async-recursion", - "async-trait", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1 0.10.6", - "static_assertions", - "tokio", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros 4.4.0", - "zbus_names 3.0.0", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus" -version = "5.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" -dependencies = [ - "async-broadcast", - "async-recursion", - "async-trait", - "enumflags2", - "event-listener", - "futures-core", - "futures-lite", - "hex", - "nix 0.30.1", - "ordered-stream", - "serde", - "serde_repr", - "tokio", - "tracing", - "uds_windows", - "windows-sys 0.59.0", - "winnow 0.7.12", - "zbus_macros 5.9.0", - "zbus_names 4.2.0", - "zvariant 5.6.0", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zvariant_utils 2.1.0", -] - -[[package]] -name = "zbus_macros" -version = "5.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zbus_names 4.2.0", - "zvariant 5.6.0", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant 4.2.0", -] - -[[package]] -name = "zbus_names" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" -dependencies = [ - "serde", - "static_assertions", - "winnow 0.7.12", - "zvariant 5.6.0", -] - [[package]] name = "zerocopy" version = "0.8.26" @@ -12345,7 +8806,7 @@ dependencies = [ "flate2", "getrandom 0.3.3", "hmac 0.12.1", - "indexmap 2.10.0", + "indexmap", "lzma-rs", "memchr", "pbkdf2", @@ -12397,83 +8858,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "url", - "zvariant_derive 4.2.0", -] - -[[package]] -name = "zvariant" -version = "5.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" -dependencies = [ - "endi", - "enumflags2", - "serde", - "url", - "winnow 0.7.12", - "zvariant_derive 5.6.0", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zvariant_utils 2.1.0", -] - -[[package]] -name = "zvariant_derive" -version = "5.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.106", - "zvariant_utils 3.2.0", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "zvariant_utils" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "static_assertions", - "syn 2.0.106", - "winnow 0.7.12", -] diff --git a/Cargo.toml b/Cargo.toml index 63383960..f3a050ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,6 @@ [workspace] members = [ "rustfs", # Core file system implementation - "cli/rustfs-gui", # Graphical user interface client "crates/appauth", # Application authentication and authorization "crates/audit-logger", # Audit logging system for file operations "crates/common", # Shared utilities and data structures @@ -118,8 +117,6 @@ criterion = { version = "0.7", features = ["html_reports"] } dashmap = "6.1.0" datafusion = "46.0.1" derive_builder = "0.20.2" -dioxus = { version = "0.6.3", features = ["router"] } -dirs = "6.0.0" enumset = "1.1.9" flatbuffers = "25.2.10" flate2 = "1.1.2" @@ -145,11 +142,6 @@ http-body = "1.0.1" humantime = "2.2.0" ipnetwork = { version = "0.21.1", features = ["serde"] } jsonwebtoken = "9.3.1" -keyring = { version = "3.6.3", features = [ - "apple-native", - "windows-native", - "sync-secret-service", -] } lazy_static = "1.5.0" libsystemd = { version = "0.7.2" } local-ip-address = "0.6.5" @@ -201,17 +193,12 @@ reqwest = { version = "0.12.23", default-features = false, features = [ "json", "blocking", ] } -rfd = { version = "0.15.4", default-features = false, features = [ - "xdg-portal", - "tokio", -] } rmcp = { version = "0.5.0" } rmp = "0.8.14" rmp-serde = "1.3.0" rsa = "0.9.8" rumqttc = { version = "0.24" } rust-embed = { version = "8.7.2" } -rust-i18n = { version = "3.1.5" } rustfs-rsc = "2025.506.1" rustls = { version = "0.23.31" } rustls-pki-types = "1.12.0" @@ -256,7 +243,6 @@ tonic-prost-build = { version = "0.14.1" } tower = { version = "0.5.2", features = ["timeout"] } tower-http = { version = "0.6.6", features = ["cors"] } tracing = "0.1.41" -tracing-appender = "0.2.3" tracing-core = "0.1.34" tracing-error = "0.2.1" tracing-opentelemetry = "0.31.0" diff --git a/cli/rustfs-gui/Cargo.toml b/cli/rustfs-gui/Cargo.toml deleted file mode 100644 index 168dd87a..00000000 --- a/cli/rustfs-gui/Cargo.toml +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2024 RustFS Team -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -[package] -name = "rustfs-gui" -edition.workspace = true -license.workspace = true -repository.workspace = true -rust-version.workspace = true -version.workspace = true - -[dependencies] -chrono = { workspace = true } -dioxus = { workspace = true, features = ["router"] } -dirs = { workspace = true } -hex = { workspace = true } -keyring = { workspace = true } -rfd = { workspace = true } -rust-embed = { workspace = true, features = ["interpolate-folder-path"] } -rust-i18n = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -sha2 = { workspace = true } -tokio = { workspace = true, features = ["io-util", "net", "process", "sync"] } -tracing-subscriber = { workspace = true, features = ["fmt", "env-filter", "tracing-log", "time", "local-time", "json"] } -tracing-appender = { workspace = true } - -[features] -default = ["desktop"] -web = ["dioxus/web"] -desktop = ["dioxus/desktop"] -mobile = ["dioxus/mobile"] - -[lints] -workspace = true diff --git a/cli/rustfs-gui/Dioxus.toml b/cli/rustfs-gui/Dioxus.toml deleted file mode 100644 index 6f814c5e..00000000 --- a/cli/rustfs-gui/Dioxus.toml +++ /dev/null @@ -1,52 +0,0 @@ -[application] - -# App (Project) Name -name = "rustfs-gui" - -# The static resource path -asset_dir = "public" - -[web.app] - -# HTML title tag content -title = "rustfs-gui" - -# include `assets` in web platform -[web.resource] - -# Additional CSS style files -style = [] - -# Additional JavaScript files -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] - -[bundle] -identifier = "com.rustfs.cli.gui" - -publisher = "RustFsGUI" - -category = "Utility" - -copyright = "Copyright 2025 rustfs.com" - -icon = [ - "assets/icons/icon.icns", - "assets/icons/icon.ico", - "assets/icons/icon.png", - "assets/icons/rustfs-icon.png", -] -#[bundle.macos] -#provider_short_name = "RustFs" -[bundle.windows] -tsp = true -icon_path = "assets/icons/icon.ico" -allow_downgrades = true -[bundle.windows.webview_install_mode] -[bundle.windows.webview_install_mode.EmbedBootstrapper] -silent = true \ No newline at end of file diff --git a/cli/rustfs-gui/README.md b/cli/rustfs-gui/README.md deleted file mode 100644 index c2ba8557..00000000 --- a/cli/rustfs-gui/README.md +++ /dev/null @@ -1,34 +0,0 @@ -## Rustfs GUI - -### Tailwind - -1. Install npm: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm -2. Install the Tailwind CSS CLI: https://tailwindcss.com/docs/installation -3. Run the following command in the root of the project to start the Tailwind CSS compiler: - -```bash -npx tailwindcss -i ./input.css -o ./assets/tailwind.css --watch -``` - -### Dioxus CLI - -#### Install the stable version (recommended) - -```shell -cargo install dioxus-cli -``` - -### Serving Your App - -Run the following command in the root of your project to start developing with the default platform: - -```bash -dx serve -``` - -To run for a different platform, use the `--platform platform` flag. E.g. - -```bash -dx serve --platform desktop -``` - diff --git a/cli/rustfs-gui/assets/favicon.ico b/cli/rustfs-gui/assets/favicon.ico deleted file mode 100644 index 61e6b239..00000000 Binary files a/cli/rustfs-gui/assets/favicon.ico and /dev/null differ diff --git a/cli/rustfs-gui/assets/icon.png b/cli/rustfs-gui/assets/icon.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/icon.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon-all.icns b/cli/rustfs-gui/assets/icons/icon-all.icns deleted file mode 100644 index 50456d0e..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon-all.icns and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon-all.ico b/cli/rustfs-gui/assets/icons/icon-all.ico deleted file mode 100644 index 45f9f164..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon-all.ico and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon.icns b/cli/rustfs-gui/assets/icons/icon.icns deleted file mode 100644 index 8bcba4ae..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon.icns and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon.ico b/cli/rustfs-gui/assets/icons/icon.ico deleted file mode 100644 index 61e6b239..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon.ico and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon.png b/cli/rustfs-gui/assets/icons/icon.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_128x128.png b/cli/rustfs-gui/assets/icons/icon_128x128.png deleted file mode 100644 index d4cb9360..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_128x128.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_128x128@2x.png b/cli/rustfs-gui/assets/icons/icon_128x128@2x.png deleted file mode 100644 index e94f3b33..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_128x128@2x.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_16x16.png b/cli/rustfs-gui/assets/icons/icon_16x16.png deleted file mode 100644 index fc16558d..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_16x16.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_16x16@2x.png b/cli/rustfs-gui/assets/icons/icon_16x16@2x.png deleted file mode 100644 index 6af80938..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_16x16@2x.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_256x256.png b/cli/rustfs-gui/assets/icons/icon_256x256.png deleted file mode 100644 index e94f3b33..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_256x256.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_256x256@2x.png b/cli/rustfs-gui/assets/icons/icon_256x256@2x.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_256x256@2x.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_32x32.png b/cli/rustfs-gui/assets/icons/icon_32x32.png deleted file mode 100644 index 6af80938..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_32x32.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_32x32@2x.png b/cli/rustfs-gui/assets/icons/icon_32x32@2x.png deleted file mode 100644 index 9779204a..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_32x32@2x.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_512x512.png b/cli/rustfs-gui/assets/icons/icon_512x512.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_512x512.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/icon_512x512@2x.png b/cli/rustfs-gui/assets/icons/icon_512x512@2x.png deleted file mode 100644 index 272fb677..00000000 Binary files a/cli/rustfs-gui/assets/icons/icon_512x512@2x.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/icons/rustfs-icon.png b/cli/rustfs-gui/assets/icons/rustfs-icon.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/icons/rustfs-icon.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/js/sts.js b/cli/rustfs-gui/assets/js/sts.js deleted file mode 100644 index 13d4ed90..00000000 --- a/cli/rustfs-gui/assets/js/sts.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright 2024 RustFS Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -window.switchTab = function (tabId) { - // Hide everything - document.querySelectorAll('.tab-content').forEach(content => { - content.classList.add('hidden'); - }); - - // Reset all label styles - document.querySelectorAll('.tab-btn').forEach(btn => { - btn.classList.remove('border-b-2', 'border-black'); - btn.classList.add('text-gray-500'); - }); - - // Displays the selected content - const activeContent = document.getElementById(tabId); - if (activeContent) { - activeContent.classList.remove('hidden'); - } - - // Updates the selected label style - const activeBtn = document.querySelector(`[data-tab="${tabId}"]`); - if (activeBtn) { - activeBtn.classList.add('border-b-2', 'border-black'); - activeBtn.classList.remove('text-gray-500'); - } -}; - -window.togglePassword = function (button) { - const input = button.parentElement.querySelector('input[type="password"], input[type="text"]'); - if (input) { - input.type = input.type === 'password' ? 'text' : 'password'; - } -}; \ No newline at end of file diff --git a/cli/rustfs-gui/assets/rustfs-icon.png b/cli/rustfs-gui/assets/rustfs-icon.png deleted file mode 100644 index 68d8d939..00000000 Binary files a/cli/rustfs-gui/assets/rustfs-icon.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/rustfs-logo-square.png b/cli/rustfs-gui/assets/rustfs-logo-square.png deleted file mode 100644 index f2136078..00000000 Binary files a/cli/rustfs-gui/assets/rustfs-logo-square.png and /dev/null differ diff --git a/cli/rustfs-gui/assets/rustfs-logo.svg b/cli/rustfs-gui/assets/rustfs-logo.svg deleted file mode 100644 index 93ca3c55..00000000 --- a/cli/rustfs-gui/assets/rustfs-logo.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/cli/rustfs-gui/assets/styling/navbar.css b/cli/rustfs-gui/assets/styling/navbar.css deleted file mode 100644 index d5e63e64..00000000 --- a/cli/rustfs-gui/assets/styling/navbar.css +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright 2024 RustFS Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#navbar { - display: flex; - flex-direction: row; -} - -#navbar a { - color: #ffffff; - margin-right: 20px; - text-decoration: none; - transition: color 0.2s ease; -} - -#navbar a:hover { - cursor: pointer; - color: #ffffff; -/ / #91a4d2; -} \ No newline at end of file diff --git a/cli/rustfs-gui/assets/tailwind.css b/cli/rustfs-gui/assets/tailwind.css deleted file mode 100644 index ae7ca53b..00000000 --- a/cli/rustfs-gui/assets/tailwind.css +++ /dev/null @@ -1,972 +0,0 @@ -/** - * Copyright 2024 RustFS Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -*, ::before, ::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; - --tw-contain-size: ; - --tw-contain-layout: ; - --tw-contain-paint: ; - --tw-contain-style: ; -} - -/* -! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - letter-spacing: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden]:where(:not([hidden="until-found"])) { - display: none; -} - -.static { - position: static; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.right-2 { - right: 0.5rem; -} - -.right-6 { - right: 1.5rem; -} - -.top-1\/2 { - top: 50%; -} - -.top-4 { - top: 1rem; -} - -.z-10 { - z-index: 10; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.ml-2 { - margin-left: 0.5rem; -} - -.flex { - display: flex; -} - -.hidden { - display: none; -} - -.h-16 { - height: 4rem; -} - -.h-24 { - height: 6rem; -} - -.h-4 { - height: 1rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-6 { - height: 1.5rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-16 { - width: 4rem; -} - -.w-20 { - width: 5rem; -} - -.w-24 { - width: 6rem; -} - -.w-4 { - width: 1rem; -} - -.w-48 { - width: 12rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.w-full { - width: 100%; -} - -.flex-1 { - flex: 1 1 0%; -} - -.-translate-y-1\/2 { - --tw-translate-y: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -.animate-spin { - animation: spin 1s linear infinite; -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} - -.space-y-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-md { - border-radius: 0.375rem; -} - -.border { - border-width: 1px; -} - -.border-b { - border-bottom-width: 1px; -} - -.border-b-2 { - border-bottom-width: 2px; -} - -.border-black { - --tw-border-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); -} - -.bg-\[\#111827\] { - --tw-bg-opacity: 1; - background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); -} - -.bg-gray-900 { - --tw-bg-opacity: 1; - background-color: rgb(17 24 39 / var(--tw-bg-opacity, 1)); -} - -.bg-red-500 { - --tw-bg-opacity: 1; - background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); -} - -.p-2 { - padding: 0.5rem; -} - -.p-4 { - padding: 1rem; -} - -.p-8 { - padding: 2rem; -} - -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.py-0\.5 { - padding-top: 0.125rem; - padding-bottom: 0.125rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.pr-10 { - padding-right: 2.5rem; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.font-medium { - font-weight: 500; -} - -.font-semibold { - font-weight: 600; -} - -.text-blue-500 { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity, 1)); -} - -.text-blue-600 { - --tw-text-opacity: 1; - color: rgb(37 99 235 / var(--tw-text-opacity, 1)); -} - -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity, 1)); -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity, 1)); -} - -.text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity, 1)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity, 1)); -} - -.opacity-25 { - opacity: 0.25; -} - -.opacity-75 { - opacity: 0.75; -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.hover\:bg-\[\#1f2937\]:hover { - --tw-bg-opacity: 1; - background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-gray-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); -} - -.hover\:bg-red-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); -} - -.hover\:text-gray-700:hover { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity, 1)); -} - -.hover\:text-gray-900:hover { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity, 1)); -} - -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\:ring-blue-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); -} \ No newline at end of file diff --git a/cli/rustfs-gui/embedded-rustfs/README.md b/cli/rustfs-gui/embedded-rustfs/README.md deleted file mode 100644 index 190bfa36..00000000 --- a/cli/rustfs-gui/embedded-rustfs/README.md +++ /dev/null @@ -1 +0,0 @@ -rustfs bin path, do not delete \ No newline at end of file diff --git a/cli/rustfs-gui/input.css b/cli/rustfs-gui/input.css deleted file mode 100644 index 06106e06..00000000 --- a/cli/rustfs-gui/input.css +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2024 RustFS Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file diff --git a/cli/rustfs-gui/src/components/home.rs b/cli/rustfs-gui/src/components/home.rs deleted file mode 100644 index dafb687f..00000000 --- a/cli/rustfs-gui/src/components/home.rs +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::components::navbar::LoadingSpinner; -use crate::route::Route; -use crate::utils::{RustFSConfig, ServiceManager}; -use chrono::Datelike; -use dioxus::logger::tracing::debug; -use dioxus::prelude::*; -use std::time::Duration; - -const HEADER_LOGO: Asset = asset!("/assets/rustfs-logo.svg"); -const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); - -/// Define the state of the service -#[derive(PartialEq, Debug, Clone)] -enum ServiceState { - Start, - Stop, -} - -/// Define the Home component -/// The Home component is the main component of the application -/// It is responsible for starting and stopping the service -/// It also displays the service status and provides a button to toggle the service -/// The Home component also displays the footer of the application -/// The footer contains links to the official site, documentation, GitHub, and license -/// The footer also displays the version of the application -/// The Home component also contains a button to change the theme of the application -/// The Home component also contains a button to go to the settings page -#[component] -pub fn Home() -> Element { - #[allow(clippy::redundant_closure)] - let service = use_signal(|| ServiceManager::new()); - let conf = RustFSConfig::load().unwrap_or_else(|e| { - ServiceManager::show_error(&format!("load config failed: {e}")); - RustFSConfig::default() - }); - - debug!("loaded configurations: {:?}", conf); - let config = use_signal(|| conf.clone()); - - use dioxus_router::prelude::Link; - use document::{Meta, Stylesheet, Title}; - let mut service_state = use_signal(|| ServiceState::Start); - // Create a periodic check on the effect of the service status - use_effect(move || { - spawn(async move { - loop { - if let Some(pid) = ServiceManager::check_service_status().await { - debug!("service_running true pid: {:?}", pid); - service_state.set(ServiceState::Stop); - } else { - debug!("service_running true pid: 0"); - service_state.set(ServiceState::Start); - } - tokio::time::sleep(Duration::from_secs(2)).await; - } - }); - }); - debug!("project start service_state: {:?}", service_state.read()); - // Use 'use_signal' to manage service status - let mut loading = use_signal(|| false); - let mut start_service = move |_| { - let service = service; - let config = config.read().clone(); - let mut service_state = service_state; - // set the loading status - loading.set(true); - debug!("stop loading_state: {:?}", loading.read()); - spawn(async move { - match service.read().start(config).await { - Ok(result) => { - if result.success { - let duration = result.end_time - result.start_time; - debug!("The service starts successfully and takes a long time:{}ms", duration.num_milliseconds()); - service_state.set(ServiceState::Stop); - } else { - ServiceManager::show_error(&result.message); - service_state.set(ServiceState::Start); - } - } - Err(e) => { - ServiceManager::show_error(&format!("start service failed: {e}")); - } - } - // Only set loading to false when it's actually done - loading.set(false); - debug!("start loading_state: {:?}", loading.read()); - }); - }; - - let mut stop_service = move |_| { - let service = service; - let mut service_state = service_state; - // set the loading status - loading.set(true); - spawn(async move { - match service.read().stop().await { - Ok(result) => { - if result.success { - let duration = result.end_time - result.start_time; - debug!("The service stops successfully and takes a long time:{}ms", duration.num_milliseconds()); - service_state.set(ServiceState::Start); - } else { - ServiceManager::show_error(&result.message); - } - } - Err(e) => { - ServiceManager::show_error(&format!("stop service failed: {e}")); - } - } - debug!("service_state: {:?}", service_state.read()); - // Only set loading to false when it's actually done - loading.set(false); - debug!("stop loading_state: {:?}", loading.read()); - }); - }; - - // Toggle the state when the button is clicked - let toggle_service = { - let mut service_state = service_state; - debug!("toggle_service service_state: {:?}", service_state.read()); - move |_| { - if service_state.read().eq(&ServiceState::Stop) { - // If the service status is started, you need to run a command to stop the service - stop_service(()); - service_state.set(ServiceState::Start); - } else { - start_service(()); - service_state.set(ServiceState::Stop); - } - } - }; - - // Define dynamic styles based on state - let button_class = if service_state.read().eq(&ServiceState::Start) { - "bg-[#111827] hover:bg-[#1f2937] text-white px-4 py-2 rounded-md flex items-center space-x-2" - } else { - "bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded-md flex items-center space-x-2" - }; - - rsx! { - // The Stylesheet component inserts a style link into the head of the document - Stylesheet {href: TAILWIND_CSS,} - Title { "RustFS APP" } - Meta { - name: "description", - // TODO: translate to english - content: "RustFS is developed in the popular and secure Rust language, compatible with S3 protocol. Suitable for all scenarios including AI/ML and massive data storage, big data, internet, industrial and secure storage. Nearly free to use. Follows Apache 2 license, supports domestic security devices and systems.", - } - div { class: "min-h-screen flex flex-col items-center bg-white", - div { class: "absolute top-4 right-6 flex space-x-2", - // change theme - button { class: "p-2 hover:bg-gray-100 rounded-lg", ChangeThemeButton {} } - // setting button - Link { - class: "p-2 hover:bg-gray-100 rounded-lg", - to: Route::SettingViews {}, - SettingButton {} - } - } - main { class: "flex-1 flex flex-col items-center justify-center space-y-6 p-4", - div { class: "w-24 h-24 bg-gray-900 rounded-full flex items-center justify-center", - img { alt: "Logo", class: "w-16 h-16", src: HEADER_LOGO } - } - div { class: "text-gray-600", - "Service is running on " - span { class: "text-blue-600", " 127.0.0.1:9000 " } - } - LoadingSpinner { - loading: loading.read().to_owned(), - text: "processing...", - } - button { class: button_class, onclick: toggle_service, - svg { - class: "h-4 w-4", - fill: "none", - stroke: "currentColor", - view_box: "0 0 24 24", - xmlns: "http://www.w3.org/2000/svg", - if service_state.read().eq(&ServiceState::Start) { - path { - d: "M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z", - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - } - path { - d: "M21 12a9 9 0 11-18 0 9 9 0 0118 0z", - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - } - } else { - path { - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - d: "M21 12a9 9 0 11-18 0 9 9 0 0118 0z", - } - path { - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - d: "M9 10h6v4H9z", - } - } - } - span { id: "serviceStatus", - if service_state.read().eq(&ServiceState::Start) { - "Start service" - } else { - "Stop service" - } - } - } - } - Footer { version: "v1.0.0".to_string() } - } - } -} - -#[component] -pub fn Footer(version: String) -> Element { - let now = chrono::Local::now(); - let year = now.naive_local().year(); - rsx! { - footer { class: "w-full py-6 flex flex-col items-center space-y-4 mb-6", - nav { class: "flex space-x-4 text-gray-600", - a { class: "hover:text-gray-900", href: "https://rustfs.com", "Official Site" } - a { - class: "hover:text-gray-900", - href: "https://rustfs.com/docs", - "Documentation" - } - a { - class: "hover:text-gray-900", - href: "https://github.com/rustfs/rustfs", - "GitHub" - } - a { - class: "hover:text-gray-900", - href: "https://rustfs.com/docs/license/", - "License" - } - a { class: "hover:text-gray-900", href: "#", "Sponsors" } - } - div { class: "text-gray-500 text-sm", " © rustfs.com {year}, All rights reserved." } - div { class: "text-gray-400 text-sm mb-8", " version {version} " } - } - } -} - -#[component] -pub fn GoBackButtons() -> Element { - rsx! { - button { - class: "p-2 hover:bg-gray-100 rounded-lg", - "onclick": "window.history.back()", - "Back to the Past" - } - } -} - -#[component] -pub fn GoForwardButtons() -> Element { - rsx! { - button { - class: "p-2 hover:bg-gray-100 rounded-lg", - "onclick": "window.history.forward()", - "Back to the Future" - } - } -} - -#[component] -pub fn ChangeThemeButton() -> Element { - rsx! { - svg { - class: "h-6 w-6 text-gray-600", - fill: "none", - stroke: "currentColor", - view_box: "0 0 24 24", - xmlns: "http://www.w3.org/2000/svg", - path { - d: "M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z", - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - } - } - } -} - -#[component] -pub fn SettingButton() -> Element { - rsx! { - svg { - class: "h-6 w-6 text-gray-600", - fill: "none", - stroke: "currentColor", - view_box: "0 0 24 24", - xmlns: "http://www.w3.org/2000/svg", - path { - d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z", - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - } - path { - d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z", - stroke_linecap: "round", - stroke_linejoin: "round", - stroke_width: "2", - } - } - } -} diff --git a/cli/rustfs-gui/src/components/mod.rs b/cli/rustfs-gui/src/components/mod.rs deleted file mode 100644 index 69c026bc..00000000 --- a/cli/rustfs-gui/src/components/mod.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -mod home; -pub use home::Home; -mod navbar; -pub use navbar::Navbar; -mod setting; -pub use setting::Setting; diff --git a/cli/rustfs-gui/src/components/navbar.rs b/cli/rustfs-gui/src/components/navbar.rs deleted file mode 100644 index d22aada0..00000000 --- a/cli/rustfs-gui/src/components/navbar.rs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::route::Route; -use dioxus::logger::tracing::debug; -use dioxus::prelude::*; - -const NAVBAR_CSS: Asset = asset!("/assets/styling/navbar.css"); - -#[component] -pub fn Navbar() -> Element { - rsx! { - document::Link { rel: "stylesheet", href: NAVBAR_CSS } - - div { id: "navbar", class: "hidden", style: "display: none;", - Link { to: Route::HomeViews {}, "Home" } - Link { to: Route::SettingViews {}, "Setting" } - } - - Outlet:: {} - } -} - -#[derive(Props, PartialEq, Debug, Clone)] -pub struct LoadingSpinnerProps { - #[props(default = true)] - loading: bool, - #[props(default = "Processing...")] - text: &'static str, -} - -#[component] -pub fn LoadingSpinner(props: LoadingSpinnerProps) -> Element { - debug!("loading: {}", props.loading); - if !props.loading { - debug!("LoadingSpinner false loading: {}", props.loading); - return rsx! {}; - } - rsx! { - div { class: "flex items-center justify-center z-10", - svg { - class: "animate-spin h-5 w-5 text-blue-500", - xmlns: "http://www.w3.org/2000/svg", - fill: "none", - view_box: "0 0 24 24", - circle { - class: "opacity-25", - cx: "12", - cy: "12", - r: "10", - stroke: "currentColor", - stroke_width: "4", - } - path { - class: "opacity-75", - fill: "currentColor", - d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z", - } - } - span { class: "ml-2 text-gray-600", "{props.text}" } - } - } -} diff --git a/cli/rustfs-gui/src/components/setting.rs b/cli/rustfs-gui/src/components/setting.rs deleted file mode 100644 index 7e5270e3..00000000 --- a/cli/rustfs-gui/src/components/setting.rs +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::components::navbar::LoadingSpinner; -use dioxus::logger::tracing::{debug, error}; -use dioxus::prelude::*; - -const SETTINGS_JS: Asset = asset!("/assets/js/sts.js"); -const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); -#[component] -pub fn Setting() -> Element { - use crate::utils::{RustFSConfig, ServiceManager}; - use document::{Meta, Script, Stylesheet, Title}; - - #[allow(clippy::redundant_closure)] - let service = use_signal(|| ServiceManager::new()); - let conf = RustFSConfig::load().unwrap_or_else(|e| { - error!("load config error: {}", e); - RustFSConfig::default_config() - }); - debug!("conf address: {:?}", conf.clone().address); - - let config = use_signal(|| conf.clone()); - let address_state = use_signal(|| conf.address.to_string()); - let mut host_state = use_signal(|| conf.host.to_string()); - let mut port_state = use_signal(|| conf.port.to_string()); - let mut access_key_state = use_signal(|| conf.access_key.to_string()); - let mut secret_key_state = use_signal(|| conf.secret_key.to_string()); - let mut volume_name_state = use_signal(|| conf.volume_name.to_string()); - let loading = use_signal(|| false); - - let save_and_restart = { - let host_state = host_state; - let port_state = port_state; - let access_key_state = access_key_state; - let secret_key_state = secret_key_state; - let volume_name_state = volume_name_state; - let mut loading = loading; - debug!("save_and_restart access_key:{}", access_key_state.read()); - move |_| { - // set the loading status - loading.set(true); - let mut config = config; - config.write().address = format!("{}:{}", host_state.read(), port_state.read()); - config.write().host = host_state.read().to_string(); - config.write().port = port_state.read().to_string(); - config.write().access_key = access_key_state.read().to_string(); - config.write().secret_key = secret_key_state.read().to_string(); - config.write().volume_name = volume_name_state.read().to_string(); - // restart service - let service = service; - let config = config.read().clone(); - spawn(async move { - if let Err(e) = service.read().restart(config).await { - ServiceManager::show_error(&format!("Failed to send restart command: {e}")); - } - // reset the status when you're done - loading.set(false); - }); - } - }; - - rsx! { - Title { "Settings - RustFS App" } - Meta { name: "description", content: "Settings - RustFS App." } - // The Stylesheet component inserts a style link into the head of the document - Stylesheet { href: TAILWIND_CSS } - Script { src: SETTINGS_JS } - div { class: "bg-white p-8", - h1 { class: "text-2xl font-semibold mb-6", "Settings" } - div { class: "border-b border-gray-200 mb-6", - nav { class: "flex space-x-8", - button { - class: "tab-btn px-1 py-4 text-sm font-medium border-b-2 border-black", - "data-tab": "service", - "onclick": "switchTab('service')", - "Service " - } - button { - class: "tab-btn px-1 py-4 text-sm font-medium text-gray-500 hover:text-gray-700", - "data-tab": "user", - "onclick": "switchTab('user')", - "User " - } - button { - class: "tab-btn px-1 py-4 text-sm font-medium text-gray-500 hover:text-gray-700 hidden", - "data-tab": "logs", - "onclick": "switchTab('logs')", - "Logs " - } - } - } - div { id: "tabContent", - div { class: "tab-content", id: "service", - div { class: "mb-8", - h2 { class: "text-base font-medium mb-2", "Service address" } - p { class: "text-gray-600 mb-4", - " The service address is the IP address and port number of the service. the default address is " - code { class: "bg-gray-100 px-1 py-0.5 rounded", {address_state} } - ". " - } - div { class: "flex space-x-2", - input { - class: "border rounded px-3 py-2 w-48 focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "text", - value: host_state, - oninput: move |evt| host_state.set(evt.value().clone()), - } - span { class: "flex items-center", ":" } - input { - class: "border rounded px-3 py-2 w-20 focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "text", - value: port_state, - oninput: move |evt| port_state.set(evt.value().clone()), - } - } - } - div { class: "mb-8", - h2 { class: "text-base font-medium mb-2", "Storage path" } - p { class: "text-gray-600 mb-4", - "Update the storage path of the service. the default path is {volume_name_state}." - } - input { - class: "border rounded px-3 py-2 w-full focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "text", - value: volume_name_state, - oninput: move |evt| volume_name_state.set(evt.value().clone()), - } - } - } - div { class: "tab-content hidden", id: "user", - div { class: "mb-8", - h2 { class: "text-base font-medium mb-2", "User" } - p { class: "text-gray-600 mb-4", - "The user is the owner of the service. the default user is " - code { class: "bg-gray-100 px-1 py-0.5 rounded", {access_key_state} } - } - input { - class: "border rounded px-3 py-2 w-full focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "text", - value: access_key_state, - oninput: move |evt| access_key_state.set(evt.value().clone()), - } - } - div { class: "mb-8", - h2 { class: "text-base font-medium mb-2", "Password" } - p { class: "text-gray-600 mb-4", - "The password is the password of the user. the default password is " - code { class: "bg-gray-100 px-1 py-0.5 rounded", {secret_key_state} } - } - div { class: "relative", - input { - class: "border rounded px-3 py-2 w-full pr-10 focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "password", - value: secret_key_state, - oninput: move |evt| secret_key_state.set(evt.value().clone()), - } - button { - class: "absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-500 hover:text-gray-700", - "onclick": "togglePassword(this)", - svg { - class: "h-5 w-5", - fill: "currentColor", - view_box: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg", - path { d: "M10 12a2 2 0 100-4 2 2 0 000 4z" } - path { - clip_rule: "evenodd", - d: "M.458 10C1.732 5.943 5.522 3 10 3s8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7S1.732 14.057.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z", - fill_rule: "evenodd", - } - } - } - } - } - } - div { class: "tab-content hidden", id: "logs", - div { class: "mb-8", - h2 { class: "text-base font-medium mb-2", "Logs storage path" } - p { class: "text-gray-600 mb-4", - "The logs storage path is the path where the logs are stored. the default path is /var/log/rustfs. " - } - input { - class: "border rounded px-3 py-2 w-full focus:outline-none focus:ring-2 focus:ring-blue-500", - r#type: "text", - value: "/var/logs/rustfs", - } - } - } - } - div { class: "flex space-x-4", - button { - class: "bg-[#111827] text-white px-4 py-2 rounded hover:bg-[#1f2937]", - onclick: save_and_restart, - " Save and restart " - } - GoBackButton { "Back" } - } - LoadingSpinner { - loading: loading.read().to_owned(), - text: "Service processing...", - } - } - } -} diff --git a/cli/rustfs-gui/src/main.rs b/cli/rustfs-gui/src/main.rs deleted file mode 100644 index 7d1f373b..00000000 --- a/cli/rustfs-gui/src/main.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -mod components; -mod route; -mod utils; -mod views; - -fn main() { - let _worker_guard = utils::init_logger(); - dioxus::launch(views::App); -} diff --git a/cli/rustfs-gui/src/route/mod.rs b/cli/rustfs-gui/src/route/mod.rs deleted file mode 100644 index b9b1699d..00000000 --- a/cli/rustfs-gui/src/route/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -mod router; - -pub use router::Route; diff --git a/cli/rustfs-gui/src/route/router.rs b/cli/rustfs-gui/src/route/router.rs deleted file mode 100644 index 93a7be03..00000000 --- a/cli/rustfs-gui/src/route/router.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::components::Navbar; -use crate::views::{HomeViews, SettingViews}; -use dioxus::prelude::*; - -/// The router for the application -#[derive(Debug, Clone, Routable, PartialEq)] -#[rustfmt::skip] -pub enum Route { - #[layout(Navbar)] - #[route("/")] - HomeViews {}, - #[route("/settings")] - SettingViews {}, -} diff --git a/cli/rustfs-gui/src/utils/config.rs b/cli/rustfs-gui/src/utils/config.rs deleted file mode 100644 index 46d65815..00000000 --- a/cli/rustfs-gui/src/utils/config.rs +++ /dev/null @@ -1,564 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use keyring::Entry; -use serde::{Deserialize, Serialize}; -use std::error::Error; - -/// Configuration for the RustFS service -/// -/// # Fields -/// * `address` - The address of the RustFS service -/// * `host` - The host of the RustFS service -/// * `port` - The port of the RustFS service -/// * `access_key` - The access key of the RustFS service -/// * `secret_key` - The secret key of the RustFS service -/// * `domain_name` - The domain name of the RustFS service -/// * `volume_name` - The volume name of the RustFS service -/// * `console_address` - The console address of the RustFS service -/// -/// # Example -/// ``` -/// let config = RustFSConfig { -/// address: "127.0.0.1:9000".to_string(), -/// host: "127.0.0.1".to_string(), -/// port: "9000".to_string(), -/// access_key: "rustfsadmin".to_string(), -/// secret_key: "rustfsadmin".to_string(), -/// domain_name: "demo.rustfs.com".to_string(), -/// volume_name: "data".to_string(), -/// console_address: "127.0.0.1:9001".to_string(), -/// }; -/// println!("{:?}", config); -/// assert_eq!(config.address, "127.0.0.1:9000"); -/// ``` -#[derive(Debug, Clone, Default, Deserialize, Serialize, Ord, PartialOrd, Eq, PartialEq)] -pub struct RustFSConfig { - pub address: String, - pub host: String, - pub port: String, - pub access_key: String, - pub secret_key: String, - pub domain_name: String, - pub volume_name: String, - pub console_address: String, -} - -impl RustFSConfig { - /// keyring the name of the service - const SERVICE_NAME: &'static str = "rustfs-service"; - /// keyring the key of the service - const SERVICE_KEY: &'static str = "rustfs_key"; - /// default domain name - const DEFAULT_DOMAIN_NAME_VALUE: &'static str = "demo.rustfs.com"; - /// default address value - const DEFAULT_ADDRESS_VALUE: &'static str = "127.0.0.1:9000"; - /// default port value - const DEFAULT_PORT_VALUE: &'static str = "9000"; - /// default host value - const DEFAULT_HOST_VALUE: &'static str = "127.0.0.1"; - /// default access key value - const DEFAULT_ACCESS_KEY_VALUE: &'static str = "rustfsadmin"; - /// default secret key value - const DEFAULT_SECRET_KEY_VALUE: &'static str = "rustfsadmin"; - /// default console address value - const DEFAULT_CONSOLE_ADDRESS_VALUE: &'static str = "127.0.0.1:9001"; - - /// get the default volume_name - /// - /// # Returns - /// * The default volume name - /// - /// # Example - /// ``` - /// let volume_name = RustFSConfig::default_volume_name(); - /// ``` - pub fn default_volume_name() -> String { - dirs::home_dir() - .map(|home| home.join("rustfs").join("data")) - .and_then(|path| path.to_str().map(String::from)) - .unwrap_or_else(|| "data".to_string()) - } - - /// create a default configuration - /// - /// # Returns - /// * The default configuration - /// - /// # Example - /// ``` - /// let config = RustFSConfig::default_config(); - /// println!("{:?}", config); - /// assert_eq!(config.address, "127.0.0.1:9000"); - /// ``` - pub fn default_config() -> Self { - Self { - address: Self::DEFAULT_ADDRESS_VALUE.to_string(), - host: Self::DEFAULT_HOST_VALUE.to_string(), - port: Self::DEFAULT_PORT_VALUE.to_string(), - access_key: Self::DEFAULT_ACCESS_KEY_VALUE.to_string(), - secret_key: Self::DEFAULT_SECRET_KEY_VALUE.to_string(), - domain_name: Self::DEFAULT_DOMAIN_NAME_VALUE.to_string(), - volume_name: Self::default_volume_name(), - console_address: Self::DEFAULT_CONSOLE_ADDRESS_VALUE.to_string(), - } - } - - /// Load the configuration from the keyring - /// - /// # Errors - /// * If the configuration cannot be loaded from the keyring - /// * If the configuration cannot be deserialized - /// * If the address cannot be extracted from the configuration - /// - /// # Example - /// ``` - /// let config = RustFSConfig::load().unwrap(); - /// println!("{:?}", config); - /// assert_eq!(config.address, "127.0.0.1:9000"); - /// ``` - pub fn load() -> Result> { - let mut config = Self::default_config(); - - // Try to get the configuration of the storage from the keyring - let entry = Entry::new(Self::SERVICE_NAME, Self::SERVICE_KEY)?; - if let Ok(stored_json) = entry.get_password() { - if let Ok(stored_config) = serde_json::from_str::(&stored_json) { - // update fields that are not empty and non default - if !stored_config.address.is_empty() && stored_config.address != Self::DEFAULT_ADDRESS_VALUE { - config.address = stored_config.address; - let (host, port) = Self::extract_host_port(config.address.as_str()) - .ok_or_else(|| format!("Unable to extract host and port from address '{}'", config.address))?; - config.host = host.to_string(); - config.port = port.to_string(); - } - if !stored_config.access_key.is_empty() && stored_config.access_key != Self::DEFAULT_ACCESS_KEY_VALUE { - config.access_key = stored_config.access_key; - } - if !stored_config.secret_key.is_empty() && stored_config.secret_key != Self::DEFAULT_SECRET_KEY_VALUE { - config.secret_key = stored_config.secret_key; - } - if !stored_config.domain_name.is_empty() && stored_config.domain_name != Self::DEFAULT_DOMAIN_NAME_VALUE { - config.domain_name = stored_config.domain_name; - } - // The stored volume_name is updated only if it is not empty and different from the default - if !stored_config.volume_name.is_empty() && stored_config.volume_name != Self::default_volume_name() { - config.volume_name = stored_config.volume_name; - } - if !stored_config.console_address.is_empty() - && stored_config.console_address != Self::DEFAULT_CONSOLE_ADDRESS_VALUE - { - config.console_address = stored_config.console_address; - } - } - } - - Ok(config) - } - - /// Auxiliary method: Extract the host and port from the address string - /// # Arguments - /// * `address` - The address string - /// - /// # Returns - /// * `Some((host, port))` - The host and port - /// - /// # Errors - /// * If the address is not in the form 'host:port' - /// * If the port is not a valid u16 - /// - /// # Example - /// ``` - /// let (host, port) = RustFSConfig::extract_host_port("127.0.0.1:9000").unwrap(); - /// assert_eq!(host, "127.0.0.1"); - /// assert_eq!(port, 9000); - /// ``` - pub fn extract_host_port(address: &str) -> Option<(&str, u16)> { - let parts: Vec<&str> = address.split(':').collect(); - if parts.len() == 2 { - if let Ok(port) = parts[1].parse::() { - return Some((parts[0], port)); - } - } - None - } - - /// save the configuration to keyring - /// - /// # Errors - /// * If the configuration cannot be serialized - /// * If the configuration cannot be saved to the keyring - /// - /// # Example - /// ``` - /// let config = RustFSConfig::default_config(); - /// config.save().unwrap(); - /// ``` - pub fn save(&self) -> Result<(), Box> { - let entry = Entry::new(Self::SERVICE_NAME, Self::SERVICE_KEY)?; - let json = serde_json::to_string(self)?; - entry.set_password(&json)?; - Ok(()) - } - - /// Clear the stored configuration from the system keyring - /// - /// # Returns - /// `Ok(())` if the configuration was successfully cleared, or an error if the operation failed. - /// - /// # Example - /// ``` - /// RustFSConfig::clear().unwrap(); - /// ``` - #[allow(dead_code)] - pub fn clear() -> Result<(), Box> { - let entry = Entry::new(Self::SERVICE_NAME, Self::SERVICE_KEY)?; - entry.delete_credential()?; - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_rustfs_config_default() { - let config = RustFSConfig::default(); - assert!(config.address.is_empty()); - assert!(config.host.is_empty()); - assert!(config.port.is_empty()); - assert!(config.access_key.is_empty()); - assert!(config.secret_key.is_empty()); - assert!(config.domain_name.is_empty()); - assert!(config.volume_name.is_empty()); - assert!(config.console_address.is_empty()); - } - - #[test] - fn test_rustfs_config_creation() { - let config = RustFSConfig { - address: "192.168.1.100:9000".to_string(), - host: "192.168.1.100".to_string(), - port: "9000".to_string(), - access_key: "testuser".to_string(), - secret_key: "testpass".to_string(), - domain_name: "test.rustfs.com".to_string(), - volume_name: "/data/rustfs".to_string(), - console_address: "192.168.1.100:9001".to_string(), - }; - - assert_eq!(config.address, "192.168.1.100:9000"); - assert_eq!(config.host, "192.168.1.100"); - assert_eq!(config.port, "9000"); - assert_eq!(config.access_key, "testuser"); - assert_eq!(config.secret_key, "testpass"); - assert_eq!(config.domain_name, "test.rustfs.com"); - assert_eq!(config.volume_name, "/data/rustfs"); - assert_eq!(config.console_address, "192.168.1.100:9001"); - } - - #[test] - fn test_default_volume_name() { - let volume_name = RustFSConfig::default_volume_name(); - assert!(!volume_name.is_empty()); - // Should either be the home directory path or fallback to "data" - assert!(volume_name.contains("rustfs") || volume_name == "data"); - } - - #[test] - fn test_default_config() { - let config = RustFSConfig::default_config(); - assert_eq!(config.address, RustFSConfig::DEFAULT_ADDRESS_VALUE); - assert_eq!(config.host, RustFSConfig::DEFAULT_HOST_VALUE); - assert_eq!(config.port, RustFSConfig::DEFAULT_PORT_VALUE); - assert_eq!(config.access_key, RustFSConfig::DEFAULT_ACCESS_KEY_VALUE); - assert_eq!(config.secret_key, RustFSConfig::DEFAULT_SECRET_KEY_VALUE); - assert_eq!(config.domain_name, RustFSConfig::DEFAULT_DOMAIN_NAME_VALUE); - assert_eq!(config.console_address, RustFSConfig::DEFAULT_CONSOLE_ADDRESS_VALUE); - assert!(!config.volume_name.is_empty()); - } - - #[test] - fn test_extract_host_port_valid() { - let test_cases = vec![ - ("127.0.0.1:9000", Some(("127.0.0.1", 9000))), - ("localhost:8080", Some(("localhost", 8080))), - ("192.168.1.100:3000", Some(("192.168.1.100", 3000))), - ("0.0.0.0:80", Some(("0.0.0.0", 80))), - ("example.com:443", Some(("example.com", 443))), - ]; - - for (input, expected) in test_cases { - let result = RustFSConfig::extract_host_port(input); - assert_eq!(result, expected, "Failed for input: {input}"); - } - } - - #[test] - fn test_extract_host_port_invalid() { - let invalid_cases = vec![ - "127.0.0.1", // Missing port - "127.0.0.1:", // Empty port - "127.0.0.1:abc", // Invalid port - "127.0.0.1:99999", // Port out of range - "", // Empty string - "127.0.0.1:9000:extra", // Too many parts - "invalid", // No colon - ]; - - for input in invalid_cases { - let result = RustFSConfig::extract_host_port(input); - assert_eq!(result, None, "Should be None for input: {input}"); - } - - // Special case: empty host but valid port should still work - let result = RustFSConfig::extract_host_port(":9000"); - assert_eq!(result, Some(("", 9000))); - } - - #[test] - fn test_extract_host_port_edge_cases() { - // Test edge cases for port numbers - assert_eq!(RustFSConfig::extract_host_port("host:0"), Some(("host", 0))); - assert_eq!(RustFSConfig::extract_host_port("host:65535"), Some(("host", 65535))); - assert_eq!(RustFSConfig::extract_host_port("host:65536"), None); // Out of range - } - - #[test] - fn test_serialization() { - let config = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "admin".to_string(), - secret_key: "password".to_string(), - domain_name: "test.com".to_string(), - volume_name: "/data".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - let json = serde_json::to_string(&config).unwrap(); - assert!(json.contains("127.0.0.1:9000")); - assert!(json.contains("admin")); - assert!(json.contains("test.com")); - } - - #[test] - fn test_deserialization() { - let json = r#"{ - "address": "192.168.1.100:9000", - "host": "192.168.1.100", - "port": "9000", - "access_key": "testuser", - "secret_key": "testpass", - "domain_name": "example.com", - "volume_name": "/opt/data", - "console_address": "192.168.1.100:9001" - }"#; - - let config: RustFSConfig = serde_json::from_str(json).unwrap(); - assert_eq!(config.address, "192.168.1.100:9000"); - assert_eq!(config.host, "192.168.1.100"); - assert_eq!(config.port, "9000"); - assert_eq!(config.access_key, "testuser"); - assert_eq!(config.secret_key, "testpass"); - assert_eq!(config.domain_name, "example.com"); - assert_eq!(config.volume_name, "/opt/data"); - assert_eq!(config.console_address, "192.168.1.100:9001"); - } - - #[test] - fn test_serialization_deserialization_roundtrip() { - let original_config = RustFSConfig { - address: "10.0.0.1:8080".to_string(), - host: "10.0.0.1".to_string(), - port: "8080".to_string(), - access_key: "roundtrip_user".to_string(), - secret_key: "roundtrip_pass".to_string(), - domain_name: "roundtrip.test".to_string(), - volume_name: "/tmp/roundtrip".to_string(), - console_address: "10.0.0.1:8081".to_string(), - }; - - let json = serde_json::to_string(&original_config).unwrap(); - let deserialized_config: RustFSConfig = serde_json::from_str(&json).unwrap(); - - assert_eq!(original_config, deserialized_config); - } - - #[test] - fn test_config_ordering() { - let config1 = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "admin".to_string(), - secret_key: "password".to_string(), - domain_name: "test.com".to_string(), - volume_name: "/data".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - let config2 = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "admin".to_string(), - secret_key: "password".to_string(), - domain_name: "test.com".to_string(), - volume_name: "/data".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - let config3 = RustFSConfig { - address: "127.0.0.1:9001".to_string(), // Different port - host: "127.0.0.1".to_string(), - port: "9001".to_string(), - access_key: "admin".to_string(), - secret_key: "password".to_string(), - domain_name: "test.com".to_string(), - volume_name: "/data".to_string(), - console_address: "127.0.0.1:9002".to_string(), - }; - - assert_eq!(config1, config2); - assert_ne!(config1, config3); - assert!(config1 < config3); // Lexicographic ordering - } - - #[test] - fn test_clone() { - let original = RustFSConfig::default_config(); - let cloned = original.clone(); - - assert_eq!(original, cloned); - assert_eq!(original.address, cloned.address); - assert_eq!(original.access_key, cloned.access_key); - } - - #[test] - fn test_debug_format() { - let config = RustFSConfig::default_config(); - let debug_str = format!("{config:?}"); - - assert!(debug_str.contains("RustFSConfig")); - assert!(debug_str.contains("address")); - assert!(debug_str.contains("127.0.0.1:9000")); - } - - #[test] - fn test_constants() { - assert_eq!(RustFSConfig::SERVICE_NAME, "rustfs-service"); - assert_eq!(RustFSConfig::SERVICE_KEY, "rustfs_key"); - assert_eq!(RustFSConfig::DEFAULT_DOMAIN_NAME_VALUE, "demo.rustfs.com"); - assert_eq!(RustFSConfig::DEFAULT_ADDRESS_VALUE, "127.0.0.1:9000"); - assert_eq!(RustFSConfig::DEFAULT_PORT_VALUE, "9000"); - assert_eq!(RustFSConfig::DEFAULT_HOST_VALUE, "127.0.0.1"); - assert_eq!(RustFSConfig::DEFAULT_ACCESS_KEY_VALUE, "rustfsadmin"); - assert_eq!(RustFSConfig::DEFAULT_SECRET_KEY_VALUE, "rustfsadmin"); - assert_eq!(RustFSConfig::DEFAULT_CONSOLE_ADDRESS_VALUE, "127.0.0.1:9001"); - } - - #[test] - fn test_empty_strings() { - let config = RustFSConfig { - address: "".to_string(), - host: "".to_string(), - port: "".to_string(), - access_key: "".to_string(), - secret_key: "".to_string(), - domain_name: "".to_string(), - volume_name: "".to_string(), - console_address: "".to_string(), - }; - - assert!(config.address.is_empty()); - assert!(config.host.is_empty()); - assert!(config.port.is_empty()); - assert!(config.access_key.is_empty()); - assert!(config.secret_key.is_empty()); - assert!(config.domain_name.is_empty()); - assert!(config.volume_name.is_empty()); - assert!(config.console_address.is_empty()); - } - - #[test] - fn test_very_long_strings() { - let long_string = "a".repeat(1000); - let config = RustFSConfig { - address: format!("{long_string}:9000"), - host: long_string.clone(), - port: "9000".to_string(), - access_key: long_string.clone(), - secret_key: long_string.clone(), - domain_name: format!("{long_string}.com"), - volume_name: format!("/data/{long_string}"), - console_address: format!("{long_string}:9001"), - }; - - assert_eq!(config.host.len(), 1000); - assert_eq!(config.access_key.len(), 1000); - assert_eq!(config.secret_key.len(), 1000); - } - - #[test] - fn test_special_characters() { - let config = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "user@domain.com".to_string(), - secret_key: "p@ssw0rd!#$%".to_string(), - domain_name: "test-domain.example.com".to_string(), - volume_name: "/data/rust-fs/storage".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - assert!(config.access_key.contains("@")); - assert!(config.secret_key.contains("!#$%")); - assert!(config.domain_name.contains("-")); - assert!(config.volume_name.contains("/")); - } - - #[test] - fn test_unicode_strings() { - let config = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "username".to_string(), - secret_key: "password123".to_string(), - domain_name: "test.com".to_string(), - volume_name: "/data/storage".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - assert_eq!(config.access_key, "username"); - assert_eq!(config.secret_key, "password123"); - assert_eq!(config.domain_name, "test.com"); - assert_eq!(config.volume_name, "/data/storage"); - } - - #[test] - fn test_memory_efficiency() { - // Test that the structure doesn't use excessive memory - assert!(std::mem::size_of::() < 1000); - } - - // Note: Keyring-related tests (load, save, clear) are not included here - // because they require actual keyring access and would be integration tests - // rather than unit tests. They should be tested separately in an integration - // test environment where keyring access can be properly mocked or controlled. -} diff --git a/cli/rustfs-gui/src/utils/helper.rs b/cli/rustfs-gui/src/utils/helper.rs deleted file mode 100644 index 2fda31ec..00000000 --- a/cli/rustfs-gui/src/utils/helper.rs +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::utils::RustFSConfig; -use dioxus::logger::tracing::{debug, error, info}; -use rust_embed::RustEmbed; -use sha2::{Digest, Sha256}; -use std::error::Error; -use std::path::{Path, PathBuf}; -use std::process::Command as StdCommand; -use std::sync::LazyLock; -use std::time::Duration; -use tokio::fs; -use tokio::fs::File; -use tokio::io::AsyncWriteExt; -use tokio::net::TcpStream; -use tokio::sync::{Mutex, mpsc}; - -#[derive(RustEmbed)] -#[folder = "$CARGO_MANIFEST_DIR/embedded-rustfs/"] -struct Asset; - -// Use `LazyLock` to cache the checksum of embedded resources -static RUSTFS_HASH: LazyLock> = LazyLock::new(|| { - let rustfs_file = if cfg!(windows) { "rustfs.exe" } else { "rustfs" }; - let rustfs_data = Asset::get(rustfs_file).expect("RustFs binary not embedded"); - let hash = hex::encode(Sha256::digest(&rustfs_data.data)); - Mutex::new(hash) -}); - -/// Service command -/// This enum represents the commands that can be sent to the service manager -/// to start, stop, or restart the service -/// The `Start` variant contains the configuration for the service -/// The `Restart` variant contains the configuration for the service -/// -/// # Example -/// ``` -/// let config = RustFSConfig { -/// address: "127.0.0.1:9000".to_string(), -/// host: "127.0.0.1".to_string(), -/// port: "9000".to_string(), -/// access_key: "rustfsadmin".to_string(), -/// secret_key: "rustfsadmin".to_string(), -/// domain_name: "demo.rustfs.com".to_string(), -/// volume_name: "data".to_string(), -/// console_address: "127.0.0.1:9001".to_string(), -/// }; -/// -/// let command = ServiceCommand::Start(config); -/// println!("{:?}", command); -/// -/// assert_eq!(command, ServiceCommand::Start(config)); -/// ``` -pub enum ServiceCommand { - Start(RustFSConfig), - Stop, - Restart(RustFSConfig), -} - -/// Service operation result -/// This struct represents the result of a service operation -/// It contains information about the success of the operation, -/// -/// # Example -/// ``` -/// use chrono::Local; -/// -/// let result = ServiceOperationResult { -/// success: true, -/// start_time: chrono::Local::now(), -/// end_time: chrono::Local::now(), -/// message: "Service started successfully".to_string(), -/// }; -/// -/// println!("{:?}", result); -/// assert_eq!(result.success, true); -/// ``` -#[derive(Debug)] -pub struct ServiceOperationResult { - pub success: bool, - pub start_time: chrono::DateTime, - pub end_time: chrono::DateTime, - pub message: String, -} - -/// Service manager -/// This struct represents a service manager that can be used to start, stop, or restart a service -/// It contains a command sender that can be used to send commands to the service manager -/// -/// # Example -/// ``` -/// let service_manager = ServiceManager::new(); -/// println!("{:?}", service_manager); -/// ``` -#[derive(Debug, Clone)] -pub struct ServiceManager { - command_tx: mpsc::Sender, - // process: Arc>>, - // pid: Arc>>, // Add PID storage - // current_config: Arc>>, // Add configuration storage -} - -impl ServiceManager { - /// check if the service is running and return a pid - /// This function is platform dependent - /// On Unix systems, it uses the `ps` command to check for the service - /// On Windows systems, it uses the `wmic` command to check for the service - /// - /// # Example - /// ``` - /// let pid = check_service_status().await; - /// println!("{:?}", pid); - /// ``` - pub async fn check_service_status() -> Option { - #[cfg(unix)] - { - // use the ps command on a unix system - if let Ok(output) = StdCommand::new("ps").arg("-ef").output() { - let output_str = String::from_utf8_lossy(&output.stdout); - for line in output_str.lines() { - // match contains `rustfs/bin/rustfs` of the line - if line.contains("rustfs/bin/rustfs") && !line.contains("grep") { - if let Some(pid_str) = line.split_whitespace().nth(1) { - if let Ok(pid) = pid_str.parse::() { - return Some(pid); - } - } - } - } - } - } - - #[cfg(windows)] - { - if let Ok(output) = StdCommand::new("wmic") - .arg("process") - .arg("where") - .arg("caption='rustfs.exe'") - .arg("get") - .arg("processid") - .output() - { - let output_str = String::from_utf8_lossy(&output.stdout); - for line in output_str.lines() { - if let Ok(pid) = line.trim().parse::() { - return Some(pid); - } - } - } - } - - None - } - - /// Prepare the service - /// This function downloads the service executable if it doesn't exist - /// It also creates the necessary directories for the service - /// - /// # Example - /// ``` - /// let executable_path = prepare_service().await; - /// println!("{:?}", executable_path); - /// ``` - async fn prepare_service() -> Result> { - // get the user directory - let home_dir = dirs::home_dir().ok_or("Unable to get user directory")?; - let rustfs_dir = home_dir.join("rustfs"); - let bin_dir = rustfs_dir.join("bin"); - let data_dir = rustfs_dir.join("data"); - let logs_dir = rustfs_dir.join("logs"); - - // create the necessary directories - for dir in [&bin_dir, &data_dir, &logs_dir] { - if !dir.exists() { - tokio::fs::create_dir_all(dir).await?; - } - } - - let rustfs_file = if cfg!(windows) { "rustfs.exe" } else { "rustfs" }; - let executable_path = bin_dir.join(rustfs_file); - let hash_path = bin_dir.join("embedded_rustfs.sha256"); - - if executable_path.exists() && hash_path.exists() { - let cached_hash = fs::read_to_string(&hash_path).await?; - let expected_hash = RUSTFS_HASH.lock().await; - if cached_hash == *expected_hash { - println!("Use cached rustfs: {executable_path:?}"); - return Ok(executable_path); - } - } - - // Extract and write files - let rustfs_data = Asset::get(rustfs_file).expect("RustFS binary not embedded"); - let mut file = File::create(&executable_path).await?; - file.write_all(&rustfs_data.data).await?; - let expected_hash = hex::encode(Sha256::digest(&rustfs_data.data)); - fs::write(&hash_path, expected_hash).await?; - - // set execution permissions on unix systems - #[cfg(unix)] - { - use std::os::unix::fs::PermissionsExt; - let mut perms = std::fs::metadata(&executable_path)?.permissions(); - perms.set_mode(0o755); - std::fs::set_permissions(&executable_path, perms)?; - } - - Ok(executable_path) - } - - /// Helper function: Extracts the port from the address string - /// - /// # Example - /// ``` - /// let address = "127.0.0.1:9000"; - /// let port = extract_port(address); - /// println!("{:?}", port); - /// ``` - fn extract_port(address: &str) -> Option { - address.split(':').nth(1)?.parse().ok() - } - - /// Create a new instance of the service manager - /// - /// # Example - /// ``` - /// let service_manager = ServiceManager::new(); - /// println!("{:?}", service_manager); - /// ``` - pub(crate) fn new() -> Self { - let (command_tx, mut command_rx) = mpsc::channel(10); - // Start the control loop - tokio::spawn(async move { - while let Some(cmd) = command_rx.recv().await { - match cmd { - ServiceCommand::Start(config) => { - if let Err(e) = Self::start_service(&config).await { - Self::show_error(&format!("Failed to start service: {e}")); - } - } - ServiceCommand::Stop => { - if let Err(e) = Self::stop_service().await { - Self::show_error(&format!("Failed to stop service: {e}")); - } - } - ServiceCommand::Restart(config) => { - if Self::check_service_status().await.is_some() { - if let Err(e) = Self::stop_service().await { - Self::show_error(&format!("Failed to restart service: {e}")); - continue; - } - } - if let Err(e) = Self::start_service(&config).await { - Self::show_error(&format!("Failed to restart service: {e}")); - } - } - } - } - }); - - ServiceManager { command_tx } - } - - /// Start the service - /// This function starts the service with the given configuration - /// - /// # Example - /// ``` - /// let config = RustFSConfig { - /// address: "127.0.0.1:9000".to_string(), - /// host: "127.0.0.1".to_string(), - /// port: "9000".to_string(), - /// access_key: "rustfsadmin".to_string(), - /// secret_key: "rustfsadmin".to_string(), - /// domain_name: "demo.rustfs.com".to_string(), - /// volume_name: "data".to_string(), - /// console_address: "127.0.0.1:9001".to_string(), - /// }; - /// - /// let result = start_service(&config).await; - /// println!("{:?}", result); - /// ``` - async fn start_service(config: &RustFSConfig) -> Result<(), Box> { - // Check if the service is already running - if let Some(existing_pid) = Self::check_service_status().await { - return Err(format!("Service is already running, PID: {existing_pid}").into()); - } - - // Prepare the service program - let executable_path = Self::prepare_service().await?; - // Check the data catalog - let volume_name_path = Path::new(&config.volume_name); - if !volume_name_path.exists() { - tokio::fs::create_dir_all(&config.volume_name).await?; - } - - // Extract the port from the configuration - let main_port = Self::extract_port(&config.address).ok_or("Unable to parse main service port")?; - let console_port = Self::extract_port(&config.console_address).ok_or("Unable to parse console port")?; - - let host = config.address.split(':').next().ok_or("Unable to parse host address")?; - - // Check the port - let ports = vec![main_port, console_port]; - for port in ports { - if Self::is_port_in_use(host, port).await { - return Err(format!("Port {port} is already in use").into()); - } - } - - // Start the service - let mut child = tokio::process::Command::new(executable_path) - .arg("--address") - .arg(&config.address) - .arg("--access-key") - .arg(&config.access_key) - .arg("--secret-key") - .arg(&config.secret_key) - .arg("--console-address") - .arg(&config.console_address) - .arg(config.volume_name.clone()) - .spawn()?; - - let process_pid = child.id().unwrap(); - // Wait for the service to start - tokio::time::sleep(Duration::from_secs(2)).await; - - // Check if the service started successfully - if Self::is_port_in_use(host, main_port).await { - Self::show_info(&format!("Service started successfully! Process ID: {process_pid}")); - - Ok(()) - } else { - child.kill().await?; - Err("Service failed to start".into()) - } - } - - /// Stop the service - /// This function stops the service - /// - /// # Example - /// ``` - /// let result = stop_service().await; - /// println!("{:?}", result); - /// ``` - async fn stop_service() -> Result<(), Box> { - let existing_pid = Self::check_service_status().await; - debug!("existing_pid: {:?}", existing_pid); - if let Some(service_pid) = existing_pid { - // An attempt was made to terminate the process - #[cfg(unix)] - { - StdCommand::new("kill").arg("-9").arg(service_pid.to_string()).output()?; - } - - #[cfg(windows)] - { - StdCommand::new("taskkill") - .arg("/F") - .arg("/PID") - .arg(service_pid.to_string()) - .output()?; - } - - // Verify that the service is indeed stopped - tokio::time::sleep(Duration::from_secs(1)).await; - if Self::check_service_status().await.is_some() { - return Err("Service failed to stop".into()); - } - Self::show_info("Service stopped successfully"); - - Ok(()) - } else { - Err("Service is not running".into()) - } - } - - /// Check if the port is in use - /// This function checks if the given port is in use on the given host - /// - /// # Example - /// ``` - /// let host = "127.0.0.1"; - /// let port = 9000; - /// let result = is_port_in_use(host, port).await; - /// println!("{:?}", result); - /// ``` - async fn is_port_in_use(host: &str, port: u16) -> bool { - TcpStream::connect(format!("{host}:{port}")).await.is_ok() - } - - /// Show an error message - /// This function shows an error message dialog - /// - /// # Example - /// ``` - /// show_error("This is an error message"); - /// ``` - pub(crate) fn show_error(message: &str) { - rfd::MessageDialog::new() - .set_title("Error") - .set_description(message) - .set_level(rfd::MessageLevel::Error) - .show(); - } - - /// Show an information message - /// This function shows an information message dialog - /// - /// # Example - /// ``` - /// show_info("This is an information message"); - /// ``` - pub(crate) fn show_info(message: &str) { - rfd::MessageDialog::new() - .set_title("Success") - .set_description(message) - .set_level(rfd::MessageLevel::Info) - .show(); - } - - /// Start the service - /// This function sends a `Start` command to the service manager - /// - /// # Example - /// ``` - /// let config = RustFSConfig { - /// address: "127.0.0.1:9000".to_string(), - /// host: "127.0.0.1".to_string(), - /// port: "9000".to_string(), - /// access_key: "rustfsadmin".to_string(), - /// secret_key: "rustfsadmin".to_string(), - /// domain_name: "demo.rustfs.com".to_string(), - /// volume_name: "data".to_string(), - /// console_address: "127.0.0.1:9001".to_string(), - /// }; - /// - /// let service_manager = ServiceManager::new(); - /// let result = service_manager.start(config).await; - /// println!("{:?}", result); - /// ``` - /// - /// # Errors - /// This function returns an error if the service fails to start - /// - /// # Panics - /// This function panics if the port number is invalid - /// - /// # Safety - /// This function is not marked as unsafe - /// - /// # Performance - /// This function is not optimized for performance - /// - /// # Design - /// This function is designed to be simple and easy to use - /// - /// # Security - /// This function does not have any security implications - pub async fn start(&self, config: RustFSConfig) -> Result> { - let start_time = chrono::Local::now(); - self.command_tx.send(ServiceCommand::Start(config.clone())).await?; - - let host = &config.host; - let port = config.port.parse::().expect("Invalid port number"); - // wait for the service to actually start - let mut retries = 0; - while retries < 30 { - // wait up to 30 seconds - if Self::check_service_status().await.is_some() && Self::is_port_in_use(host, port).await { - let end_time = chrono::Local::now(); - return Ok(ServiceOperationResult { - success: true, - start_time, - end_time, - message: "Service started successfully".to_string(), - }); - } - tokio::time::sleep(Duration::from_secs(1)).await; - retries += 1; - } - - Err("Service start timeout".into()) - } - - /// Stop the service - /// This function sends a `Stop` command to the service manager - /// - /// # Example - /// ``` - /// let service_manager = ServiceManager::new(); - /// let result = service_manager.stop().await; - /// println!("{:?}", result); - /// ``` - /// - /// # Errors - /// This function returns an error if the service fails to stop - /// - /// # Panics - /// This function panics if the port number is invalid - /// - /// # Safety - /// This function is not marked as unsafe - /// - /// # Performance - /// This function is not optimized for performance - /// - /// # Design - /// This function is designed to be simple and easy to use - /// - /// # Security - /// This function does not have any security implications - pub async fn stop(&self) -> Result> { - let start_time = chrono::Local::now(); - self.command_tx.send(ServiceCommand::Stop).await?; - - // Wait for the service to actually stop - let mut retries = 0; - while retries < 15 { - // Wait up to 15 seconds - if Self::check_service_status().await.is_none() { - let end_time = chrono::Local::now(); - return Ok(ServiceOperationResult { - success: true, - start_time, - end_time, - message: "Service stopped successfully".to_string(), - }); - } - tokio::time::sleep(Duration::from_secs(1)).await; - retries += 1; - } - - Err("Service stop timeout".into()) - } - - /// Restart the service - /// This function sends a `Restart` command to the service manager - /// - /// # Example - /// ``` - /// let config = RustFSConfig { - /// address: "127.0.0.1:9000".to_string(), - /// host: "127.0.0.1".to_string(), - /// port: "9000".to_string(), - /// access_key: "rustfsadmin".to_string(), - /// secret_key: "rustfsadmin".to_string(), - /// domain_name: "demo.rustfs.com".to_string(), - /// volume_name: "data".to_string(), - /// console_address: "127.0.0.1:9001".to_string(), - /// }; - /// - /// let service_manager = ServiceManager::new(); - /// let result = service_manager.restart(config).await; - /// println!("{:?}", result); - /// ``` - /// - /// # Errors - /// This function returns an error if the service fails to restart - /// - /// # Panics - /// This function panics if the port number is invalid - /// - /// # Safety - /// This function is not marked as unsafe - /// - /// # Performance - /// This function is not optimized for performance - /// - /// # Design - /// This function is designed to be simple and easy to use - /// - /// # Security - /// This function does not have any security implications - pub async fn restart(&self, config: RustFSConfig) -> Result> { - let start_time = chrono::Local::now(); - self.command_tx.send(ServiceCommand::Restart(config.clone())).await?; - - let host = &config.host; - let port = config.port.parse::().expect("Invalid port number"); - - // wait for the service to restart - let mut retries = 0; - while retries < 45 { - // Longer waiting time is given as both the stop and start processes are involved - if Self::check_service_status().await.is_some() && Self::is_port_in_use(host, port).await { - match config.save() { - Ok(_) => info!("save config success"), - Err(e) => { - error!("save config error: {}", e); - self.command_tx.send(ServiceCommand::Stop).await?; - Self::show_error("Failed to save configuration"); - return Err("Failed to save configuration".into()); - } - } - let end_time = chrono::Local::now(); - return Ok(ServiceOperationResult { - success: true, - start_time, - end_time, - message: "Service restarted successfully".to_string(), - }); - } - tokio::time::sleep(Duration::from_secs(1)).await; - retries += 1; - } - Err("Service restart timeout".into()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::time::Duration; - - #[test] - fn test_service_command_creation() { - let config = RustFSConfig::default_config(); - - let start_cmd = ServiceCommand::Start(config.clone()); - let stop_cmd = ServiceCommand::Stop; - let restart_cmd = ServiceCommand::Restart(config); - - // Test that commands can be created - match start_cmd { - ServiceCommand::Start(_) => {} - _ => panic!("Expected Start command"), - } - - match stop_cmd { - ServiceCommand::Stop => {} - _ => panic!("Expected Stop command"), - } - - match restart_cmd { - ServiceCommand::Restart(_) => {} - _ => panic!("Expected Restart command"), - } - } - - #[test] - fn test_service_operation_result_creation() { - let start_time = chrono::Local::now(); - let end_time = chrono::Local::now(); - - let success_result = ServiceOperationResult { - success: true, - start_time, - end_time, - message: "Operation successful".to_string(), - }; - - let failure_result = ServiceOperationResult { - success: false, - start_time, - end_time, - message: "Operation failed".to_string(), - }; - - assert!(success_result.success); - assert_eq!(success_result.message, "Operation successful"); - - assert!(!failure_result.success); - assert_eq!(failure_result.message, "Operation failed"); - } - - #[test] - fn test_service_operation_result_debug() { - let result = ServiceOperationResult { - success: true, - start_time: chrono::Local::now(), - end_time: chrono::Local::now(), - message: "Test message".to_string(), - }; - - let debug_str = format!("{result:?}"); - assert!(debug_str.contains("ServiceOperationResult")); - assert!(debug_str.contains("success: true")); - assert!(debug_str.contains("Test message")); - } - - #[test] - fn test_service_manager_creation() { - // Test ServiceManager creation in a tokio runtime - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let service_manager = ServiceManager::new(); - - // Test that ServiceManager can be created and cloned - let cloned_manager = service_manager.clone(); - - // Both should be valid (we can't test much more without async runtime) - assert!(format!("{service_manager:?}").contains("ServiceManager")); - assert!(format!("{cloned_manager:?}").contains("ServiceManager")); - }); - } - - #[test] - fn test_extract_port_valid() { - let test_cases = vec![ - ("127.0.0.1:9000", Some(9000)), - ("localhost:8080", Some(8080)), - ("192.168.1.100:3000", Some(3000)), - ("0.0.0.0:80", Some(80)), - ("example.com:443", Some(443)), - ("host:65535", Some(65535)), - ("host:1", Some(1)), - ]; - - for (input, expected) in test_cases { - let result = ServiceManager::extract_port(input); - assert_eq!(result, expected, "Failed for input: {input}"); - } - } - - #[test] - fn test_extract_port_invalid() { - let invalid_cases = vec![ - "127.0.0.1", // Missing port - "127.0.0.1:", // Empty port - "127.0.0.1:abc", // Invalid port - "127.0.0.1:99999", // Port out of range - "", // Empty string - "invalid", // No colon - "host:-1", // Negative port - "host:0.5", // Decimal port - ]; - - for input in invalid_cases { - let result = ServiceManager::extract_port(input); - assert_eq!(result, None, "Should be None for input: {input}"); - } - - // Special case: empty host but valid port should still work - assert_eq!(ServiceManager::extract_port(":9000"), Some(9000)); - - // Special case: multiple colons - extract_port takes the second part - // For "127.0.0.1:9000:extra", it takes "9000" which is valid - assert_eq!(ServiceManager::extract_port("127.0.0.1:9000:extra"), Some(9000)); - } - - #[test] - fn test_extract_port_edge_cases() { - // Test edge cases for port numbers - assert_eq!(ServiceManager::extract_port("host:0"), Some(0)); - assert_eq!(ServiceManager::extract_port("host:65535"), Some(65535)); - assert_eq!(ServiceManager::extract_port("host:65536"), None); // Out of range - // IPv6-like address - extract_port takes the second part after split(':') - // For "::1:8080", split(':') gives ["", "", "1", "8080"], nth(1) gives "" - assert_eq!(ServiceManager::extract_port("::1:8080"), None); // Second part is empty - // For "[::1]:8080", split(':') gives ["[", "", "1]", "8080"], nth(1) gives "" - assert_eq!(ServiceManager::extract_port("[::1]:8080"), None); // Second part is empty - } - - #[test] - fn test_show_error() { - // Test that show_error function exists and can be called - // We can't actually test the dialog in a test environment - // so we just verify the function signature - } - - #[test] - fn test_show_info() { - // Test that show_info function exists and can be called - // We can't actually test the dialog in a test environment - // so we just verify the function signature - } - - #[test] - fn test_service_operation_result_timing() { - let start_time = chrono::Local::now(); - std::thread::sleep(Duration::from_millis(10)); // Small delay - let end_time = chrono::Local::now(); - - let result = ServiceOperationResult { - success: true, - start_time, - end_time, - message: "Timing test".to_string(), - }; - - // End time should be after start time - assert!(result.end_time >= result.start_time); - } - - #[test] - fn test_service_operation_result_with_unicode() { - let result = ServiceOperationResult { - success: true, - start_time: chrono::Local::now(), - end_time: chrono::Local::now(), - message: "Operation successful 🎉".to_string(), - }; - - assert_eq!(result.message, "Operation successful 🎉"); - assert!(result.success); - } - - #[test] - fn test_service_operation_result_with_long_message() { - let long_message = "A".repeat(10000); - let result = ServiceOperationResult { - success: false, - start_time: chrono::Local::now(), - end_time: chrono::Local::now(), - message: long_message.clone(), - }; - - assert_eq!(result.message.len(), 10000); - assert_eq!(result.message, long_message); - assert!(!result.success); - } - - #[test] - fn test_service_command_with_different_configs() { - let config1 = RustFSConfig { - address: "127.0.0.1:9000".to_string(), - host: "127.0.0.1".to_string(), - port: "9000".to_string(), - access_key: "admin1".to_string(), - secret_key: "pass1".to_string(), - domain_name: "test1.com".to_string(), - volume_name: "/data1".to_string(), - console_address: "127.0.0.1:9001".to_string(), - }; - - let config2 = RustFSConfig { - address: "192.168.1.100:8080".to_string(), - host: "192.168.1.100".to_string(), - port: "8080".to_string(), - access_key: "admin2".to_string(), - secret_key: "pass2".to_string(), - domain_name: "test2.com".to_string(), - volume_name: "/data2".to_string(), - console_address: "192.168.1.100:8081".to_string(), - }; - - let start_cmd1 = ServiceCommand::Start(config1); - let restart_cmd2 = ServiceCommand::Restart(config2); - - // Test that different configs can be used - match start_cmd1 { - ServiceCommand::Start(config) => { - assert_eq!(config.address, "127.0.0.1:9000"); - assert_eq!(config.access_key, "admin1"); - } - _ => panic!("Expected Start command"), - } - - match restart_cmd2 { - ServiceCommand::Restart(config) => { - assert_eq!(config.address, "192.168.1.100:8080"); - assert_eq!(config.access_key, "admin2"); - } - _ => panic!("Expected Restart command"), - } - } - - #[test] - fn test_memory_efficiency() { - // Test that structures don't use excessive memory - assert!(std::mem::size_of::() < 2000); - assert!(std::mem::size_of::() < 1000); - assert!(std::mem::size_of::() < 1000); - } - - // Note: The following methods are not tested here because they require: - // - Async runtime (tokio) - // - File system access - // - Network access - // - Process management - // - External dependencies (embedded assets) - // - // These should be tested in integration tests: - // - check_service_status() - // - prepare_service() - // - start_service() - // - stop_service() - // - is_port_in_use() - // - ServiceManager::start() - // - ServiceManager::stop() - // - ServiceManager::restart() - // - // The RUSTFS_HASH lazy_static is also not tested here as it depends - // on embedded assets that may not be available in unit test environment. -} diff --git a/cli/rustfs-gui/src/utils/logger.rs b/cli/rustfs-gui/src/utils/logger.rs deleted file mode 100644 index b51bbd65..00000000 --- a/cli/rustfs-gui/src/utils/logger.rs +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use dioxus::logger::tracing::debug; -use tracing_appender::non_blocking::WorkerGuard; -use tracing_appender::rolling::{RollingFileAppender, Rotation}; -use tracing_subscriber::fmt; -use tracing_subscriber::layer::SubscriberExt; -use tracing_subscriber::util::SubscriberInitExt; - -/// Initialize the logger with a rolling file appender -/// that rotates log files daily -pub fn init_logger() -> WorkerGuard { - // configuring rolling logs rolling by day - let home_dir = dirs::home_dir().expect("Unable to get user directory"); - let rustfs_dir = home_dir.join("rustfs"); - let logs_dir = rustfs_dir.join("logs"); - let file_appender = RollingFileAppender::builder() - .rotation(Rotation::DAILY) // rotate log files once every hour - .filename_prefix("rustfs-cli") // log file names will be prefixed with `myapp.` - .filename_suffix("log") // log file names will be suffixed with `.log` - .build(logs_dir) // try to build an appender that stores log files in `/ var/ log` - .expect("initializing rolling file appender failed"); - // non-blocking writer for improved performance - let (non_blocking_file, worker_guard) = tracing_appender::non_blocking(file_appender); - - // console output layer - let console_layer = fmt::layer() - .with_writer(std::io::stdout) - .with_ansi(true) - .with_line_number(true); // enable colors in the console - - // file output layer - let file_layer = fmt::layer() - .with_writer(non_blocking_file) - .with_ansi(false) - .with_thread_names(true) - .with_target(true) - .with_thread_ids(true) - .with_level(true) - .with_line_number(true); // disable colors in the file - - // Combine all tiers and initialize global subscribers - tracing_subscriber::registry() - .with(console_layer) - .with(file_layer) - .with(tracing_subscriber::EnvFilter::new("info")) // filter the log level by environment variables - .init(); - debug!("Logger initialized"); - worker_guard -} - -#[cfg(test)] -mod tests { - use super::*; - use std::sync::Once; - - static INIT: Once = Once::new(); - - // Helper function to ensure logger is only initialized once in tests - fn ensure_logger_init() { - INIT.call_once(|| { - // Initialize a simple test logger to avoid conflicts - let _ = tracing_subscriber::fmt().with_test_writer().try_init(); - }); - } - - #[test] - fn test_logger_initialization_components() { - ensure_logger_init(); - - // Test that we can create the components used in init_logger - // without actually initializing the global logger again - - // Test home directory access - let home_dir_result = dirs::home_dir(); - assert!(home_dir_result.is_some(), "Should be able to get home directory"); - - let home_dir = home_dir_result.unwrap(); - let rustfs_dir = home_dir.join("rustfs"); - let logs_dir = rustfs_dir.join("logs"); - - // Test path construction - assert!(rustfs_dir.to_string_lossy().contains("rustfs")); - assert!(logs_dir.to_string_lossy().contains("logs")); - } - - #[test] - fn test_rolling_file_appender_builder() { - ensure_logger_init(); - - // Test that we can create a RollingFileAppender builder - let builder = RollingFileAppender::builder() - .rotation(Rotation::DAILY) - .filename_prefix("test-rustfs-cli") - .filename_suffix("log"); - - // We can't actually build it without creating directories, - // but we can verify the builder pattern works - let debug_str = format!("{builder:?}"); - // The actual debug format might be different, so just check it's not empty - assert!(!debug_str.is_empty()); - // Check that it contains some expected parts - assert!(debug_str.contains("Builder") || debug_str.contains("builder") || debug_str.contains("RollingFileAppender")); - } - - #[test] - fn test_rotation_types() { - ensure_logger_init(); - - // Test different rotation types - let daily = Rotation::DAILY; - let hourly = Rotation::HOURLY; - let minutely = Rotation::MINUTELY; - let never = Rotation::NEVER; - - // Test that rotation types can be created and formatted - assert!(!format!("{daily:?}").is_empty()); - assert!(!format!("{hourly:?}").is_empty()); - assert!(!format!("{minutely:?}").is_empty()); - assert!(!format!("{never:?}").is_empty()); - } - - #[test] - fn test_fmt_layer_configuration() { - ensure_logger_init(); - - // Test that we can create fmt layers with different configurations - // We can't actually test the layers directly due to type complexity, - // but we can test that the configuration values are correct - - // Test console layer settings - let console_ansi = true; - let console_line_number = true; - assert!(console_ansi); - assert!(console_line_number); - - // Test file layer settings - let file_ansi = false; - let file_thread_names = true; - let file_target = true; - let file_thread_ids = true; - let file_level = true; - let file_line_number = true; - - assert!(!file_ansi); - assert!(file_thread_names); - assert!(file_target); - assert!(file_thread_ids); - assert!(file_level); - assert!(file_line_number); - } - - #[test] - fn test_env_filter_creation() { - ensure_logger_init(); - - // Test that EnvFilter can be created with different levels - let info_filter = tracing_subscriber::EnvFilter::new("info"); - let debug_filter = tracing_subscriber::EnvFilter::new("debug"); - let warn_filter = tracing_subscriber::EnvFilter::new("warn"); - let error_filter = tracing_subscriber::EnvFilter::new("error"); - - // Test that filters can be created - assert!(!format!("{info_filter:?}").is_empty()); - assert!(!format!("{debug_filter:?}").is_empty()); - assert!(!format!("{warn_filter:?}").is_empty()); - assert!(!format!("{error_filter:?}").is_empty()); - } - - #[test] - fn test_path_construction() { - ensure_logger_init(); - - // Test path construction logic used in init_logger - if let Some(home_dir) = dirs::home_dir() { - let rustfs_dir = home_dir.join("rustfs"); - let logs_dir = rustfs_dir.join("logs"); - - // Test that paths are constructed correctly - assert!(rustfs_dir.ends_with("rustfs")); - assert!(logs_dir.ends_with("logs")); - assert!(logs_dir.parent().unwrap().ends_with("rustfs")); - - // Test path string representation - let rustfs_str = rustfs_dir.to_string_lossy(); - let logs_str = logs_dir.to_string_lossy(); - - assert!(rustfs_str.contains("rustfs")); - assert!(logs_str.contains("rustfs")); - assert!(logs_str.contains("logs")); - } - } - - #[test] - fn test_filename_patterns() { - ensure_logger_init(); - - // Test the filename patterns used in the logger - let prefix = "rustfs-cli"; - let suffix = "log"; - - assert_eq!(prefix, "rustfs-cli"); - assert_eq!(suffix, "log"); - - // Test that these would create valid filenames - let sample_filename = format!("{prefix}.2024-01-01.{suffix}"); - assert_eq!(sample_filename, "rustfs-cli.2024-01-01.log"); - } - - #[test] - fn test_worker_guard_type() { - ensure_logger_init(); - - // Test that WorkerGuard type exists and can be referenced - // We can't actually create one without the full setup, but we can test the type - let guard_size = std::mem::size_of::(); - assert!(guard_size > 0, "WorkerGuard should have non-zero size"); - } - - #[test] - fn test_logger_configuration_constants() { - ensure_logger_init(); - - // Test the configuration values used in the logger - let default_log_level = "info"; - let filename_prefix = "rustfs-cli"; - let filename_suffix = "log"; - let rotation = Rotation::DAILY; - - assert_eq!(default_log_level, "info"); - assert_eq!(filename_prefix, "rustfs-cli"); - assert_eq!(filename_suffix, "log"); - assert!(matches!(rotation, Rotation::DAILY)); - } - - #[test] - fn test_directory_names() { - ensure_logger_init(); - - // Test the directory names used in the logger setup - let rustfs_dir_name = "rustfs"; - let logs_dir_name = "logs"; - - assert_eq!(rustfs_dir_name, "rustfs"); - assert_eq!(logs_dir_name, "logs"); - - // Test path joining - let combined = format!("{rustfs_dir_name}/{logs_dir_name}"); - assert_eq!(combined, "rustfs/logs"); - } - - #[test] - fn test_layer_settings() { - ensure_logger_init(); - - // Test the boolean settings used in layer configuration - let console_ansi = true; - let console_line_number = true; - let file_ansi = false; - let file_thread_names = true; - let file_target = true; - let file_thread_ids = true; - let file_level = true; - let file_line_number = true; - - // Verify the settings - assert!(console_ansi); - assert!(console_line_number); - assert!(!file_ansi); - assert!(file_thread_names); - assert!(file_target); - assert!(file_thread_ids); - assert!(file_level); - assert!(file_line_number); - } - - // Note: The actual init_logger() function is not tested here because: - // 1. It initializes a global tracing subscriber which can only be done once - // 2. It requires file system access to create directories - // 3. It has side effects that would interfere with other tests - // 4. It returns a WorkerGuard that needs to be kept alive - // - // This function should be tested in integration tests where: - // - File system access can be properly controlled - // - The global state can be managed - // - The actual logging behavior can be verified - // - The WorkerGuard lifecycle can be properly managed -} diff --git a/cli/rustfs-gui/src/utils/mod.rs b/cli/rustfs-gui/src/utils/mod.rs deleted file mode 100644 index b9c303bc..00000000 --- a/cli/rustfs-gui/src/utils/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -mod config; -mod helper; -mod logger; - -pub use config::RustFSConfig; -pub use helper::ServiceManager; -pub use logger::init_logger; diff --git a/cli/rustfs-gui/src/views/app.rs b/cli/rustfs-gui/src/views/app.rs deleted file mode 100644 index 5fc3924b..00000000 --- a/cli/rustfs-gui/src/views/app.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::route::Route; -use dioxus::logger::tracing::info; -use dioxus::prelude::*; - -const FAVICON: Asset = asset!("/assets/favicon.ico"); -const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); - -/// The main application component -/// This is the root component of the application -/// It contains the global resources and the router -/// for the application -#[component] -pub fn App() -> Element { - // Build cool things ✌️ - use document::{Link, Title}; - info!("App rendered"); - rsx! { - // Global app resources - Link { rel: "icon", href: FAVICON } - Link { rel: "stylesheet", href: TAILWIND_CSS } - Title { "RustFS" } - Router:: {} - } -} diff --git a/cli/rustfs-gui/src/views/home.rs b/cli/rustfs-gui/src/views/home.rs deleted file mode 100644 index 7096c8db..00000000 --- a/cli/rustfs-gui/src/views/home.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::components::Home; -use dioxus::prelude::*; - -#[component] -pub fn HomeViews() -> Element { - rsx! { - Home {} - } -} diff --git a/cli/rustfs-gui/src/views/mod.rs b/cli/rustfs-gui/src/views/mod.rs deleted file mode 100644 index 3dadb94f..00000000 --- a/cli/rustfs-gui/src/views/mod.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -mod app; -mod home; -mod setting; - -pub use app::App; -pub use home::HomeViews; -pub use setting::SettingViews; diff --git a/cli/rustfs-gui/src/views/setting.rs b/cli/rustfs-gui/src/views/setting.rs deleted file mode 100644 index e646ae35..00000000 --- a/cli/rustfs-gui/src/views/setting.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::components::Setting; -use dioxus::prelude::*; - -#[component] -pub fn SettingViews() -> Element { - rsx! { - Setting {} - } -} diff --git a/cli/rustfs-gui/tailwind.config.js b/cli/rustfs-gui/tailwind.config.js deleted file mode 100644 index 289dc04d..00000000 --- a/cli/rustfs-gui/tailwind.config.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright 2024 RustFS Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - mode: "all", - content: ["./src/**/*.{rs,html,css}", "./dist/**/*.html"], - theme: { - extend: {}, - }, - plugins: [], -}; \ No newline at end of file