From f6247cee5a30af8b84451fea392ba2769ccba334 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Sat, 14 Dec 2024 18:08:55 +0100 Subject: [PATCH 01/23] added the foundation to transition from Flutter to GTK --- .envrc | 1 + .gitignore | 4 +- babylonia-terminal-cli/Cargo.toml | 3 - babylonia-terminal-cli/src/arguments.rs | 4 + babylonia-terminal-cli/src/lib.rs | 29 + babylonia-terminal-gui/Cargo.lock | 2875 +++++++++++++++ babylonia-terminal-gui/Cargo.toml | 11 + babylonia-terminal-gui/src/lib.rs | 87 + babylonia-terminal/Cargo.lock | 3257 +++++++++++++++++ babylonia-terminal/Cargo.toml | 12 + .../src/main.rs | 26 +- flake.lock | 41 +- flake.nix | 119 +- 13 files changed, 6367 insertions(+), 102 deletions(-) create mode 100644 .envrc create mode 100644 babylonia-terminal-cli/src/lib.rs create mode 100644 babylonia-terminal-gui/Cargo.lock create mode 100644 babylonia-terminal-gui/Cargo.toml create mode 100644 babylonia-terminal-gui/src/lib.rs create mode 100644 babylonia-terminal/Cargo.lock create mode 100644 babylonia-terminal/Cargo.toml rename {babylonia-terminal-cli => babylonia-terminal}/src/main.rs (53%) diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 8c4fcb7..ada6eb9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ set_github_env.sh babylonia-terminal-cli/TDData-data.db - babylonia-terminal-cli/backtrace.txt +babylonia-terminal-cli/target +babylonia-terminal-gui/target +babylonia-terminal/target diff --git a/babylonia-terminal-cli/Cargo.toml b/babylonia-terminal-cli/Cargo.toml index 4362dd7..bcfc77a 100644 --- a/babylonia-terminal-cli/Cargo.toml +++ b/babylonia-terminal-cli/Cargo.toml @@ -8,9 +8,6 @@ repository = "https://github.com/ALEZ-DEV/Babylonia-terminal" license = "LGPL-3.0-or-later" keywords = ["launcher", "game"] -[[bin]] -name = "babylonia-terminal-cli" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/babylonia-terminal-cli/src/arguments.rs b/babylonia-terminal-cli/src/arguments.rs index c79b832..3470284 100644 --- a/babylonia-terminal-cli/src/arguments.rs +++ b/babylonia-terminal-cli/src/arguments.rs @@ -16,4 +16,8 @@ pub struct Args { /// Show the logs direcly to the stdout of your terminal #[arg(long, default_value = "false")] pub logs: bool, + + /// Launch the GUI version + #[arg(long, default_value = "false")] + pub gui: bool, } diff --git a/babylonia-terminal-cli/src/lib.rs b/babylonia-terminal-cli/src/lib.rs new file mode 100644 index 0000000..ee6b22b --- /dev/null +++ b/babylonia-terminal-cli/src/lib.rs @@ -0,0 +1,29 @@ +use arguments::Args; +use babylonia_terminal_sdk::game_config::GameConfig; +use clap::Parser; +use log::debug; + +pub mod arguments; +pub mod game; +pub mod reporter; +pub mod utils; + +pub fn run() { + let args = Args::parse(); + + debug!("Launch option -> {:?}", args.options); + + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + if let Some(command) = args.set_options { + GameConfig::set_launch_options(Some(command)) + .await + .expect("Failed to save launch options into the config file"); + } + + game::run(args.options, args.logs).await; + }); +} diff --git a/babylonia-terminal-gui/Cargo.lock b/babylonia-terminal-gui/Cargo.lock new file mode 100644 index 0000000..a1b6742 --- /dev/null +++ b/babylonia-terminal-gui/Cargo.lock @@ -0,0 +1,2875 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anyhow" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +dependencies = [ + "backtrace", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-compression" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "babylonia-terminal-gui" +version = "0.1.0" +dependencies = [ + "anyhow", + "babylonia-terminal-sdk", + "log", + "relm4", + "relm4-components", +] + +[[package]] +name = "babylonia-terminal-sdk" +version = "0.1.2" +dependencies = [ + "anyhow", + "chksum-md5", + "dirs", + "dotenv", + "downloader", + "flate2", + "fs_extra", + "futures", + "log", + "num_cpus", + "reqwest 0.12.9", + "rust-embed", + "serde", + "serde_json", + "tar", + "tokio", + "wincompatlib", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "blake3" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cairo-rs" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fa699e1d7ae691001a811dda5ef0e3e42e1d4119b26426352989df9e94e3e6" +dependencies = [ + "bitflags 2.6.0", + "cairo-sys-rs", + "glib", + "libc", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "cc" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-expr" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chksum-core" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6db20071fdeca52ed6a7745519fb2d343fddcb93af81448373b851f072aaec5" +dependencies = [ + "chksum-hash-core", + "thiserror", +] + +[[package]] +name = "chksum-hash-core" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221456234d441c788a2c51a27b91c4380f499de560670a67d3303e621d37b3bd" + +[[package]] +name = "chksum-hash-md5" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c33d01c33c9e193fe33e719a29a7eb900c08583375dd1d3269991aacbe434a" +dependencies = [ + "chksum-hash-core", + "thiserror", +] + +[[package]] +name = "chksum-md5" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95dda0f76fbb6069e042c370a928457086e1b4eabc7e75f5f49fe1b913634351" +dependencies = [ + "chksum-core", + "chksum-hash-md5", + "chksum-reader", +] + +[[package]] +name = "chksum-reader" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bcdf6bcd410820599b7501d9bc3346964c4d472f48905685e08e07359d2fff9" +dependencies = [ + "chksum-core", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "downloader" +version = "0.2.7" +source = "git+https://github.com/ALEZ-DEV/downloader#5572a0875ec4f04b0514342f9acff21252beb579" +dependencies = [ + "futures", + "rand", + "reqwest 0.11.27", + "thiserror", + "tokio", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[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 = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75933c4a86e8a2428814d367e22c733304fdfabc87f415750fd2f55409b6ee48" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk4-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20af0656d543aed3e57ac4120ef76d091c3c42ab1e0507a8febde7cd005640e2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8826d2a9ad56ce3de1f04bea0bea0daff6f5f1c913cc834996cfea1f9401361c" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "pin-project-lite", + "smallvec", +] + +[[package]] +name = "gio-sys" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b965df6f3534c84816b5c1a7d9efcb5671ae790822de5abe8e299797039529bc" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "windows-sys 0.52.0", +] + +[[package]] +name = "glib" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd3e4ee7998ab5a135d900db56930cc19ad16681adf245daff54f618b9d5e1" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b1827e8621fc42c0dfb228e5d57ff6a71f9699e666ece8113f979ad87c2de" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "graphene-rs" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" +dependencies = [ + "glib", + "graphene-sys", + "libc", +] + +[[package]] +name = "graphene-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" +dependencies = [ + "glib-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gsk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b36933c1e79df378aa6e606576e680358a9582ed8c16f33e94899636e6fa6df6" +dependencies = [ + "cairo-rs", + "gdk4", + "glib", + "graphene-rs", + "gsk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gsk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0877a9d485bd9ba5262b0c9bce39e63750e525e3aebeb359d271ca1f0e111f1d" +dependencies = [ + "cairo-sys-rs", + "gdk4-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9376d14d7e33486c54823a42bef296e882b9f25cb4c52b52f4d1d57bbadb5b6d" +dependencies = [ + "cairo-rs", + "field-offset", + "futures-channel", + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "graphene-rs", + "gsk4", + "gtk4-macros", + "gtk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gtk4-macros" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c518d5dd41c57385c7cd30af52e261820c897fc1144e558bb88c303d048ae2" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "gtk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e653b0a9001ba9be1ffddb9373bfe9a111f688222f5aeee2841481300d91b55a" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "gsk4-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.2.0", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.2.0", + "hyper 1.5.1", + "hyper-util", + "rustls 0.23.20", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.31", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.5.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.1", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "js-sys" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "minreq" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +dependencies = [ + "log", + "once_cell", + "rustls 0.21.12", + "rustls-native-certs", + "rustls-webpki 0.101.7", + "webpki-roots", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl" +version = "0.10.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e34e7ca2c52e3933d7e5251409a82b83725fa9d6d48fbdaacec056b3a0554a" +dependencies = [ + "gio", + "glib", + "libc", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "relm4" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30837553c1a8cfea1a404c83ec387c5c8ff9358e1060b057c274c5daa5035ad1" +dependencies = [ + "flume", + "fragile", + "futures", + "gtk4", + "once_cell", + "relm4-css", + "relm4-macros", + "tokio", + "tracing", +] + +[[package]] +name = "relm4-components" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3d67f2982131c5e6047af4278d8fe750266767e57b58bc15f2e11e190eef36" +dependencies = [ + "once_cell", + "relm4", + "tracker", +] + +[[package]] +name = "relm4-css" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3b924557df1cddc687b60b313c4b76620fdbf0e463afa4b29f67193ccf37f9" + +[[package]] +name = "relm4-macros" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a895a7455441a857d100ca679bd24a92f91d28b5e3df63296792ac1af2eddde" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.31", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rust-embed" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "serde" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "7.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "tar" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls 0.23.20", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracker" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5c98457ff700aaeefcd4a4a492096e78a2af1dd8523c66e94a3adb0fdbd415" +dependencies = [ + "tracker-macros", +] + +[[package]] +name = "tracker-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc19eb2373ccf3d1999967c26c3d44534ff71ae5d8b9dacf78f4b13132229e48" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" + +[[package]] +name = "web-sys" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "wincompatlib" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2475ec2859b4310dbf008f8c0cafc55202137aac0062f52a0e7651459f6ad88e" +dependencies = [ + "anyhow", + "blake3", + "minreq", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[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", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml new file mode 100644 index 0000000..1b15905 --- /dev/null +++ b/babylonia-terminal-gui/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "babylonia-terminal-gui" +version = "0.1.0" +edition = "2021" + +[dependencies] +babylonia-terminal-sdk = { path = "./../babylonia-terminal-sdk" } +anyhow = "1.0.94" +log = "0.4.22" +relm4 = "0.9.1" +relm4-components = "0.9.1" diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs new file mode 100644 index 0000000..0feaa63 --- /dev/null +++ b/babylonia-terminal-gui/src/lib.rs @@ -0,0 +1,87 @@ +use log::debug; +use relm4::RelmApp; +use relm4::{ + gtk::{ + self, + prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt}, + }, + ComponentParts, RelmWidgetExt, SimpleComponent, +}; + +pub fn run() { + debug!("Start GUI!"); + let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]); + app.run::(0); +} + +#[derive(Debug)] +pub enum AppMsg { + Increment, + Decrement, +} + +struct AppModel { + counter: u8, +} + +#[relm4::component] +impl SimpleComponent for AppModel { + type Input = AppMsg; + + type Output = (); + + type Init = u8; + + view! { + gtk::Window { + set_title: Some("Babylonia Terminal"), + set_default_width: 700, + set_default_height: 300, + + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_spacing: 5, + set_margin_all: 5, + + gtk::Button { + set_label: "Increment", + connect_clicked => AppMsg::Increment, + }, + + gtk::Button { + set_label: "Decrement", + connect_clicked => AppMsg::Decrement, + }, + + gtk::Label { + #[watch] + set_label: &format!("Counter : {}", model.counter), + set_margin_all: 5, + } + } + } + } + + fn init( + counter: Self::Init, + window: Self::Root, + sender: relm4::ComponentSender, + ) -> relm4::ComponentParts { + let model = AppModel { counter }; + + let widgets = view_output!(); + + ComponentParts { model, widgets } + } + + fn update(&mut self, message: Self::Input, _sender: relm4::ComponentSender) { + match message { + AppMsg::Increment => { + self.counter = self.counter.wrapping_add(1); + } + AppMsg::Decrement => { + self.counter = self.counter.wrapping_sub(1); + } + } + } +} diff --git a/babylonia-terminal/Cargo.lock b/babylonia-terminal/Cargo.lock new file mode 100644 index 0000000..9902274 --- /dev/null +++ b/babylonia-terminal/Cargo.lock @@ -0,0 +1,3257 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +dependencies = [ + "backtrace", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-compression" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "babylonia-terminal" +version = "0.1.0" +dependencies = [ + "babylonia-terminal-cli", + "babylonia-terminal-gui", + "clap", + "log", + "simple_logger 5.0.0", + "tokio", +] + +[[package]] +name = "babylonia-terminal-cli" +version = "0.1.2" +dependencies = [ + "anyhow", + "babylonia-terminal-sdk", + "clap", + "derive", + "dialoguer", + "downloader", + "indicatif", + "log", + "simple_logger 4.3.3", + "tokio", + "wincompatlib", +] + +[[package]] +name = "babylonia-terminal-gui" +version = "0.1.0" +dependencies = [ + "anyhow", + "babylonia-terminal-sdk", + "log", + "relm4", + "relm4-components", +] + +[[package]] +name = "babylonia-terminal-sdk" +version = "0.1.2" +dependencies = [ + "anyhow", + "chksum-md5", + "dirs", + "dotenv", + "downloader", + "flate2", + "fs_extra", + "futures", + "log", + "num_cpus", + "reqwest 0.12.9", + "rust-embed", + "serde", + "serde_json", + "tar", + "tokio", + "wincompatlib", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "blake3" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cairo-rs" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fa699e1d7ae691001a811dda5ef0e3e42e1d4119b26426352989df9e94e3e6" +dependencies = [ + "bitflags 2.6.0", + "cairo-sys-rs", + "glib", + "libc", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "cc" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-expr" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chksum-core" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6db20071fdeca52ed6a7745519fb2d343fddcb93af81448373b851f072aaec5" +dependencies = [ + "chksum-hash-core", + "thiserror", +] + +[[package]] +name = "chksum-hash-core" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221456234d441c788a2c51a27b91c4380f499de560670a67d3303e621d37b3bd" + +[[package]] +name = "chksum-hash-md5" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c33d01c33c9e193fe33e719a29a7eb900c08583375dd1d3269991aacbe434a" +dependencies = [ + "chksum-hash-core", + "thiserror", +] + +[[package]] +name = "chksum-md5" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95dda0f76fbb6069e042c370a928457086e1b4eabc7e75f5f49fe1b913634351" +dependencies = [ + "chksum-core", + "chksum-hash-md5", + "chksum-reader", +] + +[[package]] +name = "chksum-reader" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bcdf6bcd410820599b7501d9bc3346964c4d472f48905685e08e07359d2fff9" +dependencies = [ + "chksum-core", +] + +[[package]] +name = "clap" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width 0.1.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e3ae26c830a573f2e231fc2475f71fce4705609097cb9523abfc4007caed0b" + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "downloader" +version = "0.2.7" +source = "git+https://github.com/ALEZ-DEV/downloader#5572a0875ec4f04b0514342f9acff21252beb579" +dependencies = [ + "futures", + "rand", + "reqwest 0.11.27", + "thiserror", + "tokio", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[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 = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75933c4a86e8a2428814d367e22c733304fdfabc87f415750fd2f55409b6ee48" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk4-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20af0656d543aed3e57ac4120ef76d091c3c42ab1e0507a8febde7cd005640e2" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8826d2a9ad56ce3de1f04bea0bea0daff6f5f1c913cc834996cfea1f9401361c" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "pin-project-lite", + "smallvec", +] + +[[package]] +name = "gio-sys" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b965df6f3534c84816b5c1a7d9efcb5671ae790822de5abe8e299797039529bc" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "windows-sys 0.52.0", +] + +[[package]] +name = "glib" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd3e4ee7998ab5a135d900db56930cc19ad16681adf245daff54f618b9d5e1" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b1827e8621fc42c0dfb228e5d57ff6a71f9699e666ece8113f979ad87c2de" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "graphene-rs" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" +dependencies = [ + "glib", + "graphene-sys", + "libc", +] + +[[package]] +name = "graphene-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" +dependencies = [ + "glib-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gsk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b36933c1e79df378aa6e606576e680358a9582ed8c16f33e94899636e6fa6df6" +dependencies = [ + "cairo-rs", + "gdk4", + "glib", + "graphene-rs", + "gsk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gsk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0877a9d485bd9ba5262b0c9bce39e63750e525e3aebeb359d271ca1f0e111f1d" +dependencies = [ + "cairo-sys-rs", + "gdk4-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk4" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9376d14d7e33486c54823a42bef296e882b9f25cb4c52b52f4d1d57bbadb5b6d" +dependencies = [ + "cairo-rs", + "field-offset", + "futures-channel", + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "graphene-rs", + "gsk4", + "gtk4-macros", + "gtk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gtk4-macros" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c518d5dd41c57385c7cd30af52e261820c897fc1144e558bb88c303d048ae2" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "gtk4-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e653b0a9001ba9be1ffddb9373bfe9a111f688222f5aeee2841481300d91b55a" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "gsk4-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.2.0", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.2.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.2.0", + "hyper 1.5.1", + "hyper-util", + "rustls 0.23.20", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.31", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.5.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.1", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indicatif" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width 0.2.0", + "web-time", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "js-sys" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "minreq" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +dependencies = [ + "log", + "once_cell", + "rustls 0.21.12", + "rustls-native-certs", + "rustls-webpki 0.101.7", + "webpki-roots", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl" +version = "0.10.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e34e7ca2c52e3933d7e5251409a82b83725fa9d6d48fbdaacec056b3a0554a" +dependencies = [ + "gio", + "glib", + "libc", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "portable-atomic" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "relm4" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30837553c1a8cfea1a404c83ec387c5c8ff9358e1060b057c274c5daa5035ad1" +dependencies = [ + "flume", + "fragile", + "futures", + "gtk4", + "once_cell", + "relm4-css", + "relm4-macros", + "tokio", + "tracing", +] + +[[package]] +name = "relm4-components" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3d67f2982131c5e6047af4278d8fe750266767e57b58bc15f2e11e190eef36" +dependencies = [ + "once_cell", + "relm4", + "tracker", +] + +[[package]] +name = "relm4-css" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3b924557df1cddc687b60b313c4b76620fdbf0e463afa4b29f67193ccf37f9" + +[[package]] +name = "relm4-macros" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a895a7455441a857d100ca679bd24a92f91d28b5e3df63296792ac1af2eddde" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.31", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +dependencies = [ + "async-compression", + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.7", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.1", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.2.0", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rust-embed" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" + +[[package]] +name = "serde" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simple_logger" +version = "4.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1" +dependencies = [ + "colored", + "log", + "time", + "windows-sys 0.48.0", +] + +[[package]] +name = "simple_logger" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c5dfa5e08767553704aa0ffd9d9794d527103c736aba9854773851fd7497eb" +dependencies = [ + "colored", + "log", + "time", + "windows-sys 0.48.0", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "7.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "tar" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls 0.23.20", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracker" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce5c98457ff700aaeefcd4a4a492096e78a2af1dd8523c66e94a3adb0fdbd415" +dependencies = [ + "tracker-macros", +] + +[[package]] +name = "tracker-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc19eb2373ccf3d1999967c26c3d44534ff71ae5d8b9dacf78f4b13132229e48" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "vcpkg" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" + +[[package]] +name = "web-sys" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "wincompatlib" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2475ec2859b4310dbf008f8c0cafc55202137aac0062f52a0e7651459f6ad88e" +dependencies = [ + "anyhow", + "blake3", + "minreq", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[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", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/babylonia-terminal/Cargo.toml b/babylonia-terminal/Cargo.toml new file mode 100644 index 0000000..ba51168 --- /dev/null +++ b/babylonia-terminal/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "babylonia-terminal" +version = "0.1.0" +edition = "2021" + +[dependencies] +babylonia-terminal-cli = { path = "./../babylonia-terminal-cli" } +babylonia-terminal-gui = { path = "./../babylonia-terminal-gui" } +log = "0.4.22" +simple_logger = "5.0.0" +tokio = { version = "1.37.0", features = ["full"] } +clap = "4.5.23" diff --git a/babylonia-terminal-cli/src/main.rs b/babylonia-terminal/src/main.rs similarity index 53% rename from babylonia-terminal-cli/src/main.rs rename to babylonia-terminal/src/main.rs index 0900c62..55824c0 100644 --- a/babylonia-terminal-cli/src/main.rs +++ b/babylonia-terminal/src/main.rs @@ -1,17 +1,8 @@ -use babylonia_terminal_sdk::game_config::GameConfig; use clap::Parser; -use log::{debug, LevelFilter}; +use log::LevelFilter; use simple_logger::SimpleLogger; -mod arguments; -pub mod game; -pub mod reporter; -pub mod utils; - -use crate::arguments::Args; - -#[tokio::main] -async fn main() { +fn main() { let simple_logger = SimpleLogger::new() .with_module_level("hyper", LevelFilter::Off) .with_module_level("hyper_util", LevelFilter::Off) @@ -26,14 +17,11 @@ async fn main() { simple_logger.with_level(LevelFilter::Info).init().unwrap(); } - let args = Args::parse(); - debug!("Launch option -> {:?}", args.options); + let args = babylonia_terminal_cli::arguments::Args::parse(); - if let Some(command) = args.set_options { - GameConfig::set_launch_options(Some(command)) - .await - .expect("Failed to save launch options into the config file"); + if args.gui { + babylonia_terminal_gui::run(); + } else { + babylonia_terminal_cli::run(); } - - game::run(args.options, args.logs).await; } diff --git a/flake.lock b/flake.lock index bf2394b..b4cee8d 100644 --- a/flake.lock +++ b/flake.lock @@ -2,23 +2,42 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1726642912, - "narHash": "sha256-wiZzKGHRAhItEuoE599Wm3ic+Lg/NykuBvhb+awf7N8=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "395c52d142ec1df377acd67db6d4a22950b02a98", - "type": "github" + "lastModified": 1733940404, + "narHash": "sha256-Pj39hSoUA86ZePPF/UXiYHHM7hMIkios8TYG29kQT4g=", + "rev": "5d67ea6b4b63378b9c13be21e2ec9d1afc921713", + "revCount": 720697, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.720697%2Brev-5d67ea6b4b63378b9c13be21e2ec9d1afc921713/0193beb2-e6fa-7337-96e3-cfa8c3818a9e/source.tar.gz" }, "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "tarball", + "url": "https://flakehub.com/f/NixOS/nixpkgs/0.1.%2A.tar.gz" } }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1734143514, + "narHash": "sha256-1+r8wYucn8kp9d/IBW1uYGs31QQmSZURElsiOTx65xM=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "81fe5c27cb281a9b796d7ad05ad9179e5bd0c78d", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index 1cf61c8..ad20090 100644 --- a/flake.nix +++ b/flake.nix @@ -2,74 +2,57 @@ description = "Flake to manage the babylonia-terminal dependecies"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; - }; - - outputs = { self, nixpkgs }: - let - pkgs = nixpkgs.legacyPackages."x86_64-linux"; - in - { - - devShells."x86_64-linux".default = pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - rustup - rustfmt - clippy - rust-analyzer - gcc - pkg-config - flutter - protoc-gen-prost - - wayland - openssl - cabextract - - #mpv dependecies - mpv - mpv-unwrapped - libass - libplacebo - libunwind - shaderc - vulkan-loader - lcms - libdovi - libdvdnav - libdvdread - libGL - mujs - libbluray - lua - rubberband - SDL2 - libuchardet - zimg - alsa-lib - openal - ffmpeg - libcaca - libdrm - libpulseaudio - libva - libvdpau - mesa - nv-codec-headers-11 - pipewire - xorg.libXpresent - xorg.libXScrnSaver - xorg.libXv - ]; - - shellHook = '' - export OPENSSL_DIR="${pkgs.openssl.dev}" - export PKG_CONFIG_PATH="${pkgs.openssl.dev}/lib/pkgconfig:${pkgs.mpv-unwrapped.dev}/lib/pkgconfig:${pkgs.libass.dev}/lib/pkgconfig:${pkgs.ffmpeg.dev}/lib/pkgconfig:${pkgs.libplacebo}/lib/pkgconfig:${pkgs.libunwind.dev}/lib/pkgconfig:${pkgs.shaderc.dev}/lib/pkgconfig:${pkgs.vulkan-loader.dev}/lib/pkgconfig:${pkgs.lcms.dev}/lib/pkgconfig:${pkgs.libdovi}/lib/pkgconfig:${pkgs.libdvdnav}/lib/pkgconfig:${pkgs.libdvdread}/lib/pkgconfig:${pkgs.mujs}/lib/pkgconfig:${pkgs.pipewire.dev}/lib/pkgconfig:${pkgs.libbluray}/lib/pkgconfig:${pkgs.lua}/lib/pkgconfig:${pkgs.rubberband}/lib/pkgconfig:${pkgs.SDL2.dev}/lib/pkgconfig:${pkgs.libuchardet.dev}/lib/pkgconfig:${pkgs.zimg.dev}/lib/pkgconfig:${pkgs.alsa-lib.dev}/lib/pkgconfig:${pkgs.openal}/lib/pkgconfig:${pkgs.libcaca.dev}/lib/pkgconfig:${pkgs.libdrm.dev}/lib/pkgconfig:${pkgs.libpulseaudio.dev}/lib/pkgconfig:${pkgs.libva.dev}/lib/pkgconfig:${pkgs.libvdpau.dev}/lib/pkgconfig:${pkgs.mesa.dev}/lib/pkgconfig:${pkgs.nv-codec-headers-11}/lib/pkgconfig:${pkgs.pipewire.dev}/lib/pkgconfig:${pkgs.xorg.libXpresent}/lib/pkgconfig:${pkgs.xorg.libXpresent}/lib/pkgconfig:${pkgs.xorg.libXScrnSaver}/lib/pkgconfig:${pkgs.xorg.libXv.dev}/lib/pkgconfig" - export OPENSSL_NO_VENDOR=1 - export OPENSSL_LIB_DIR="${pkgs.lib.getLib pkgs.openssl}/lib" - export FLUTTER_ROOT="${pkgs.flutter}" - export LD_LIBRARY_PATH="${pkgs.wayland}:$LD_LIBRARY_PATH" - ''; + nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1.*.tar.gz"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; }; }; + + outputs = { self, nixpkgs, rust-overlay }: + let + supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f { + pkgs = import nixpkgs { + inherit system; + overlays = [ rust-overlay.overlays.default self.overlays.default ]; + }; + }); + in + { + overlays.default = final: prev: { + rustToolchain = + let + rust = prev.rust-bin; + in + if builtins.pathExists ./rust-toolchain.toml then + rust.fromRustupToolchainFile ./rust-toolchain.toml + else if builtins.pathExists ./rust-toolchain then + rust.fromRustupToolchainFile ./rust-toolchain + else + rust.stable.latest.default.override { + extensions = [ "rust-src" "rustfmt" ]; + }; + }; + + devShells = forEachSupportedSystem ({ pkgs }: { + default = pkgs.mkShell { + packages = with pkgs; [ + rustToolchain + openssl + pkg-config + cargo-deny + cargo-edit + cargo-watch + rust-analyzer + gtk4 + ]; + + env = { + # Required by rust-analyzer + RUST_SRC_PATH = "${pkgs.rustToolchain}/lib/rustlib/src/rust/library"; + }; + }; + }); + }; } From 85bb1e2c59e6a773a82ea2c81498ea0b63694833 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 16 Dec 2024 21:11:15 +0100 Subject: [PATCH 02/23] can now run the game --- babylonia-terminal-gui/Cargo.lock | 9 +- babylonia-terminal-gui/Cargo.toml | 1 + babylonia-terminal-gui/src/lib.rs | 113 ++++++++++++++++---------- babylonia-terminal-gui/src/manager.rs | 33 ++++++++ babylonia-terminal/Cargo.lock | 23 ++---- babylonia-terminal/Cargo.toml | 2 +- 6 files changed, 118 insertions(+), 63 deletions(-) create mode 100644 babylonia-terminal-gui/src/manager.rs diff --git a/babylonia-terminal-gui/Cargo.lock b/babylonia-terminal-gui/Cargo.lock index a1b6742..f259fb2 100644 --- a/babylonia-terminal-gui/Cargo.lock +++ b/babylonia-terminal-gui/Cargo.lock @@ -72,6 +72,7 @@ dependencies = [ "log", "relm4", "relm4-components", + "wincompatlib", ] [[package]] @@ -402,7 +403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1806,7 +1807,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2195,7 +2196,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2546,7 +2547,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml index 1b15905..92d167f 100644 --- a/babylonia-terminal-gui/Cargo.toml +++ b/babylonia-terminal-gui/Cargo.toml @@ -9,3 +9,4 @@ anyhow = "1.0.94" log = "0.4.22" relm4 = "0.9.1" relm4-components = "0.9.1" +wincompatlib = "0.7.5" diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs index 0feaa63..cdd834c 100644 --- a/babylonia-terminal-gui/src/lib.rs +++ b/babylonia-terminal-gui/src/lib.rs @@ -1,87 +1,112 @@ +use babylonia_terminal_sdk::game_state::GameState; use log::debug; -use relm4::RelmApp; +use manager::run_game; use relm4::{ gtk::{ self, - prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt}, + prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, }, - ComponentParts, RelmWidgetExt, SimpleComponent, + loading_widgets::LoadingWidgets, + prelude::{AsyncComponent, AsyncComponentParts, SimpleAsyncComponent}, + view, ComponentParts, RelmWidgetExt, SimpleComponent, }; +use relm4::{Component, RelmApp}; + +mod manager; pub fn run() { debug!("Start GUI!"); let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]); - app.run::(0); + app.run_async::(None); } #[derive(Debug)] -pub enum AppMsg { - Increment, - Decrement, +pub enum MainWindowMsg { + RunGame, } -struct AppModel { - counter: u8, +struct MainWindow { + game_state: GameState, + is_game_running: bool, } -#[relm4::component] -impl SimpleComponent for AppModel { - type Input = AppMsg; +impl MainWindow { + fn new(game_state: GameState) -> Self { + MainWindow { + game_state, + is_game_running: false, + } + } +} + +#[relm4::component(async)] +impl SimpleAsyncComponent for MainWindow { + type Input = MainWindowMsg; type Output = (); - type Init = u8; + type Init = Option; view! { + #[root] gtk::Window { - set_title: Some("Babylonia Terminal"), - set_default_width: 700, - set_default_height: 300, - gtk::Box { set_orientation: gtk::Orientation::Vertical, set_spacing: 5, set_margin_all: 5, + #[name(start_button)] gtk::Button { - set_label: "Increment", - connect_clicked => AppMsg::Increment, + set_label: "Start game", + connect_clicked => MainWindowMsg::RunGame, }, - - gtk::Button { - set_label: "Decrement", - connect_clicked => AppMsg::Decrement, - }, - - gtk::Label { - #[watch] - set_label: &format!("Counter : {}", model.counter), - set_margin_all: 5, - } } } } - fn init( - counter: Self::Init, - window: Self::Root, - sender: relm4::ComponentSender, - ) -> relm4::ComponentParts { - let model = AppModel { counter }; + async fn init( + game_state: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> AsyncComponentParts { + let model; + if game_state.is_none() { + model = MainWindow::new( + babylonia_terminal_sdk::game_state::GameState::get_current_state() + .await + .unwrap(), + ); + } else { + model = MainWindow::new(game_state.unwrap()); + } let widgets = view_output!(); - ComponentParts { model, widgets } + AsyncComponentParts { model, widgets } } - fn update(&mut self, message: Self::Input, _sender: relm4::ComponentSender) { + fn init_loading_widgets(root: Self::Root) -> Option { + view! { + #[local] + root { + set_title: Some("Babylonia Terminal"), + set_default_width: 700, + set_default_height: 300, + + #[name(spinner)] + gtk::Spinner { + start: (), + set_halign: gtk::Align::Center, + } + } + } + + Some(LoadingWidgets::new(root, spinner)) + } + + async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { match message { - AppMsg::Increment => { - self.counter = self.counter.wrapping_add(1); - } - AppMsg::Decrement => { - self.counter = self.counter.wrapping_sub(1); - } + MainWindowMsg::RunGame => run_game().await, } } } diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs new file mode 100644 index 0000000..63c8495 --- /dev/null +++ b/babylonia-terminal-gui/src/manager.rs @@ -0,0 +1,33 @@ +use babylonia_terminal_sdk::{ + components::proton_component::ProtonComponent, game_config::GameConfig, + game_manager::GameManager, +}; +use log::error; +use relm4::tokio::sync::OnceCell; +use wincompatlib::prelude::Proton; + +static PROTON: OnceCell = OnceCell::const_new(); + +pub async fn get_proton() -> Proton { + PROTON + .get_or_init(|| async { + let proton_component = ProtonComponent::new(GameConfig::get_config().await.config_dir); + let proton = proton_component.init_proton(); + if let Err(ref e) = proton { + error!("Failed to initialize proton : {}", e); + } + proton.unwrap() + }) + .await + .clone() +} + +pub async fn run_game() { + let proton = get_proton().await; + let game_dir = GameConfig::get_game_dir().await; + if game_dir.is_none() { + error!("Failed to start game, the game directory was not found") + } + + GameManager::start_game(&proton, game_dir.unwrap(), None, false).await; +} diff --git a/babylonia-terminal/Cargo.lock b/babylonia-terminal/Cargo.lock index 9902274..f3fa33a 100644 --- a/babylonia-terminal/Cargo.lock +++ b/babylonia-terminal/Cargo.lock @@ -150,6 +150,7 @@ dependencies = [ "log", "relm4", "relm4-components", + "wincompatlib", ] [[package]] @@ -406,15 +407,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "unicode-width 0.1.14", - "windows-sys 0.52.0", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", ] [[package]] @@ -557,9 +558,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -1435,7 +1436,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width", "web-time", ] @@ -2739,12 +2740,6 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.0" diff --git a/babylonia-terminal/Cargo.toml b/babylonia-terminal/Cargo.toml index ba51168..9985393 100644 --- a/babylonia-terminal/Cargo.toml +++ b/babylonia-terminal/Cargo.toml @@ -4,8 +4,8 @@ version = "0.1.0" edition = "2021" [dependencies] -babylonia-terminal-cli = { path = "./../babylonia-terminal-cli" } babylonia-terminal-gui = { path = "./../babylonia-terminal-gui" } +babylonia-terminal-cli = { path = "./../babylonia-terminal-cli" } log = "0.4.22" simple_logger = "5.0.0" tokio = { version = "1.37.0", features = ["full"] } From a2e0b6315f4b572d334945837c026de17f56de3f Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Wed, 18 Dec 2024 21:29:11 +0100 Subject: [PATCH 03/23] game process now run on a separate thread --- babylonia-terminal-gui/src/lib.rs | 107 +---------------------- babylonia-terminal-gui/src/manager.rs | 42 ++++++++- babylonia-terminal-gui/src/ui/mod.rs | 118 ++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 105 deletions(-) create mode 100644 babylonia-terminal-gui/src/ui/mod.rs diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs index cdd834c..e076d8b 100644 --- a/babylonia-terminal-gui/src/lib.rs +++ b/babylonia-terminal-gui/src/lib.rs @@ -1,112 +1,11 @@ -use babylonia_terminal_sdk::game_state::GameState; use log::debug; -use manager::run_game; -use relm4::{ - gtk::{ - self, - prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, - }, - loading_widgets::LoadingWidgets, - prelude::{AsyncComponent, AsyncComponentParts, SimpleAsyncComponent}, - view, ComponentParts, RelmWidgetExt, SimpleComponent, -}; -use relm4::{Component, RelmApp}; +use relm4::RelmApp; mod manager; +mod ui; pub fn run() { debug!("Start GUI!"); let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]); - app.run_async::(None); -} - -#[derive(Debug)] -pub enum MainWindowMsg { - RunGame, -} - -struct MainWindow { - game_state: GameState, - is_game_running: bool, -} - -impl MainWindow { - fn new(game_state: GameState) -> Self { - MainWindow { - game_state, - is_game_running: false, - } - } -} - -#[relm4::component(async)] -impl SimpleAsyncComponent for MainWindow { - type Input = MainWindowMsg; - - type Output = (); - - type Init = Option; - - view! { - #[root] - gtk::Window { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_spacing: 5, - set_margin_all: 5, - - #[name(start_button)] - gtk::Button { - set_label: "Start game", - connect_clicked => MainWindowMsg::RunGame, - }, - } - } - } - - async fn init( - game_state: Self::Init, - root: Self::Root, - sender: relm4::AsyncComponentSender, - ) -> AsyncComponentParts { - let model; - if game_state.is_none() { - model = MainWindow::new( - babylonia_terminal_sdk::game_state::GameState::get_current_state() - .await - .unwrap(), - ); - } else { - model = MainWindow::new(game_state.unwrap()); - } - - let widgets = view_output!(); - - AsyncComponentParts { model, widgets } - } - - fn init_loading_widgets(root: Self::Root) -> Option { - view! { - #[local] - root { - set_title: Some("Babylonia Terminal"), - set_default_width: 700, - set_default_height: 300, - - #[name(spinner)] - gtk::Spinner { - start: (), - set_halign: gtk::Align::Center, - } - } - } - - Some(LoadingWidgets::new(root, spinner)) - } - - async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { - match message { - MainWindowMsg::RunGame => run_game().await, - } - } + ui::run(app); } diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index 63c8495..f19e818 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -3,9 +3,14 @@ use babylonia_terminal_sdk::{ game_manager::GameManager, }; use log::error; -use relm4::tokio::sync::OnceCell; +use relm4::{ + tokio::{self, sync::OnceCell}, + Worker, +}; use wincompatlib::prelude::Proton; +use crate::ui; + static PROTON: OnceCell = OnceCell::const_new(); pub async fn get_proton() -> Proton { @@ -31,3 +36,38 @@ pub async fn run_game() { GameManager::start_game(&proton, game_dir.unwrap(), None, false).await; } + +#[derive(Debug)] +pub enum HandleGameProcessMsg { + RunGame, +} + +pub struct HandleGameProcess; + +impl Worker for HandleGameProcess { + type Init = (); + + type Input = HandleGameProcessMsg; + + type Output = ui::MainWindowMsg; + + fn init(_init: Self::Init, _sender: relm4::ComponentSender) -> Self { + Self + } + + fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { + match message { + HandleGameProcessMsg::RunGame => { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + sender.output(ui::MainWindowMsg::SetIsGameRunning(true)); + run_game().await; + sender.output(ui::MainWindowMsg::SetIsGameRunning(false)); + }); + } + } + } +} diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs new file mode 100644 index 0000000..843acb5 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -0,0 +1,118 @@ +use std::convert::identity; + +use crate::manager; +use babylonia_terminal_sdk::game_state::GameState; + +use relm4::{ + gtk::{ + self, + prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, + }, + loading_widgets::LoadingWidgets, + prelude::{AsyncComponentParts, SimpleAsyncComponent}, + view, Component, RelmApp, RelmWidgetExt, WorkerController, +}; + +pub fn run(app: RelmApp) { + app.run_async::(None); +} + +#[derive(Debug)] +pub enum MainWindowMsg { + SetIsGameRunning(bool), +} + +struct MainWindow { + game_handler: WorkerController, + game_state: GameState, + is_game_running: bool, +} + +impl MainWindow { + fn new(game_state: GameState, sender: relm4::AsyncComponentSender) -> Self { + MainWindow { + game_state, + is_game_running: false, + game_handler: manager::HandleGameProcess::builder() + .detach_worker(()) + .forward(sender.input_sender(), identity), + } + } +} + +#[relm4::component(async)] +impl SimpleAsyncComponent for MainWindow { + type Input = MainWindowMsg; + + type Output = (); + + type Init = Option; + + view! { + #[root] + gtk::Window { + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_spacing: 5, + set_margin_all: 5, + + #[name(start_button)] + gtk::Button { + #[watch] + set_sensitive: !model.is_game_running, + set_label: "Start game", + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, + } + } + } + + async fn init( + game_state: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> AsyncComponentParts { + let model; + if game_state.is_none() { + model = MainWindow::new( + babylonia_terminal_sdk::game_state::GameState::get_current_state() + .await + .unwrap(), + sender, + ); + } else { + model = MainWindow::new(game_state.unwrap(), sender); + } + + let widgets = view_output!(); + + AsyncComponentParts { model, widgets } + } + + fn init_loading_widgets(root: Self::Root) -> Option { + view! { + #[local] + root { + set_title: Some("Babylonia Terminal"), + set_default_width: 700, + set_default_height: 300, + + #[name(spinner)] + gtk::Spinner { + start: (), + set_halign: gtk::Align::Center, + } + } + } + + Some(LoadingWidgets::new(root, spinner)) + } + + async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { + match message { + MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, + } + } +} From 1b34ad764230ff8d5c8c868dc6800c9e2a598f2c Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 19 Dec 2024 19:12:30 +0100 Subject: [PATCH 04/23] added libadwaita and added app icon --- babylonia-terminal-gui/Cargo.lock | 42 ++++++++++++++++++++ babylonia-terminal-gui/Cargo.toml | 5 ++- babylonia-terminal-gui/assets/icon.png | Bin 0 -> 244470 bytes babylonia-terminal-gui/assets/resources.xml | 7 ++++ babylonia-terminal-gui/build.rs | 5 +++ babylonia-terminal-gui/src/lib.rs | 13 +++++- babylonia-terminal-gui/src/ui/mod.rs | 14 +++++-- babylonia-terminal/Cargo.lock | 42 ++++++++++++++++++++ flake.nix | 1 + 9 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 babylonia-terminal-gui/assets/icon.png create mode 100644 babylonia-terminal-gui/assets/resources.xml create mode 100644 babylonia-terminal-gui/build.rs diff --git a/babylonia-terminal-gui/Cargo.lock b/babylonia-terminal-gui/Cargo.lock index f259fb2..c2994f3 100644 --- a/babylonia-terminal-gui/Cargo.lock +++ b/babylonia-terminal-gui/Cargo.lock @@ -69,6 +69,7 @@ version = "0.1.0" dependencies = [ "anyhow", "babylonia-terminal-sdk", + "glib-build-tools", "log", "relm4", "relm4-components", @@ -724,6 +725,15 @@ dependencies = [ "smallvec", ] +[[package]] +name = "glib-build-tools" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7029c2651d9b5d5a3eea93ec8a1995665c6d3a69ce9bf6042ad9064d134736d8" +dependencies = [ + "gio", +] + [[package]] name = "glib-macros" version = "0.20.5" @@ -1268,6 +1278,37 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "libadwaita" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8611ee9fb85e7606c362b513afcaf5b59853f79e4d98caaaf581d99465014247" +dependencies = [ + "gdk4", + "gio", + "glib", + "gtk4", + "libadwaita-sys", + "libc", + "pango", +] + +[[package]] +name = "libadwaita-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b099a223560118d4d4fa04b6d23f3ea5b7171fe1d83dfb7e6b45b54cdfc83af9" +dependencies = [ + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk4-sys", + "libc", + "pango-sys", + "system-deps", +] + [[package]] name = "libc" version = "0.2.168" @@ -1613,6 +1654,7 @@ dependencies = [ "fragile", "futures", "gtk4", + "libadwaita", "once_cell", "relm4-css", "relm4-macros", diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml index 92d167f..437bf38 100644 --- a/babylonia-terminal-gui/Cargo.toml +++ b/babylonia-terminal-gui/Cargo.toml @@ -7,6 +7,9 @@ edition = "2021" babylonia-terminal-sdk = { path = "./../babylonia-terminal-sdk" } anyhow = "1.0.94" log = "0.4.22" -relm4 = "0.9.1" relm4-components = "0.9.1" wincompatlib = "0.7.5" +relm4 = { version = "0.9.1", features = ["libadwaita"] } + +[build-dependencies] +glib-build-tools = "0.20.0" diff --git a/babylonia-terminal-gui/assets/icon.png b/babylonia-terminal-gui/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2bf9c52ca7e87ba00b77af4f0d10c7593f1f5c GIT binary patch literal 244470 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�}o8`#K{LzvqxBo>hA{L6@3I z*<)>ALQ9~sk)L93;$4FMR{42U4Cuu4y-EA{a0-5WR(sE&NQz4wX7iK*^0sQDB z?tvlTU4jv+Ox0yxAUk@R7um3j{S3vI=_1~!`=+ZN!?i@ z(#{o93$%}AEGz9`Nhe6Bq4}iSmno(w+!q6j_s>C+?Z%&_vXKg1qwx7lVg`>4)m_77$==(>d`L`!D@$xm;34yqCnZV>O(nLKx=O66RY=V!Vq! zCOfzm-f-3SvJ$^&@k?PSg#o$u-P+q4{@uH9Mw#F>aM}nh`MZRO&C8;@tebZYZ-ejA zJSMF_R*xIsV{-mc@hd<4Tu7VS74YC);j2B%q4nY2VXgh5YWYzQ>3^5 zu_WQ;M7|7HrxeT1o{Y_8m>b5(*b+`M$)4d7Fv9aU^3&fh!`%)C3g1Vhs|pYq*1s?Mp+a~9bmjw~@lhf^6&9d!2viiz;GEv+^4%#%_ zczH7;?xRXhfhiZphuL|}4Obnm4~y&0fl@e#EmuobKX@{2uQR2JTeQ`9KE(?u7doR- z9K13v!B$llDp*p6X|spBtg643@Vlh#8HB$?9_}VN%6iKh%&KF=EYs*s}KpLxEDSwN68$eX1^PoKx__ zhp>FoMfzl{4%DwU&kBPOH+)#3!@pBzbWH84^rF=bU9ziJ(m;0y*I971^``Y)8Mh<{ZUDz+T6MK=Z7=Y*Nu{AS z4-BfPbHXNQ4K|)P0KlOXVGPVK!u9X(0F;MeWdUsi{;STzN8q0thgCXj zKac;X9ke}a8gvz<^;I1$Vpw9shTO`HOxRiI(Rs;%!VIUZXgFqKqL2BFyeL z4FuXW-t7%X)`sH>|Jj|KNE+X=<>841y8O|8YY>I_GPM0NQBPf-H4I+g!v_g}+b1>s zWR$Q~4}$9D&(uOGA{(-Ly4v`syiyFr7#y{>UjLCh$0v{?E`g8cIy?ETcpCfD9PVL( z5)p%jx3cJ-WQ6JPGG^;HQXy3vrW7;^@4CPrZ-|`e8-)Jp(-R}$S<4|yunqqnml}Y) z>!-T$ESCNb4v-c_i>!TKnT7h8(;qZmvtnB3Xrwzx` zJ>fFlbo=$60tZIi8KAt&v3`~9au^gPUx4@XR{yIY+l#t7uQG5LaAC&%Ym9l>t<>Dv zRbBecvq9ysvGxvU`}VJujou(2iv#8)<1EGU?uvI;64;eKJKm1*mvNkL>@B^YS`=No z>L9QyKc^uP8qr!jF^|G@oBy}CYDRU&cD~U~<=tYjJ5=5xOYS?Cnf4uGXl7FlCmDR> zzmIf+g!-9`gw%E$gWVjes$Y{8hEJMU#C^@-nz7eD%8L8gK+kM_-80kd_wet^#3rvk zxKA;_j7GJtR0hf;fv3w9CniKe1ZY9JZGJ7(lEZ`9<+Hn(zdk?|`LGr2vy0z75+lNq z6@N=j%LbD1j>8ILJ5N+M4OfTLC*-lrtf0xi-V6fS<5C+)2bldI2eeAw|a*r z@3jB?ng;g^p84gKOcBbgBk>Z+oh>IWYJNI(YXlPSc2x4;cf1@SXuI?Rhlb8j^&>-;4-* zKRQz#{llk-Exc4+Z}ab`5?XZ`lTzHg4y|mY2vRBRoRQ8zPpakLJ!4Xqs9gi&Dbr>% zA{IgZMyJ7YiZR`;91|7dXEBQNtG-lB=mjc=x0>+;j!Q-mkUHCDWnjp``;`QAO)6Dz zU5#_*35r$Ad8(7N%$kTcBIMQmRFz^!iCqq96({gaB=zQJXoe;z<^8wS4oiQK3D6ttqF;_6W53ab@C6V<0=@nFqrZ_g{LpXokYOT`U?b|E84(mbdnhycLPyCq zim|zLrLvo?hz@}f=`9AwC&2UptpVkNAE#(s(9}j0T{PCfchl!#3;moU!B!h^08IEI z`Wk>PwIt0ocTEHgHgF@}RaO!9s8C0Yu5$9f8reM2Euiu0$1?DMHh@>CJTPBI>ONLmu%8G=XiY1 zVADutOU4>mNL=SnM8lgnxFyVHAZW6#U>l;fS^*{DBp`1HrCP;;j?@lQIB# zui@x>E$)2Lrr?&p4Bhz*5J0q9XSnRfY_7C$T#bH{a z(X%dKt>n(4$I3e@aWR@fN}JPV1Ef2tAVKWty2oc8^0b7L!Rm-cw#gqEQF?7pc}ygh z#?(w#d40KhquYv;^88@p_w|=wZx&1Pp2riY(^c`)#<`kdca5hFy>>L@Dn{lj{?gHV z`c}hGV&EW^e(yIyyAXxsC~?YoIYLhefDaTuy61R&$Dgdidc3N30zJ7$ijjlbh7RWT zbBu|@3ey$EdgOoENN!oq|4#Ui9?0yM0#SlES>#^8cTmQQb1|6c(~9dNSBgr0W$kYF zm8d}K<4?5JdM*brye>6Pslbry@G^!q@&VHBp&Y{)3rY=+cmsGD&e@RjB>2Ll zid31aacqg`sw*jaBG=o4Z6T=5{-|}X0Sn8qT~txjiGxON;22ZkWu`_=$%~Kcbc!4j zo?O&e()s-(pbm5@pSP-_H47hJWDwh)hbRCe!7m}cx#~cM4AzaOXiQK?+7}A%irpMF z#yO*1qVRq!ezo1^F=DKAuf}JQ36EBV_i|}p@z{nt3}+}!6zgy!0^-dnd8G36GXpw5 z?g-t+#U_g9$Dj3i64Sscn}-6U=nSjVHh!d5oT6`^t$I1=+{z(lps5SN8a~9N?@)p6 zUL>MaqbE)v*qbkn%r?)GVSQ>^`qxIj=30}kl;!Acw&1&aI+C|%_7A>a=wYCXGC9?h z1en@kEGE5zR|LSZn0K(YMrdRuG0W^(L!R6oma?IGuQY7g(Kb7WYLPqFpsOiXgx?Kw zRtSbj%wa;nw86f8$WddN@SvMUouiu>%DLxWf-$?1fU(PHD1dzf6=eFcrPU~jvG}Fj zJ#z}YL85?*oElF-5@+C(t#u`bI5*G&>`H_Pw+PIO%B<7zedqdl&w$`3;R}DY9tHw! zG_I3!ye1z;sSN2Oik}S$r~6Nc>*9itM~5lz!A8Y5;8W0LGLtJn;kKT^5Gz?iY?a(W z)Z$UvFY_8o4`B-{3!ObPOiZ2#x!wBiA6yXwKDW5K5IRqHM-XYVYXI-f;|F*>V8`oi-`l(Xr?$*i1QpBET+H5t%$e|E_eO{dFPfD}i4PRand7jMT0m(R)Ur zHJdhQEz1+M7)j3M1<67D0Qd$N&I=XX1S*Ek-#l==VSdDe(r^4*Uqiyc;t?U(z#(b5 zohn%&6T%sXG2`^gjt81UMIu3dAHp5(6%b0|t!XJQof#H6+TKhRr}oBv>;WSgYQB+$ zpE{ohN#_CTWr-SrH38e-@1m}|FE;apk8PeVNC8Y+L%VCPkc-D|RK#3h@Lej&`FR$? z_H<9qC$_jf1Lazuk~vNkDQVX8!}A^?!;GufDz(aT{W8+{0k`p5^%6OIjZS-oG1}|{ zrRs874c8!14+=t@y&Q4lRz1uFoTGIZ1$k|&a zU7;!A{fd$gR}k-!Ge>)qgqI1Al`l*hSK?c?v(D+~6TWlqZ~80+I#Wb!ch^mVL!!R| zv&yuae=Q+@UCxH#7A-rt89IxESqt!cE={+GWz>hEJiM$_z|h75w1$c|lO!u#Nq7n4XwEOnk9bzaG?Y+ugO| zpo$Gt+>y=2B7k&YLDW=ZsLcklq@pSBYwO#=uMIOqf+IlO?AV*$J?uef6{^ZM-ZNm- zgwS3^6DQQY$;6O;z#@8elHJ__x9KQDt7&LM@vGRuUjsj*M{37v(FQ7ogen+7yzOkC zI6sK|i3qg-j(uk= zvX!6u?IQtIBQRy4`Pr~qg4U7qPCx@gJ6!Ug)k5Ev<%Q@VmRrwWwZaZKnNpXM7&nr5Qu>E#BW81nHqm1>g&vHYi)L<(a$L7+Jf3LMWd3B4_1lI!)K;29D)$z!ymGQJ5+)rPy|2y ze%j=bPBZXN581BIJJ%lHYjr-|AggdhZPpeS1ExLuwYJcY`xeJ2nD6jv&;vdtylTEv zsFCMG=yh8jL2h~dgY>fcQC;Rq2gk#8{3GP=vZ@;rT(7wJnaj^aRn|^Fc^^t-PAp@O zUV{C>+?2h`7w1@4LT%r}-ER{PZ0|EO&K@OjS7MF81SrGYtLg{euqBD)AN_jX#;w|W zKYN!v=>~;k44mH1Rn^&Et|nMVw0+26NJvgsz6jDy(Ur=tqN?<8OXt2?r#Zx)H}v^* zrQaV01~uqv0BwyPlv=v!fhvXKPtK}@8oNP%7fUDPodseZ=( z2wFon#A1+XW9tSqxtF!_S7}X`tJdnOXbJ<=6pqm@W3IcG!S-q;`QDQmLl=Ps{V)q> z+$n78N{KfCgo%(e<8|uK%|fjdZvv$AJ!XXs*gu+r^QVH!=wYYHuV4Fcg0To+tD3UX z%>dBmFUAFE?nUxgo_!)iUP_7%f(+jxq*sJc7h>dAE=P^Oc&Y51tvIEBa9W0G$3<;J8 zn4WA|X~8OxA2`*mMOi1Xi-V5N`&nmkZauMN<9NZTB3>rXgLJH>O{avZ{^EH70$Y<> z?cY3cjzF3Gb}4(&O1LGP3qW$rEMND}cXOD=qhgVicK|GB=j_qpNS|FJ%Ey=g;T@tl zbK7*z_Ey!TxVYDE4FsrmIV$~=M_L2W!pa-k6xI$Ke#3@-Yhn=2`1K4wjsb#GCEc3l zYrXd$Klgx!orTOyVPeTIVhje<{?QuWOrqYToi*rZo(WO!2v6Tc8F{e)@74(lo&?d$ zrT=;SOI z7qyQd3ITJ)j*)czPha{{8vEWq>ApnlF-@l&TKhV9Ekwufd4N+_ooUF22yP+oJFyOC zKd56KvOn#xprq$qAqF9_Ut8+gc>sl=to~~N4O{2+d6_$b*oqU1Sa$qJDC1VB)qV$z zjB3lC;fCj7{b+fw${0DUnzg&f0Je-S=wpG;KFzY8wY(_8(%V~8q!c7Kx6C3RqbSvg zTznj)(*#v5lFz`~XCH5fS#ll6jr>H3fv$qwvruHt4XvDTbQCnaPi0$Az>NZ4EoD{K zWdxpS9!{>VBnXt+&S(f>$KwQ^U!SA~!NKH;yJ9}nglC|R9duFOE4l0w7FFQ6Q6Tc! z`x%kwdVHc-Wvy<6pW_dcHh1)u_Mt0@qs9CEAZ!`(Rngsy8#YOThBu-?hVd@3$s#+> z8kj#K$u#;B$$mpM;3l3jX3<=DCdvF*k9$R>YEJzobUwEM{?mz{4jP}re`IcmTsRUZ zD*=w`wOMd`us2-10|vo|AIdK22r11#td%cxmcxT^V__+HbK+=_TyRyS7Vo3>SGqrK zesL1n0^J}8#!@Chfm=@_5DEMdvn;4eGif`t+_$6{>)|W{yYmw{wti~J^dBtnerYM_ z4HBhmhBn{2LI__18)OKjM{}V4v4QRKjRL81==5S|w=LEnyL`HDX92FsO#q`SD(EjL?z=#PghF;-O2 z6ArJqTI$I_fLMG(O9K<-*tom8i|=U{T+@4x0zwX;rmms-EbbAJ>07L6LM0}mZcT^p zM|$)3CKM=chTvWa!d5KMdZzv9={woFE{P^@uZOhjUgEoshC>AABxh^9W8?8 zeTnu$IytSVT;XY6izukC3Qk0FKGVV~npgBVWtMQH3Dh!Q(`ncJ#v$k^-#?y;$vCld zOHe!EqZ*{xSO#ZhNXX`5sbr9*DN$BR-wN@hN2MD4N>0N5r+^OBrd&L#SqR7!f#3gq zB0M2@wgH0AFDzEskU<|<->5RGnF9Qym+Is#3P|$VsQ3PT?w=)wcsHs1{rWpcb9BzE`SX^q|VQ8hUGhv0jAOSt2N1jOz?D5ad%D7<7D z(pNlulWwr6Ho5_Gdc_?oez|jEF=8`Pxjv9&s0$2}aH%ei?fUQ?G37^XUomw0djD4{ z(53offzt;WPZu5Fp6pyBN#|avF$3>mOrsk@LlHc|ks5ajL`qH(#w?H^+E zdmTa2(8gx6qKqFEOKd3qcHhA|xfQLR&j|h5Y6&Bp?)xSdJN!GK2Js)T4~(yW00aw@ z0G;<4@sxABQPp=xtUs-U9;-CD(h|gMN0X6VG?b*KA83vSH`EgbQHMDQv$G_>@QTm( zNL`&@d5XAGdw&UgFGVyNqd&>~Lo0%YsL2BKs{y1#`;r6N*%II3$MMV*RCSrY7adGB z24zU=cEwANBFh0U7CA@mj$+U5J&rq)@2M(F5y;%!F5*NaHCvoM{=F%j=j1;M9+VeW zTW_e1%4~0sM!+k?T>~aYQ`=!5fvFJh+!99qy&xb;X*ns1`SHk;EhY3gpp#qq( zLL3h~7+%OZb6z6iu@s)t=7tV5MhxwGIQ;Sqxw>Lu?#jq~`kow^#j8Uoa zlxII|B)XrSru+n#Ec*fR{=P1NgzDDVrl&X^J$`Va_ks3Yco2X*tWt)Br0^# zUjy|8e}&e5i~b>Xnr1j)Cu5L}|Ee$2MYssz^EIe7vGWXD!E%QiE*5cFx35gc_5~gX zAA(Z(oY!iNRNY%88(qxoA~j~Xk1Il$fE%*pDMtHRl8DTY0MbvvY=2zD&Wsx1B?VeJ z051U?=)J+OFSET1D{DXt24~vM!Tr+V0UHera8U`@flLF%tk}swc zQOGfh#qa2LM5Z^63}KlSO(mCt|K<-hf1(0Oxe1LE{sIJ3-p*Al%!&>$)nW*<1Ljli z#U~Ss%MtRZcSSr7qD3r+s?3yv0@1Hpbt8Avs`=m#D23fomADBw%^ntCCi&0Wy5ClI z*nL_Q6&`@5tp8s3w5%h7JIcG+M*{U%82~P5sBBT`eiU!ma9>Zh&n^KLYE>27} z5Iu>^;XhQxl?qhh#EAU9<)9RLM>lg@h;lfzf>HU35sZ(DcszWst5$Eoi7|Bu{GJ9u ziHl!*ElH5Ie!VT3y(mtc%5F!zF!-;n=;uSqlBe(|+Iu)ZgQpv>|LEJd4-IpkaByVoek?v06` z0S18i?sv6oc4pk`%n>p5RUU|M-OT%cUVtX~J036b8~(ww&@x5kt*QH0(aB?8;8|$E z05n)rm5!S`=s+DS|4!|nCn(25-j zukdLn?3vIM7X8kI^pIn%P&=ekq-@6K|7iLOzo?$K?Xz?&-Hk{pCDM(Qgmg+b3esJ> zbO}gO5o8O znWj&eL9fD~h|@{AdDaT|P@uNsTcR^>bo4A)tHrL@_md;#cfZ%W>!CQf<~~u>gNSuA zH_@HFXl-`9pD}n3-qw(%<;-K%uWRbxK-?Mz&<`p)^Qpx9G!kPhqfP=e-*&dsmqY zNxuJvIV6#m!BD-WZvZ$z`wzH`1ALGZ`}8f*%RSE?84G4;JEmh$N|qTAJI2$yi68h| zIgVJmPQeIkwaVUbSv-wCCiCdo+@p2LoLpBY&oA8SFZz?kTb^lMV7GI9ehv+`zM|9S z<~jlCYN41>tQ8^*ZbCaxBo3qHd|KIx|7H?5k)zqNw6vewNhevrkT{l$|&enP5x6+gb%-r>gC zy<|%@IJgP4enmg7M4ihBlSfUxT>oOUN&;A>F!`xr1eJlxjVsM6C1gf>D-Cw;VmeO7 zn$b&g-hw^iM6oSd!6;*O*zXcmb1=Xm(2kSjalb(tkjap%j2x=hz5i@f<{y^c(mcRw z#l4(4ZQL#R_E7^W-X7=fK|NGPR-I2)qb8VN_4&<;`X9AHF75O4Hat`8=WZA$zONjt zlZ0Wv4k1Ju>3PKN+8U&uC#Du(Xp%!>f7g{8bLDxkKKS(`e>>`d@1Xdrf`y2f5 zwl%3%s$onL&6;Wk&3+k8u!qy4!y zAs2~qma#4VoPdex#lzfTYfl?2;`ZBm)SN8aO&thom>c#fRsUIfhD#l)Qqmo@A@M4C{EeUQ)hw$I~$DkZx+l5KGGT_FcU+J_t? z_%YFh{bR56FU|H>QubVxZlLa;a}#6Q&KC?BABlNpE-VEd-v|4%`V@G|Pk++N9rE`k713OD27UNm?ppm61QYWLRbt(QcJ~O>ye}RghKuelB;`CLq85A|{Ab%~$*R ze;WwX`Ew&jWc@Nhj|8WDys&o()g#cY%l`2NA)u8UQshy1VfB*Hc%y%IkyA9dx7STl zPvf1s6G!oIxAj=_s~WxZ@{kW-i0v`te`sSwndh8S$JL|(4-UBc`(_0L1qwI?up!T6 z%L)OBCH&JRYa1VaXlbat7iQcd_OogDF@qjS43n27_qe+qU=3%*d+tOpwPlot{ZW<% z%Tni{EjO1AqgMz|?F9lHZu)flFzucZW=|5N*ei5(tX8!%4R~%dh`Zu^+ameHjshMD zqp4t33&)Ary86S#xTSI+0ZFc5hcfOr3<9T0n^*1igaY>`?qLLklfB%gc+Pr&$Em!H z!&HiaWa7>sWJ=;5P_pf8Qsn)qg2Qtopv+e6^>CJ7oFFIEsADrL$UeU^O=}ueW{_sl)l*HySAR@}!PLs6 zq)U>oDY`k|>&a;D=Cp9w-3iS%irn!Oc$NxP(p7q3RTzerQMpgddC%$_U&YYAd~++L zoPAgO%JIQ}JgJJdQNYwdd?=oUdyOUWR0`@ktA#FzaqklePLJ0-w*#z_wo+bQYbsh$K4dvddYbU&`LA7&djCR@p@J&R@7g{W5>#(l62bV}{Rtg8`i5>Dx-sdc!ViFe1|#kYqkTdS+IIMROmMq>1n zn6!{V6ym>;E7ucX8I!g7qoE`^(dqLs0yUq)^x~fsE%4>b4OtS$6Y2FIV}+9OC&?)@ znSt}7AkRY5Rzv69{_kFs4C+N+q`bneZe)aBpt2XCbrZWsxkO6(N?#Po zn$8x?W8^?l_0}KA%p4UyY)QMZGu&P-1KU!T$`*Yo3zw+6*1b7>B-b$A86v>e5>m#2#5d5?!B)U>6+?GDU1+r|O$f%ja zn*A;v7TMO;?S#G`HZmUy(snKp*Ap@e#OI)By*XKHLd7oWetF!md7FT~4CQ?h%YvU(6d|y>2 z7uJ~^l8uqcpwkFQ=HsZ8Fz0GoHe07gSbN!$^7gWR_{m27VvJ&<1k$^XrAB<~r^vqS zuzN;Yws#zuH?--{h=vckN~VDq|I;LeS3D0+--Q#@V*UUWRq!opOr6F6^iSv;(yR|g zyKd=*-;x+Xr?jwvxBGXtC&D21phpnuSQcXt+T-Vsf8*cI=X3t6FejD5(4eC-^CwJJ z6^sgmKM_WlU@QfZMVeWn##PvPQ_!*z_;YF1QGJ?s*LLY2!)SaaWPI(O7CJLD^c!5F zgHhIoL`J3)b!pcc(STzKbBeU!Ln$H!@;ZyT|1E5Ua~8u2c*~k_ePMMi_%V3E;bw4J znY=L1znL|GjoLBR@J(p$;5sQm`dj^i>|NwWx5m0viLQ1}jV?(39^ZUM$@grW>2Z3I z-9Go*Ze~shkEY3W~Eo_?CDs9-oKsd zLzp1VA_z{Go-Txe8#n4&X}U}Zq*%#DTV1bvt7?Dde+O(3Vw<0FI9)fB4BT2nu%3 zl;Z+Cw}ul3G(e0B&ad*(-&u$R+&V`8LT&5U(oxKT*3Ew*4CDR(TLx|xAe~H)-GyYv z?LuXag1qv-1qMu+0Hn$#3~cs5&m~qaW(-2dFR#?fjLUk9ABp8TK8s?%TbX)zH_p%q z&ewLJne;l1IF5s#1yc)?;~9Q)s@%A6%}6ogUkn1bO67*@%4Ck0{X zh8)@hDOb2w5~ zhxf>n%Tx$6*sT9L;MHzbCUQfSk1z{l3IqQn z5P9! zHXs)!*a4oeuj z85^dp$Hsi)JaOVeSo_53e?aGtFH(R2XtxC5XFz$4T2JZ3EVw_O+{p9s1U!%slaeK1W2=5Y!Iug-Aw9V?;=oE_Bb$q9005s9=pg2LL>WUb*HSlp9@2D*(LpA zM>JJ^h_=~BKK&C~H+t-u7WYH{oK3%x)%h>nf%c`rSAd=bI7nNRxAJtM?FdHDyuUyHSEb{W!2K4R~Ch_u;!Uc7_*M!Skr^nDLVgj`M~p z9-p~CN`pNbDs)yG`+^Np_wBuZZoRTllQ|D$B2^}vle#;%_wlanW<)Ns-5^?;{Kr`J z@Ka7M+lEj}EeE&)cw?^{ar+SOmonOMEqK@X9o$8W2>*Lqj=+mzwrs{2jX=$&tmbm@ z8;~Bm5dnC9eph4!T-Krtg2KzL&o&G1$TAZ`-*Dt&C%mR5N)wf>5}Hl%S$Oq1wU`QY zKpb;^o^6%-G5H%9#;i?ox;h1A=nmLU4UZhO?md-NRI?w{uDj@r^%`*cUwDYUrq5~tl9JsSFtzTm=1C3S5?b&b&-TM&#??2QzH`Q|b!(mmc;miEzFuj4WanE4m~c@OixU1Hb!_b!A(==e0=BP9p&Lh1?OHWOapm#r7;);@v!h z;FPd`wO*H?9AKKL9nzTel3D@IBU@2EFGT;ljJZsom_jiH1oVwfwKkIneeP*_;=3d)ZSn_sB+_TB>9|&OP}XPxf~V65b)Ifp z(`LLm`!D-rss&tG!_XEbcOb~ZKMwu$zx0|Zq?-C6>JoOh5y?q2h1s4Dk+<^>37o>! zrFa*lf{=2e+c_Rjmfm4Dqr@H-IP+sU%{1ZfFjF-( zbZBDJkYIdC^|snzP?`Is{5_qp%Kcs^`q-Uft?y`Qi{#;Bv&Woh)0as&k-eDYoi^R@ zp2KEPz)&sgNN~cFDnZK!nn+moxo}0ijcJ$T@UKV~C@$fT=6xi2*MZqB{zwws-=+I; z0Xs)qotTWLQ0`HAkn+z#kUF{x#rMVjUmy;Q}--tX&N2rQ|w3^Q))01 zYBPt-x+YsXCwx|{nS|TXmA(?dcUWKAWBrC+AeEuBpi&i7U-W^8htZg1MYG}^8&7#K zGRe2fXjQakcW9F;v8U|_{Zh1~f?z3@Hx3q78D3XmSImCcrDjtE(b{(S8^2{a|BJUh z?)MrUYjp&Krk|T-t9Kx9+cZli0EC2r>PsGsiSZ|>yUk+GPkHzQbz^%KBU`ChDm9Ry zG=+5aszi3PFZNSh9}9&r6E+pgCgC(n^yZJcrkz*3Olp;xU|PTa<{f`rBZI-uW9ZTd z+(}C12#kr(ahRk({g#79E-%VLRgemw5$|2zYwYSOzP7SCs3)2mmpbX$xvndSUXMO{hd zdyGy6lGsU06?gJ@`!u}H5h&;n-lE9#T>tOa$##>fDS2OU>7)x3*_W7V+<@<_15OZbAJVN7>V+du+-=>sradlh5ySs&IZv% zeEg$?=TY39(?s^N=$OoU zyFdec`FhiRh5?#h-F75@V}egn0`~P1>u06FsOD32g3f*fV|-8qPRTxY)v(>pfvaviqOdGcqgZyr6m7>uLl_0cI}G&?ubbg})?v7;cog&j(y z^bC;UiGMkpPS{_qMx>S_5t)UO@9-xB}XX}*$A)|PgH9%1JHztWNS8!lrt`&Ay2yt z3P1i`yOJ1cw>l%NqMs=}VdU*)n`bCZkezBLETumk(*0V&Q;re@o&hS&^z*dKu)S)m zdlu}C2vZ%dotq)6KqwmJ-}Mr=qlpoyzaWM)UcYd7@^FXyXm(+)Si=5J9B9nB01}q$@b)K6pSX=E!utF0hoURQjc*H; zPeGDJq|J=b5zNs|Ery)WoA}x55CGOqXcQwmjd#C?B#%g0^nLy{6XfR+)r2aSVK05Cyt_B|PABHgTzjUgN(FVjF?8#VA;% z&@^~gsqp{Kk|MAF`BF9Z^U>9F^@xUs$N#3^&8mSz@|BO)BTZ_Nn$B;eG}^In{jR2d zMH&$cW6to|$YS0v6?daO@$Zjtm&Ljo~;(9Tc#18@;e(bb-os8m;~~60U|( z3>c<`+2M={eu?%b8iL#4B`8N8Eq#gpWIx^(7@6GSo7~4a9sDd1&B1dL{mC$Tlx(W- z;ZXhY?fg59eLe^}h|$oC{7|}H<7*ETU@5O1`iqVGHo3*28;uXBLR$C25&gW&cd#>6 z@eUZ}DdmTR(u{AIa6TV^o&xUvc2pff-fAJb(bFDzgSIvF$$m;VF5bDBA$;;MHNPyL z1yAR8EziA~4xaH|!Igfb>VFCz@fsvt8vo;#z%+DfJ?fMFq#`Mw9+pD8jQ)#>YEk$c zBrqg&U52<-3^`w16Jj-sA6v7aO$Fi&^WgchA0F)5xaa&YB7!0GgO z_?K(&`1h3RTcYJ9+vSuO0IWD%1`bbIO$zCPJM;3Sq-VfknVBW%(um&YGRHMiBoDCs z8E5(YAvkavv!8cj-LN}VO%iwk=8MBl3ZJ|(GEjOR5xIog7!`}~DSnsv6>C>)9oWWR zA)tK7MA1F7p$2rn8MurP90@?p5zf1qs*Ok6#C?F~*r-!b^=9lmaT(7yB-L1!2$=T+ zAv#}_(|%;XF(Ldx$U{RxiKVC)@Q@nX+AWCXP3VI2_SK-Lefrk)S=*0kF!t{I5dzj> zVaiKR@zNYTwCCAqPW9x3b;b;Kxg*0(q*+~b2MjZ`(Z7!|6^>pjtdzC<<9QERc0pXZ zP+nIluWl^5kcJ}Ol?w1!8&I{DT-qlepeF>D#U~Z_V zU-G=#Oe25qva<(+kxz2rl+LU_8x8)T8ePBY{Z!;wu&828YqxfF&uvW@2yVN(z%jZ5>z+iBvyBGm zLb0Ho?okLN_8(U(vSJD!if9bWJYQf;4|jRp2m9ve|F8giTL9p{6j-P?qwbG`fTR(n zcO%%Z+M1isir2ze4DU@XUeH=K+VIsqo8m9gUGca3OL1xI%NOn=8BDksnpiGdY3O@_ zb$qT9AGhnIF;RV{Q3W1|z%uq3igKwg_M5>mBwTX7PY8M_%Qj3X_EqYeIUFxx4ek{?q!tR?eitD>;p!aWmmx&L&mWeK!J> z2_uvIP)y)FO4^#%D^VAAzI*KgL357Qn9brok|H>T;uI_qJ#%Ir{^f;LAB0vHj}zvk zj15*S&!VpWd^0wwCIXaBr!dhPeqS>C@!#Dd1PvexFq5w3Al71l+0;}1y=&N>0IC+_ z-sMk_eKE4Ku*;Ab7$e3mB$4~j_wOa6Upw~Q6_FeHTZY8xYB%acAa4Y!OIi2ruVv6% zQ^A${jf&)jydj5hR-LWZg)7GyK8zJS$Uq%8J%JvBsDfb6manZJ%1G^&BTw$L>2l5E zecxb*!=p#qIk4an>8%LJ9Xn88?t{vdzE_*;OBnf0AZykyGfD)qHW2}yfs=wPUtz^ zv>wvGV9or+t&?0RMR(JACGap?ps;Kpwx{RaDctQBgf;I&N%JCv`%QnM3eIB8m%clz zm#+klmJS+i!*~*=o^KT&%c_kyJ1&kXDw$~86*LM62rX*RaOjv0tnwC6~H%VKB*Cd6XXFp3w~EUY9~@p z_21a-@LkSt{0)gyA*XHkAW9^B%$<yx~5NN|Np3-alol-eAOqjXgd==F-PT7~nqQK%tpp{dq)w^V2_DDR$I{Wvp4jq4>))QBrG8}}Rn@EQb*-Z;d zJW(7%WG6qwg7y~s7vj3&m%jc>Q~oBn$fSF4+BxkgwYQx#qx=0S>msX#Q{Dtj^D_aG zr{FQ|!wR*t;8#A<j%F~}>b)^`sh-x`;i+Z{ z({8KX+l~z}>m&{q_#cakaZ_ zv^#9i%HwjFV_jXHv$RxK1INxyg& zcx*WMN+kEC)yni?ZMY4s(nDSL=}D=NBun74^@<}wlhZ%3mt`Xxs{t1(^T)9(ghnw&dZYY;I;3l@-_2+v!Pi#mcws3OwS)jVT&L7;asC%ikuv z+t9MZAjPWvuP~iE)3`+Hvr}ys4rQbQ%RGN< zJw@?9&iCtgf6c%wm}K5xQ%_+0EAVCC#8p^tymK7A8y!&Q=|C7A@jc5uk!Dq|Cri}D z{VB9(i=~}m>AHPO@)COYy^(xl_=Ca|L05{X)^Q;R=hK{|nHy{aU>7WBBLCinulHpD-N5oc_!rAjx`W9`?@ z9nbrt84<`TD@bpxkmNP}2lQw1@bH}*hkL}*Jw*0S1I@gMnX>k^;MVtkd>Rq|*w_sN z_&_Xmxlh+4b2T5cvZ9c~F0WOYrU!H%_!hMYG*-|9?wz5Kwh-pfP=)>3r|`{3m(A}{ zllewWH`)ia&Ze(rk{G5rC2>$R)N>@_AFpQ)0xr3nPI_X~nF3>wp~6DKA`PzP3Utjp zLmNB4*?NUY)%JQ2W_sEybP+qb8%#*v-XgPc9`yiVjCo3Grm-ToDwd5DjGT%?Dvj`() zT1R>dYF1szVJtrc4zWG(8rc{GrZuz}7gCPyr&#QczV@h)7*T2<3_7_ch}nL1;E<74 zNwLas=8dk6`2SvuHeTuhRacYG?4}v$L!FoKf?{K8-5Xh`6WhFA=w`fE7=3{kIxu{O z7mZ2qrqYe3RCH>IP*AEps>+y40k22KpM~Fh@6i>j=!dT;MiH1;qrzIiY>n2R>(^2> zt#(h&HkQt$cvr-7O;m;I7BBbC)yGfTZbZQRngh9>HM1>GT5$jKNeI&YW6u(*Y{^;f z`smYD*5G<=2f3onzWDtE+qe>BwfT-MX4XvvCRU@?Harns%vNSKS5u?X@B;LL z+`tiXGkr#CV)8QBTk1_*Us_JC*^_RB4TESMcZ3Zd!JB^ykEVFz2gp6<4rmL^;R7+wmjy{mPrz4iVrhvFRfWePY%N!ER0vM#d3Ig-|QnEpJHcAgYcl1hCyqkTP*qTQA@&xN$NTo+zs39)r z!;k%5?c*33m5^dF`!9y+gmwQS@~BUZ>%G)MZA2%eXI3szFKkkq?m=0yNUdvAey8Tg z^(}-3&^{=jK<}V$!c-4y5CwWLMC2rVmbFo< zEP{Rx=G6PfNC4QRF+SOeJqqv6dz86pzzD?H2nznu2uHZKpAROfu;F*yaAsbHEQhZN znqie|Bp0`ZYl;dUi*0B&PHQq6XDtrd`)7G6iB7iVzg=XGkDPa z-u8ve)zDhZU$stb2V3 z%h(b5G(D|PXWk~8eDynd<=`oe$89H}xc^Cl5reW!$;qJhyz%E>W7T{?p=@bFy)n-z z3%kOZO}=EQxWRIhF}c0>AEOb-%Rov3WhgYN&VRJlOW#Zht;YVhuC+F5+#>SP^!Dm+ z6`+0Ot%-E>#rp3eqFxc z>i8oSKGZHQYS$gac3Gldcpg)7Zp988hW8v6km(>L~I;qO)w+!KY z+!FM!I{f(x=j0J5p7b*r1>Rvk8=Ek?$llOh;;4__E=-ETSn8$d4ohRIYh%e+y?)TG zgfe?BJTnt-qQZx2yM|E%uP1-ta^>h_kOHy6tO6D6`!;ZdHo`??8MJNv2lWtVl?m|9 zZ&$69x+p*upotL|kF6^DH$)f%Z*PMhC0+ft{N9$B?Rof}s>A=1T(;FmIi;_peC^_q z2v0;$7b)=(Ln`-8X>zkb1Uw^;h5&cjN22iOL5;V`x;Hs|Pwcbj!7U|iOb_N2OARHV zzPekCdA&zxZ_(TJGES!_Ql0-D&TlSwb0Rm{TQ2}Tsf5e)ZTVvNCJ81{@qOw(3LaiQ z)wy4H{%uTg%4^4x!#N*K`%l%OVFe9uroF{^YhPl0DHAd=c}u&zRQs8)K!7!WL|x(6 zB{n&B0}wlz9KZ{y>R#SVG92dnlF2laZx8J)*hi4x+{B%{kxEl2iihK2NS^JTlm&+eI|5fB&BR>tas# zjfSzO=RW;nAR0rqBd9@7vnsIADyW7VxelR}KO+t>prWEsCQFeEBH74`XN%*0BngP- zQGud7kheoflAk=lr@v3d15d#jB9lL3%)pwSN7SxD*i+Vg6jLIHV4yes-k>iCJ}Ke4 z^e0SSdN=#Vk+-I=wkwi6OiJyB$F~k;$@1f?rkz(%TlMnNN+IJod^%z(fZj>2H9SQo zq@$BU|7Q}z8X@>omzPlx%n|y(ji2--;G{X&`erp0yZE5{5ZnRpdzciz`TP0QWftHz zC^RSM<@Z%RN@Qo(n;@DO-1qN@!ieGhufqrSp4p2eoG|FmG`Jh!7*yq_I~!k31!+5q z6|!IDj?$1Oac(auDbHCw>}mV><4uF9jsHx=sYSe-#fCIisM~ogGUucFy8)4KA+1Z` zx*I?rG{MgcNuDWxZ?N}gl#8kxnm$>}*0$OIMWm@UVq+Uboj&RPa~o6crM%S_jC%>d z6yO1>fWMzEF9471Zp2{UgY2O-@08Fem8&7w5*1wd)4J^)60t{@f8eJ<*lZHG@a6M4 z7O=t^3kn%?o;qA{F0Yi+9S%&eK}Wob;zdT~eMv z^*>rgiAKV}R+8m%>WKYHWBv8<4@NgRS%Mm;tpk&bs|ox2=>DIg*y!rF*Dm@V>Mp+a zd@%-(_|#HdLOU$`6x#!`*#xt17Tj7CNdxSKOqJ|B13LJLmTT(I3Tq#d65x8A-5T`D zWE7(Zh!3+c(HCI2A$Sfw)^0NFEN8!X2%~r>V*YviD_$1pmYo(K~Nv*^dz)e>GZ^g>jkj z{6jP{DhuU?k8m~~ymV}U`$$H<8%=O#OBB<#`r!n-Wo}H=)m6Vu`jPgWeG=p;{Gf5m zaeJC;QaVWodLSt{9|?`t^WNeHd93}z8kWXwQS5Fb6gxSNRP~?tz6jzzg4ufEx3DZV zJyk$Ejv7-blSCs;-c=&``Mz3vlp}}@9z$UDgO}V#^rRTA7FxW#{C0s75i2&)jAl)u zl@gp$6Dzz%gnAVQn8&yeT9Mn9_j^O`QzhM zRLq;eF=vz{oEGi?qyw^8$DD8{AOyEt47ewQ*Fdf%;V{61qOr2JX*c*GaC}yPj>@q4 z{anE4@%`8$^DdFPWea&t(oc8ysm`oH$CF<}We|WXnMJ;~bVu9%w_02R?$`Trig-$X zi`JN_4bUc>7OaWq)?TlfPt$F%ltsQ?p-Eg#E<}CFf2!Y(G0StC^PAp7bd<;3(0)z+UQA-nxk zXjYb;)M2g=G!l#*)Y%nd-M=9yKE3`b%!3G1?wVN*!YTuTEN2VVXfvx&CXTOiy4^yC zTbDPl@{Ekx#x}1hLc0<3obihkm(v)q?-_F;M{i;?+!mqM0MpnVBC`j9$I1pdVWe05 z9@G;m(=8Bw&j=TWvpciH6fkb>fJN+MJ76gtj?KiXWLEeYb110o{Nm}6r4m~maoJ?@oSR(fDz|(; z1ilKq&$sw4v{O+s+9|c!MOe6XMtC9W7U(e_gYuxX`8$W)TSFD>cef6sc@{LGN zqG|r`-Z@xXX?~Ywz%pwPkQ&fC;OI!_)Em!w94^LMZXqg z&RD1`Tj*RfDns&yPrN3^@Oa++e#(P(x9ukS(O5w`97ZqCNJTLE-Y1_D{t6H)brDeO zX4cs%VT9DOWPI#1yt*ER-9DIkLr$ea$y0)(nTuiHWV(D2SeWDScszpM%H_W?g?ayM zgB<{mW$t2#Fj!X3eN?K9s6e9sUA!{y@E}^bt^6ES2&-)=rmo%jh2TT$coRApQq3!| zbspgA1`!%2;@n|~dtc(XX%4Rytrj&ONZ0b3{jMPkpoX;2CA#o{ii#BeON$=^g9=Au zUBos8MH=1~o48ilm)J-RQBxbqC(?Tc{n>bF8;U6t_octwuX!}0isCFM-;8g1eTK(q z6{$V?wUBGR`by=c&-@QI)RbdOHo0{=*q)7=J}NR;x!vQIWK^2$ah8q^>bJ~JOb}Np z@uW;t{^sU<@Z1?oW#iw$MKDaM<#r@;;}E zj(XNm2v(C%e%e1RoXqktg3QwSR;*KsiNLi&gZ$^|@>Xu=3q;nma3aIZXu@c=uHzk5 z=d#N07g2GfJ#ZWRh!r?i+-@7vaHQN5SPu^@GU*!<=!AgHbN3~@+q+(eSj7frIPpb+ z_tw|deO%)@CvL2)2ZpFPy!KwB%#0G6Mt^~;rPoy5f{mw+ymiQj=vh8qqs=R+9ziTn z7MUvmLuy&Zo_n)i#QZfb1|3{O8yfx5izk$en{)lBiMUx!uyR_ zm(r%`n3d_@zRx$t5Rt7)dZiR&rD3 z48GpflFp0(1#%id(Pswdd0KwZlA?`Ks59w%$xhJDzQqe0aRfJpIA(fJfj3QFG#j&` z*nBDY&gPSf8L+RCcYy-4Q~?Zef$+;K1qyg)8fGEZepOFs70~sb32PzOqlka}%DW&4 z?@uh{19BWJJs$sO%O|ZI4j*o}!$jn3aK0%iK=4e=O?u4SyFhKp?bP5;>--#~T9m(+ zoKu}K1Q4gh;OxH6-Ctl|w8%WY@DH(7H(~4~Kgn?B*J{Ec_c!NDD}ta}F&ne?n>|Rz z(1vqCI&T}c6dh)0*jsIWTd&u2SMzl>Z>H;Jt2eMQfq7!)%W`~g@2XZ|(WG8nT(hu| z@l-*h>8~rBedLGYb+|Efp9fY?*iW$uP<)O>cGFEp9H@VMoLDl{AA($<4;6cwHIn@% zBEqeZ+(y&>3rs@R0O!OJp9tymnRMPF+{;IJ5Po%Nv><^2W?2|-T*sjCyXpQZ(2d!Id zlMP@tj1i-9J8nKf{>rU>&g0zPd(&6{{m+-eMUO*^%=ps3z8F3%{ii(`gR?_@3RX;Y zqLTW&L*F<245~@6Iw9XILUzwh%)VNv-&(v(whay4GKdoWGNKijCAm>-V%XD&=~(x2 z`D?NB?E*E}yX&|)++ey0!M!b~9h(2{SBz>Tz20jxV%jE-3fb`1rPmZm9!po^#T=W0 z%cYi37=GRG)8BeX{X*U%^*L7M!kpp3~;o5)I4sUTtYZ+tjj-=Vz!JHeF(o7LY zyNnno+or6YwzJVWG*&D=`fmsn#$(s{53(Hi@pR3>K`LIF0sILvX{Ka;c;@&s@DKTE)B z=i!La#FT}3)oIJz8pddzJRaX|rk0bvmUf}`UIF(!JR!|yq5lK_H%Io@epPBrQ>sq& zPjo%(D}kiZqfFEnaSoD&;Aexuo^VcN4AC*n<)4DiVRlJZ3v$>=_CdIV-sBC&0|aF# zhh*bb{A<;Z@89=Gm5pKm%wgwY@hx06=$h>!Y?ri{SWO-@FOL*Tcs?+G0lNt<1 ztwEv9pQhKusgZgabqmQ!f!CPW|Az&zk?JJ}ub{+k^!pb0YdilL>jpzVFQgmcFh+`g z*?Sey3*n^Txx zLBz3rXI6*l25665x~5#z`aGx@^P$H*b4CCxH%lekI=3P`1_5q51BAS8C1{D{d?&(=Qm*@yhwFG zyI%$b2KixEh|*|1HG3`bhgVUM^0RKKv9^V)1k%YqZsI*>S+*qSob$|O)B3HXki`2a zgkfe8k41x!Y|uS52rXOLy=Y@P`+!?2;S~0yenF>8Ygt=ZzV`3?`E9(6SLsm-yzk|| zF-lM1-#4+L>VLQrY_sw96_*ZQ4daH6kNj(`Obcy9W!oif3l=OS|mhak3 z&w>}pBo_UJ+&KR`TR8f#iF|_#u6_W)08(TFxV{)Q7)VES4GThFynXW?W+mr`=hepe z@oqXhb!c<>BFN*8NwtW6!MKQwDpC1EAPl;MMroK>X@}dH?k`Ef<+}|b_r3*mvmz#{ zSL0s^zR1k_8lNxOlKs+cYjU<7@OhbK*RuYt2+m-X2v)cD6aSZA5CAu6-U=}JGe`L0Ko#mo#5^s+}+(FL4rHMgS%UB zcemg!gF|q4x4Hei-?~45Vb+=MQ&qdR=o6|3+F3+`6w1J2fOJ+oy#?L64wNc4(0%M$ zlEC|=RE+>=f!fMZz)C^$+^Tn}C`S0W0l64PG!HrcTeV>qaW6`pyCqQXj%4)8z7=TTA@S^ zSw=@P@?F@!EsW>UfbPAb1sC7ZV(@u7Pg*I|I+_*&%??1*h?ApG&%|uC>GF(^EGJ4n zCPoM&CK^iGY`=&pkma&SVlmSFBLr~53^Y4%?hceou5Y&VscGzzc{4`L%HsRyWp~vz zLA+l3{DMU7(4fah>d&FzixAG}KOe&NyE(%zybnH&Pb$@HKeRes_8^W!8>W;f@i_&O zb#qQ{UJfkk&-itx1VW_Q!(VZ2_8k8Xm^?^-jF#1x7AbsL%q zv;JB(4whk>erJIdnNF=y%M7%~eZzpGQ-?38 zbu9opx=jbK*QEXgD9B6(=~gF=$LfBv$=@mqs=<+>dB5=dT+o;G41ATXt}UHN5fj42 z=&}YMcjNn|ryyXi^7 zmCVazUd922>lSmTMN=x7*7#ndpX*O~?f3-DPn21_uK@EyGyU_CC4MMlWJCq^Tm&C% zgr09>*?{ZJ`?IBS^XitFvo&>K0`jS4zEx#$gFjTNi3(SMs1&7;{K#4{K&eA{z( zx;y61I_y*+5~|ars>M@pKw4ok*s`AQ-uHw(mSDe?^Ij)>dytLu0|7sws*igC^?oe!r;PB)uT zaLXl3?y=2}KS1>fh``B1G$d&o1UIymc3rebWx8)rRm2SX^B%g)(D6)Bdy!^y#!+cIE5&C*>%b#`qJv$d&q zU4?!SfcbF?W0_;~pVPdzgQtxGyrWfvGWr&F66cuzb=~%qC;aGb(Qy`{WM`;9^n_GZ zCBs*ET@=mPQ21kr)^yKdQ2W(n&BojW zi$qkOx|L|QLJkZ>DX^f%>O5ZAasnqDRPpT^bD{^aJkFOjFB3F3dS<_V)4)v4-o@@>VG)uhG%<8Y|G4IVT1gx2X zX9rPu%8A!b_@Q>R2i<1m?Fc8y1UcVV=u+1=Zwelpjc)@9zlIXb zqy4gX+Vb_8n(K=X@jy$JR6tnOe@lsps}TFQwHHs`i5GBu3WdCPuvJA4-BVB-_d9De zY2t&S1%othBxN4MLFuAfevli5UycU-SxTuH@^yn%t5vt$Mu0_w;YPSIKJL4JimWf4 zs-GPwreJXXGt8@d4jc&8-=)*0Z98iSBgxQMR?n{}%7qxcC(V6oE2#c62o#gW9RU-D z{^uA1^TX@B^x_@UG1C*_$vZFf`X7d8Elamv`L^o9Rr!%nk)~EmP%{&)oEwOX@QwPJ z9>bxu1g~uEWqj>^)=9C5jRu!s!51iZX0vIP5rf84G)3>?CbUtTc8lFuutD%$nPuLu%1Jnds zAf|O{L~M(v!}EB%3ElfPRDd-2hxCOX`OG`jqHx^|@ekrrK39uI?ZSQ}#C{|5pXx7b zbrZAs#3RZ%-|8|F_b?SHb_2TUsFYhY8?F4T!*a{$YDh0HAJ;r~1KKH&rvFmH+2_6k zL*9!W1_*;@uLS+|vm|Z$`41kzVF?;P`G(#0W&ElB;A-&%FqR9I3Uj^)dJq=;mi^wz z(*4WQ_Ype#{k>i*8UCp2t=(yBEBl&OXQ*R|5 zCX-6X6{-fsDT~VUAR-mN?x)sigV z!3`5T-}^O&tT~-g`vg%IRX+h6(&r|ha|^aur{QQThUM+!jfvA54w%<)g{|rb&xv=1 z$`UTE8w0u|kv1}`Ldgf^@}6&rwA1Q2wOWiSJ#^}ndU@L~n?KQ&XcN%G^n9%Js7lNF?j)jiv@!bbfuG2RD>Dc0u~*no#tew2j&`YNoK zCDZPEGOp(3D;x86>4jkQRYu}A8~1z|v+te^|MOLBGD0~iBG#|UvES9P?v=maE+2^LSzz>&Q8g(9z+g zAI<8|qUqp8yV7xia=NSs)v5<&Qv1uBGq%^Cm?;eICeqf!HGwtE%WaP4c!97UkZ!M9 z*{uFzGg6AW)uBrY)xwDz`$z`uw8U^2f2`WDc}{5m1DOb#Ujbz@yF0wqUa!-$MhKLf zMQ2KgC`~(}K}S;ly;3dm6oA11l*s&Fyh_V&jn^dWW}-uC; zxn3dyGMWMbnmkhZwYL5uaa_oY)?g!xS$f^~4P6dmRQ=945-kovIyyCL7dbg8 z%A6T2qM5aanW${WGwc?&yHiTBMw@C9@*0s;;!s3KIFJ$EN((Z4Yk0g#0V2AVXh z=z}kTGS*kjhF%j+V35@A@V*X0;{*BTVEYId;6!e7?tgQXjGuRc-DSXyCQoAYXMv@P z382AU;YQ$e#4T?P*p@*QS+a#EgJsU?@YfUUX3X(HdR0_lZgldt+iF330?UiPy3PdR zUi{%)FV;yR?bU_Q0hzmgb|DZ#7>eII&H7ttWyAUm^RDT>dsojdq z`H5QLEiMn5j>T2+L%rP8$4&MnczmahIc4tNb>W%k%d~?t2&6YnalYQm0fELX*s@>y zEdM$2jtx~*R&7ToIBsY7y)p7X6dZj0Y7lYzu%oKz4W08gt7vMJ+ih_6E}6Gc5j z@J|sWF~N@>CWOt|yesP&JrsV}QDXKScgz?4_GzqJal$V4(65$eyA>=XEJxPr?rP44 zQ#=vGS8o&umY}|;2d|F3SZd>L&@C&*Py%X|J2iW?>;s;t`_|rCxn-!_QHBZJH)!

F2=zwbABp9|&? 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 literal 0 HcmV?d00001 diff --git a/babylonia-terminal-gui/assets/resources.xml b/babylonia-terminal-gui/assets/resources.xml new file mode 100644 index 0000000..955cb1d --- /dev/null +++ b/babylonia-terminal-gui/assets/resources.xml @@ -0,0 +1,7 @@ + + + + + icon.png + + diff --git a/babylonia-terminal-gui/build.rs b/babylonia-terminal-gui/build.rs new file mode 100644 index 0000000..02048bf --- /dev/null +++ b/babylonia-terminal-gui/build.rs @@ -0,0 +1,5 @@ +use glib_build_tools::compile_resources; + +fn main() { + compile_resources(&["assets"], "assets/resources.xml", "resources.gresource"); +} diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs index e076d8b..d39949d 100644 --- a/babylonia-terminal-gui/src/lib.rs +++ b/babylonia-terminal-gui/src/lib.rs @@ -1,11 +1,22 @@ use log::debug; -use relm4::RelmApp; +use relm4::{ + gtk::{self, gdk, gio}, + RelmApp, +}; mod manager; mod ui; +pub const APP_RESOURCE_PATH: &str = "/moe/celica/babylonia-terminal"; + pub fn run() { debug!("Start GUI!"); let app = RelmApp::new("moe.celica.BabyloniaTerminal").with_args(vec![]); + + gio::resources_register_include!("resources.gresource").unwrap(); + + let display = gdk::Display::default().unwrap(); + let theme = gtk::IconTheme::for_display(&display); + theme.add_resource_path(&format!("{APP_RESOURCE_PATH}/icons")); ui::run(app); } diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 843acb5..1e35dc0 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -4,6 +4,7 @@ use crate::manager; use babylonia_terminal_sdk::game_state::GameState; use relm4::{ + adw::{self, ApplicationWindow}, gtk::{ self, prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, @@ -13,6 +14,8 @@ use relm4::{ view, Component, RelmApp, RelmWidgetExt, WorkerController, }; +use crate::APP_RESOURCE_PATH; + pub fn run(app: RelmApp) { app.run_async::(None); } @@ -50,11 +53,16 @@ impl SimpleAsyncComponent for MainWindow { view! { #[root] - gtk::Window { + adw::ApplicationWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - set_spacing: 5, - set_margin_all: 5, + + adw::HeaderBar, + + gtk::Image { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_height_request: 256, + }, #[name(start_button)] gtk::Button { diff --git a/babylonia-terminal/Cargo.lock b/babylonia-terminal/Cargo.lock index f3fa33a..d76acbf 100644 --- a/babylonia-terminal/Cargo.lock +++ b/babylonia-terminal/Cargo.lock @@ -147,6 +147,7 @@ version = "0.1.0" dependencies = [ "anyhow", "babylonia-terminal-sdk", + "glib-build-tools", "log", "relm4", "relm4-components", @@ -905,6 +906,15 @@ dependencies = [ "smallvec", ] +[[package]] +name = "glib-build-tools" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7029c2651d9b5d5a3eea93ec8a1995665c6d3a69ce9bf6042ad9064d134736d8" +dependencies = [ + "gio", +] + [[package]] name = "glib-macros" version = "0.20.5" @@ -1474,6 +1484,37 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "libadwaita" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8611ee9fb85e7606c362b513afcaf5b59853f79e4d98caaaf581d99465014247" +dependencies = [ + "gdk4", + "gio", + "glib", + "gtk4", + "libadwaita-sys", + "libc", + "pango", +] + +[[package]] +name = "libadwaita-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b099a223560118d4d4fa04b6d23f3ea5b7171fe1d83dfb7e6b45b54cdfc83af9" +dependencies = [ + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk4-sys", + "libc", + "pango-sys", + "system-deps", +] + [[package]] name = "libc" version = "0.2.168" @@ -1875,6 +1916,7 @@ dependencies = [ "fragile", "futures", "gtk4", + "libadwaita", "once_cell", "relm4-css", "relm4-macros", diff --git a/flake.nix b/flake.nix index ad20090..86df783 100644 --- a/flake.nix +++ b/flake.nix @@ -46,6 +46,7 @@ cargo-watch rust-analyzer gtk4 + libadwaita ]; env = { From 08364f8624c867315041681cfaf284196d3ed1af Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Sat, 21 Dec 2024 00:51:59 +0100 Subject: [PATCH 05/23] better menu --- babylonia-terminal-gui/src/lib.rs | 31 ++++++++++++++++ babylonia-terminal-gui/src/ui/mod.rs | 53 +++++++++++++++++++++------- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs index d39949d..78e7256 100644 --- a/babylonia-terminal-gui/src/lib.rs +++ b/babylonia-terminal-gui/src/lib.rs @@ -18,5 +18,36 @@ pub fn run() { let display = gdk::Display::default().unwrap(); let theme = gtk::IconTheme::for_display(&display); theme.add_resource_path(&format!("{APP_RESOURCE_PATH}/icons")); + + relm4::set_global_css(&format!( + " + progressbar > text {{ + margin-bottom: 4px; + }} + + window.classic-style {{ + background-repeat: no-repeat; + background-size: cover; + }} + + window.classic-style progressbar {{ + background-color: #00000020; + border-radius: 16px; + padding: 8px 16px; + }} + + window.classic-style progressbar:hover {{ + background-color: #00000060; + color: #ffffff; + transition-duration: 0.5s; + transition-timing-function: linear; + }} + + .round-bin {{ + border-radius: 24px; + }} + " + )); + ui::run(app); } diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 1e35dc0..9308dc0 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -4,7 +4,11 @@ use crate::manager; use babylonia_terminal_sdk::game_state::GameState; use relm4::{ - adw::{self, ApplicationWindow}, + adw::{ + self, + prelude::{PreferencesGroupExt, PreferencesPageExt}, + ApplicationWindow, + }, gtk::{ self, prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, @@ -59,20 +63,43 @@ impl SimpleAsyncComponent for MainWindow { adw::HeaderBar, - gtk::Image { - set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), - set_height_request: 256, - }, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, + set_margin_horizontal: 50, + set_valign: gtk::Align::Center, - #[name(start_button)] - gtk::Button { - #[watch] - set_sensitive: !model.is_game_running, - set_label: "Start game", - connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { - sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + }, + + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + }, + + add = &adw::PreferencesGroup { + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Start game", + set_hexpand: false, + set_width_request: 200, + + #[watch] + set_sensitive: !model.is_game_running, + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, + } }, - }, + } } } } From c93454358f39a970da51536d9cebb6243277626e Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 16 Jan 2025 19:24:51 +0100 Subject: [PATCH 06/23] add menu --- babylonia-terminal-gui/src/ui/mod.rs | 121 +++++++++++++++++++-------- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 9308dc0..450385c 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -14,8 +14,11 @@ use relm4::{ prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, }, loading_widgets::LoadingWidgets, - prelude::{AsyncComponentParts, SimpleAsyncComponent}, - view, Component, RelmApp, RelmWidgetExt, WorkerController, + prelude::{ + AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController, + SimpleAsyncComponent, + }, + view, Component, ComponentController, Controller, RelmApp, RelmWidgetExt, WorkerController, }; use crate::APP_RESOURCE_PATH; @@ -26,19 +29,23 @@ pub fn run(app: RelmApp) { #[derive(Debug)] pub enum MainWindowMsg { + ToggleMenuVisibility, + SelectPage, SetIsGameRunning(bool), } struct MainWindow { - game_handler: WorkerController, game_state: GameState, + game_handler: WorkerController, is_game_running: bool, + is_menu_visible: bool, } impl MainWindow { - fn new(game_state: GameState, sender: relm4::AsyncComponentSender) -> Self { + fn new(game_state: GameState, sender: &relm4::AsyncComponentSender) -> Self { MainWindow { game_state, + is_menu_visible: false, is_game_running: false, game_handler: manager::HandleGameProcess::builder() .detach_worker(()) @@ -61,45 +68,89 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - adw::HeaderBar, + adw::Flap { + #[watch] + set_reveal_flap: model.is_menu_visible, + set_margin_all: 0, + set_fold_policy: adw::FlapFoldPolicy::Auto, - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_vexpand: true, - set_margin_horizontal: 50, - set_valign: gtk::Align::Center, + #[wrap(Some)] + set_flap = >k::Box { + set_orientation: gtk::Orientation::Vertical, - adw::PreferencesPage { - add = &adw::PreferencesGroup { - gtk::Picture { - set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), - set_vexpand: true, + gtk::ListBox { + set_width_request: 250, + set_margin_all: 10, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 1", }, - gtk::Label { - set_label: "Babylonia Terminal", - set_margin_top: 24, - add_css_class: "title-1", + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 2" + }, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 3", + }, + }, + }, + + #[wrap(Some)] + set_content = >k::Box { + set_orientation: gtk::Orientation::Vertical, + + adw::HeaderBar { + pack_start = >k::Button { + set_label: "Menu", + connect_clicked => MainWindowMsg::ToggleMenuVisibility, }, }, - add = &adw::PreferencesGroup { - gtk::Button { - set_css_classes: &["suggested-action", "pill"], + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, + set_margin_horizontal: 50, + set_valign: gtk::Align::Center, - set_label: "Start game", - set_hexpand: false, - set_width_request: 200, + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + }, - #[watch] - set_sensitive: !model.is_game_running, - connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { - sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Start game", + set_hexpand: false, + set_width_request: 200, + + #[watch] + set_sensitive: !model.is_game_running, + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, }, }, - } - }, - } + }, + } + }, } } } @@ -115,10 +166,10 @@ impl SimpleAsyncComponent for MainWindow { babylonia_terminal_sdk::game_state::GameState::get_current_state() .await .unwrap(), - sender, + &sender, ); } else { - model = MainWindow::new(game_state.unwrap(), sender); + model = MainWindow::new(game_state.unwrap(), &sender); } let widgets = view_output!(); @@ -147,6 +198,8 @@ impl SimpleAsyncComponent for MainWindow { async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { match message { + MainWindowMsg::ToggleMenuVisibility => self.is_menu_visible = !self.is_menu_visible, + MainWindowMsg::SelectPage => println!("Tried to select a new page"), MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, } } From d2e8f5f8186867799c4447736969f01ea2451c3a Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 16 Jan 2025 20:45:14 +0100 Subject: [PATCH 07/23] better menu --- babylonia-terminal-gui/Cargo.lock | 1 + babylonia-terminal-gui/Cargo.toml | 1 + babylonia-terminal-gui/src/ui/mod.rs | 77 +++++++++++++++++----------- babylonia-terminal/Cargo.lock | 1 + 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/babylonia-terminal-gui/Cargo.lock b/babylonia-terminal-gui/Cargo.lock index c2994f3..334e7c5 100644 --- a/babylonia-terminal-gui/Cargo.lock +++ b/babylonia-terminal-gui/Cargo.lock @@ -70,6 +70,7 @@ dependencies = [ "anyhow", "babylonia-terminal-sdk", "glib-build-tools", + "libadwaita", "log", "relm4", "relm4-components", diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml index 437bf38..28f6ebc 100644 --- a/babylonia-terminal-gui/Cargo.toml +++ b/babylonia-terminal-gui/Cargo.toml @@ -10,6 +10,7 @@ log = "0.4.22" relm4-components = "0.9.1" wincompatlib = "0.7.5" relm4 = { version = "0.9.1", features = ["libadwaita"] } +libadwaita = { version = "0.7.1", features = ["v1_4"] } [build-dependencies] glib-build-tools = "0.20.0" diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 450385c..3490ee8 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -3,6 +3,7 @@ use std::convert::identity; use crate::manager; use babylonia_terminal_sdk::game_state::GameState; +use log::debug; use relm4::{ adw::{ self, @@ -21,6 +22,8 @@ use relm4::{ view, Component, ComponentController, Controller, RelmApp, RelmWidgetExt, WorkerController, }; +use libadwaita::OverlaySplitView; + use crate::APP_RESOURCE_PATH; pub fn run(app: RelmApp) { @@ -68,36 +71,10 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - adw::Flap { + OverlaySplitView { #[watch] - set_reveal_flap: model.is_menu_visible, - set_margin_all: 0, - set_fold_policy: adw::FlapFoldPolicy::Auto, - - #[wrap(Some)] - set_flap = >k::Box { - set_orientation: gtk::Orientation::Vertical, - - gtk::ListBox { - set_width_request: 250, - set_margin_all: 10, - - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 1", - }, - - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 2" - }, - - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 3", - }, - }, - }, + set_show_sidebar: model.is_menu_visible, + set_collapsed: true, #[wrap(Some)] set_content = >k::Box { @@ -105,7 +82,7 @@ impl SimpleAsyncComponent for MainWindow { adw::HeaderBar { pack_start = >k::Button { - set_label: "Menu", + set_icon_name: "open-menu-symbolic", connect_clicked => MainWindowMsg::ToggleMenuVisibility, }, }, @@ -149,8 +126,46 @@ impl SimpleAsyncComponent for MainWindow { }, }, }, - } + }, + + #[wrap(Some)] + set_sidebar = >k::Box { + set_orientation: gtk::Orientation::Vertical, + + gtk::ListBox { + set_width_request: 250, + set_margin_all: 10, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 1", + }, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 2" + }, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 3", + }, + }, + }, }, + + //adw::Flap { + // #[watch] + // set_reveal_flap: model.is_menu_visible, + // set_margin_all: 0, + // set_fold_policy: adw::FlapFoldPolicy::Auto, + + // #[wrap(Some)] + // set_flap = + + // #[wrap(Some)] + // set_content = + //}, } } } diff --git a/babylonia-terminal/Cargo.lock b/babylonia-terminal/Cargo.lock index d76acbf..6d6874d 100644 --- a/babylonia-terminal/Cargo.lock +++ b/babylonia-terminal/Cargo.lock @@ -148,6 +148,7 @@ dependencies = [ "anyhow", "babylonia-terminal-sdk", "glib-build-tools", + "libadwaita", "log", "relm4", "relm4-components", From 9246d3a36f37f07ed891293537f6a7f76f71d713 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 16 Jan 2025 21:07:19 +0100 Subject: [PATCH 08/23] improve the menu --- babylonia-terminal-gui/src/lib.rs | 1 + babylonia-terminal-gui/src/ui/mod.rs | 47 ++++++++++++++++++---------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/babylonia-terminal-gui/src/lib.rs b/babylonia-terminal-gui/src/lib.rs index 78e7256..78fab5e 100644 --- a/babylonia-terminal-gui/src/lib.rs +++ b/babylonia-terminal-gui/src/lib.rs @@ -8,6 +8,7 @@ mod manager; mod ui; pub const APP_RESOURCE_PATH: &str = "/moe/celica/babylonia-terminal"; +pub const IS_DEVEL: bool = cfg!(debug_assertions); pub fn run() { debug!("Start GUI!"); diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 3490ee8..bb65464 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -1,6 +1,6 @@ use std::convert::identity; -use crate::manager; +use crate::{manager, IS_DEVEL}; use babylonia_terminal_sdk::game_state::GameState; use log::debug; @@ -68,6 +68,8 @@ impl SimpleAsyncComponent for MainWindow { view! { #[root] adw::ApplicationWindow { + add_css_class?: IS_DEVEL.then_some("devel"), + gtk::Box { set_orientation: gtk::Orientation::Vertical, @@ -131,25 +133,38 @@ impl SimpleAsyncComponent for MainWindow { #[wrap(Some)] set_sidebar = >k::Box { set_orientation: gtk::Orientation::Vertical, + set_width_request: 250, + set_margin_all: 10, - gtk::ListBox { - set_width_request: 250, - set_margin_all: 10, + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_hexpand: true, + set_margin_horizontal: 30, + set_margin_top: 30, + set_margin_bottom: 10, + }, - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 1", - }, + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 12, + add_css_class: "title-1", + set_margin_horizontal: 30, + set_margin_bottom: 10, + }, - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 2" - }, + gtk::Button { + set_margin_vertical: 5, + set_label: "Item 1", + }, - append = >k::Button { - set_margin_vertical: 5, - set_label: "Item 3", - }, + gtk::Button { + set_margin_vertical: 5, + set_label: "Item 2" + }, + + gtk::Button { + set_margin_vertical: 5, + set_label: "Item 3", }, }, }, From 72fd11a2aca8481a484b3ac07b14b0bdad2b9feb Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Fri, 17 Jan 2025 21:34:53 +0100 Subject: [PATCH 09/23] added some steps --- babylonia-terminal-gui/src/ui/mod.rs | 46 +++++--- babylonia-terminal-gui/src/ui/pages/mod.rs | 1 + .../src/ui/pages/steps/download_components.rs | 82 +++++++++++++ .../src/ui/pages/steps/mod.rs | 111 ++++++++++++++++++ .../src/ui/pages/steps/welcome.rs | 84 +++++++++++++ babylonia-terminal-sdk/src/game_state.rs | 2 +- 6 files changed, 309 insertions(+), 17 deletions(-) create mode 100644 babylonia-terminal-gui/src/ui/pages/mod.rs create mode 100644 babylonia-terminal-gui/src/ui/pages/steps/download_components.rs create mode 100644 babylonia-terminal-gui/src/ui/pages/steps/mod.rs create mode 100644 babylonia-terminal-gui/src/ui/pages/steps/welcome.rs diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index bb65464..e55bdb3 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -26,6 +26,8 @@ use libadwaita::OverlaySplitView; use crate::APP_RESOURCE_PATH; +mod pages; + pub fn run(app: RelmApp) { app.run_async::(None); } @@ -39,6 +41,7 @@ pub enum MainWindowMsg { struct MainWindow { game_state: GameState, + setup_page: AsyncController, game_handler: WorkerController, is_game_running: bool, is_menu_visible: bool, @@ -46,13 +49,20 @@ struct MainWindow { impl MainWindow { fn new(game_state: GameState, sender: &relm4::AsyncComponentSender) -> Self { + let setup_page = pages::steps::SetupPage::builder() + .launch(game_state.clone()) + .forward(sender.input_sender(), identity); + + let game_handler = manager::HandleGameProcess::builder() + .detach_worker(()) + .forward(sender.input_sender(), identity); + MainWindow { game_state, + setup_page, + game_handler, is_menu_visible: false, is_game_running: false, - game_handler: manager::HandleGameProcess::builder() - .detach_worker(()) - .forward(sender.input_sender(), identity), } } } @@ -68,6 +78,8 @@ impl SimpleAsyncComponent for MainWindow { view! { #[root] adw::ApplicationWindow { + set_default_size: (700, 560), + add_css_class?: IS_DEVEL.then_some("devel"), gtk::Box { @@ -85,6 +97,10 @@ impl SimpleAsyncComponent for MainWindow { adw::HeaderBar { pack_start = >k::Button { set_icon_name: "open-menu-symbolic", + + #[watch] + set_visible: model.game_state == GameState::GameInstalled, + connect_clicked => MainWindowMsg::ToggleMenuVisibility, }, }, @@ -95,6 +111,9 @@ impl SimpleAsyncComponent for MainWindow { set_margin_horizontal: 50, set_valign: gtk::Align::Center, + #[watch] + set_visible: model.game_state == GameState::GameInstalled, + adw::PreferencesPage { add = &adw::PreferencesGroup { gtk::Picture { @@ -128,6 +147,14 @@ impl SimpleAsyncComponent for MainWindow { }, }, }, + + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + set_visible: model.game_state != GameState::GameInstalled, + + model.setup_page.widget(), + } }, #[wrap(Some)] @@ -168,19 +195,6 @@ impl SimpleAsyncComponent for MainWindow { }, }, }, - - //adw::Flap { - // #[watch] - // set_reveal_flap: model.is_menu_visible, - // set_margin_all: 0, - // set_fold_policy: adw::FlapFoldPolicy::Auto, - - // #[wrap(Some)] - // set_flap = - - // #[wrap(Some)] - // set_content = - //}, } } } diff --git a/babylonia-terminal-gui/src/ui/pages/mod.rs b/babylonia-terminal-gui/src/ui/pages/mod.rs new file mode 100644 index 0000000..f5a8b59 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/mod.rs @@ -0,0 +1 @@ +pub mod steps; diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs new file mode 100644 index 0000000..da7efd9 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -0,0 +1,82 @@ +use libadwaita::prelude::{ButtonExt, PreferencesPageExt, PreferencesRowExt, WidgetExt}; +use relm4::prelude::{AsyncComponentParts, SimpleAsyncComponent}; +use relm4::{adw, gtk, AsyncComponentSender, RelmWidgetExt}; + +use crate::ui::MainWindowMsg; + +use super::SetupPageMsg; + +#[derive(Debug)] +pub enum DownloadComponentsMsg { + Next, +} + +pub struct DownloadComponentsPage; + +#[relm4::component(async, pub)] +impl SimpleAsyncComponent for DownloadComponentsPage { + type Input = DownloadComponentsMsg; + + type Output = SetupPageMsg; + + type Init = (); + + view! { + #[root] + adw::PreferencesPage { + set_hexpand: true, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + gtk::Label { + set_label: "Install components", + add_css_class: "title-1" + }, + }, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + adw::ComboRow { + set_title: "Proton version", + }, + + adw::ComboRow { + set_title: "DXVK version", + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Next", + set_hexpand: false, + set_width_request: 200, + + connect_clicked => DownloadComponentsMsg::Next, + }, + }, + }, + } + + async fn init( + init: Self::Init, + root: Self::Root, + sender: AsyncComponentSender, + ) -> AsyncComponentParts { + let model = DownloadComponentsPage; + let widgets = view_output!(); + + AsyncComponentParts { widgets, model } + } + + async fn update(&mut self, message: Self::Input, sender: AsyncComponentSender) -> () { + todo!(); + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/steps/mod.rs b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs new file mode 100644 index 0000000..af69500 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs @@ -0,0 +1,111 @@ +use std::convert::identity; + +use babylonia_terminal_sdk::game_state::GameState; +use download_components::DownloadComponentsPage; +use libadwaita::prelude::{OrientableExt, WidgetExt}; +use relm4::{ + prelude::{ + adw, gtk, AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController, + SimpleAsyncComponent, + }, + AsyncComponentSender, Component, ComponentController, Controller, +}; +use welcome::WelcomePage; + +use crate::ui::MainWindowMsg; + +mod download_components; +mod welcome; + +#[derive(Debug)] +pub enum SetupPageMsg { + UpdateGameState, +} + +pub struct SetupPage { + game_state: GameState, + welcome_page: Controller, + download_components_page: AsyncController, + + carousel: adw::Carousel, +} + +#[relm4::component(async, pub)] +impl SimpleAsyncComponent for SetupPage { + type Input = SetupPageMsg; + + type Output = MainWindowMsg; + + type Init = GameState; + + view! { + #[root] + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + #[local_ref] + carousel -> adw::Carousel { + set_allow_mouse_drag: false, + set_allow_long_swipes: false, + set_allow_scroll_wheel: false, + + append = model.welcome_page.widget(), + append = model.download_components_page.widget(), + }, + + adw::CarouselIndicatorDots { + set_carousel: Some(&carousel), + set_height_request: 32, + }, + }, + } + + async fn init( + game_state: GameState, + root: Self::Root, + sender: AsyncComponentSender, + ) -> AsyncComponentParts { + let welcome_page = WelcomePage::builder() + .launch(()) + .forward(sender.input_sender(), identity); + let download_components_page = DownloadComponentsPage::builder() + .launch(()) + .forward(sender.input_sender(), identity); + + let carousel = adw::Carousel::new(); + + carousel.scroll_to(welcome_page.widget(), true); + + let model = SetupPage { + welcome_page, + download_components_page, + game_state, + carousel: carousel.clone(), + }; + let widgets = view_output!(); + + AsyncComponentParts { widgets, model } + } + + async fn update(&mut self, message: Self::Input, sender: AsyncComponentSender) { + match message { + SetupPageMsg::UpdateGameState => { + self.game_state = GameState::get_current_state().await.unwrap() + } // TODO: delete this unwrap() + } + + match self.game_state { + GameState::ProtonNotInstalled => { + self.carousel + .scroll_to(self.download_components_page.widget(), true); + } + GameState::DXVKNotInstalled => todo!(), + GameState::FontNotInstalled => todo!(), + GameState::DependecieNotInstalled => todo!(), + GameState::GameNotInstalled => todo!(), + GameState::GameNeedUpdate => todo!(), + GameState::GameNotPatched => todo!(), + GameState::GameInstalled => todo!(), + } + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs b/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs new file mode 100644 index 0000000..12e85b4 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs @@ -0,0 +1,84 @@ +use libadwaita::prelude::{ButtonExt, PreferencesPageExt, WidgetExt}; +use relm4::{adw, gtk, ComponentParts, ComponentSender, RelmWidgetExt, SimpleComponent}; + +use super::SetupPageMsg; + +use crate::APP_RESOURCE_PATH; + +#[derive(Debug)] +pub enum WelcomePageMsg { + Next, +} + +pub struct WelcomePage; + +#[relm4::component(pub)] +impl SimpleComponent for WelcomePage { + type Input = WelcomePageMsg; + + type Output = SetupPageMsg; + + type Init = (); + + view! { + #[root] + adw::PreferencesPage { + set_hexpand: true, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + }, + + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + + gtk::Label { + set_label: "We need to do some setup before to be able to play", + + set_justify: gtk::Justification::Center, + set_wrap: true, + set_margin_top: 32 + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Next", + set_hexpand: false, + set_width_request: 200, + + connect_clicked => WelcomePageMsg::Next, + }, + }, + }, + } + + fn init( + init: Self::Init, + root: Self::Root, + sender: ComponentSender, + ) -> ComponentParts { + let model = WelcomePage {}; + let widgets = view_output!(); + + ComponentParts { widgets, model } + } + + fn update(&mut self, message: Self::Input, sender: ComponentSender) { + match message { + WelcomePageMsg::Next => sender.output(SetupPageMsg::UpdateGameState).unwrap(), + } + } +} diff --git a/babylonia-terminal-sdk/src/game_state.rs b/babylonia-terminal-sdk/src/game_state.rs index 5039a8d..3eb2763 100644 --- a/babylonia-terminal-sdk/src/game_state.rs +++ b/babylonia-terminal-sdk/src/game_state.rs @@ -1,6 +1,6 @@ use crate::{game_config::GameConfig, utils::kuro_prod_api::GameInfo}; -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum GameState { ProtonNotInstalled, DXVKNotInstalled, From baf66a4e1397ac2514604ebb64836eb6397b31be Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 27 Jan 2025 20:47:13 +0100 Subject: [PATCH 10/23] can now choose release --- babylonia-terminal-gui/src/ui/mod.rs | 23 +++----- .../src/ui/pages/steps/download_components.rs | 56 +++++++++++++++++-- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index e55bdb3..9e09ef6 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -5,24 +5,15 @@ use babylonia_terminal_sdk::game_state::GameState; use log::debug; use relm4::{ - adw::{ - self, - prelude::{PreferencesGroupExt, PreferencesPageExt}, - ApplicationWindow, - }, - gtk::{ - self, - prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, - }, + self, + gtk::{self, prelude::*}, loading_widgets::LoadingWidgets, - prelude::{ - AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController, - SimpleAsyncComponent, - }, - view, Component, ComponentController, Controller, RelmApp, RelmWidgetExt, WorkerController, + prelude::*, + *, }; -use libadwaita::OverlaySplitView; +use adw::prelude::*; +use libadwaita as adw; use crate::APP_RESOURCE_PATH; @@ -85,7 +76,7 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - OverlaySplitView { + adw::OverlaySplitView { #[watch] set_show_sidebar: model.is_menu_visible, set_collapsed: true, diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index da7efd9..09e82bb 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -1,6 +1,19 @@ -use libadwaita::prelude::{ButtonExt, PreferencesPageExt, PreferencesRowExt, WidgetExt}; -use relm4::prelude::{AsyncComponentParts, SimpleAsyncComponent}; -use relm4::{adw, gtk, AsyncComponentSender, RelmWidgetExt}; +use babylonia_terminal_sdk::{ + components::{ + dxvk_component::{self, DXVKComponent}, + proton_component::{self, ProtonComponent}, + }, + utils::github_requester::{GithubRelease, GithubRequester}, +}; +use relm4::{ + self, + gtk::{self, prelude::*}, + prelude::*, + *, +}; + +use adw::prelude::*; +use libadwaita as adw; use crate::ui::MainWindowMsg; @@ -11,7 +24,10 @@ pub enum DownloadComponentsMsg { Next, } -pub struct DownloadComponentsPage; +pub struct DownloadComponentsPage { + proton_versions: Vec, + dxvk_versions: Vec, +} #[relm4::component(async, pub)] impl SimpleAsyncComponent for DownloadComponentsPage { @@ -42,10 +58,24 @@ impl SimpleAsyncComponent for DownloadComponentsPage { adw::ComboRow { set_title: "Proton version", + + set_model: Some(>k::StringList::new(model + .proton_versions + .iter() + .map(|r| r.tag_name.as_str()) + .collect::>() + .as_slice())), }, adw::ComboRow { set_title: "DXVK version", + + set_model: Some(>k::StringList::new(model + .dxvk_versions + .iter() + .map(|r| r.tag_name.as_str()) + .collect::>() + .as_slice())), }, }, @@ -70,7 +100,23 @@ impl SimpleAsyncComponent for DownloadComponentsPage { root: Self::Root, sender: AsyncComponentSender, ) -> AsyncComponentParts { - let model = DownloadComponentsPage; + let proton_releases = ProtonComponent::get_github_releases( + proton_component::PROTON_DEV, + proton_component::PROTON_REPO, + ) + .await + .unwrap(); //TODO: remove unwrap() + + let dxvk_releases = + DXVKComponent::get_github_releases(dxvk_component::DXVK_DEV, dxvk_component::DXVK_REPO) + .await + .unwrap(); //TODO: remove unwrap() + + let model = DownloadComponentsPage { + proton_versions: proton_releases, + dxvk_versions: dxvk_releases, + }; + let widgets = view_output!(); AsyncComponentParts { widgets, model } From 846b4291c6b3e4d9a014e057c8acac7c7bfe7a4c Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 20 Feb 2025 18:39:34 +0100 Subject: [PATCH 11/23] the project now use workspaces --- .gitignore | 4 +- babylonia-terminal/Cargo.lock => Cargo.lock | 477 +-- Cargo.toml | 8 + babylonia-terminal-cli/Cargo.lock | 2491 ---------------- babylonia-terminal-gui/Cargo.lock | 2919 ------------------- babylonia-terminal-sdk/Cargo.lock | 2118 -------------- 6 files changed, 284 insertions(+), 7733 deletions(-) rename babylonia-terminal/Cargo.lock => Cargo.lock (87%) create mode 100644 Cargo.toml delete mode 100644 babylonia-terminal-cli/Cargo.lock delete mode 100644 babylonia-terminal-gui/Cargo.lock delete mode 100644 babylonia-terminal-sdk/Cargo.lock diff --git a/.gitignore b/.gitignore index ada6eb9..4156963 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,4 @@ set_github_env.sh babylonia-terminal-cli/TDData-data.db babylonia-terminal-cli/backtrace.txt -babylonia-terminal-cli/target -babylonia-terminal-gui/target -babylonia-terminal/target +target diff --git a/babylonia-terminal/Cargo.lock b/Cargo.lock similarity index 87% rename from babylonia-terminal/Cargo.lock rename to Cargo.lock index 6d6874d..5e264ee 100644 --- a/babylonia-terminal/Cargo.lock +++ b/Cargo.lock @@ -58,19 +58,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" dependencies = [ "backtrace", ] @@ -169,7 +170,7 @@ dependencies = [ "futures", "log", "num_cpus", - "reqwest 0.12.9", + "reqwest 0.12.12", "rust-embed", "serde", "serde_json", @@ -213,21 +214,22 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "blake3" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +checksum = "1230237285e3e10cde447185e8975408ae24deaa67205ce684805c25bc0c7937" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "memmap2", ] [[package]] @@ -241,9 +243,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -253,17 +255,17 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cairo-rs" -version = "0.20.5" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa699e1d7ae691001a811dda5ef0e3e42e1d4119b26426352989df9e94e3e6" +checksum = "ae50b5510d86cf96ac2370e66d8dc960882f3df179d6a5a1e52bd94a1416c0f7" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cairo-sys-rs", "glib", "libc", @@ -271,9 +273,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.20.0" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" +checksum = "f18b6bb8e43c7eb0f2aac7976afe0c61b6f5fc2ab7bc4c139537ea56c92290df" dependencies = [ "glib-sys", "libc", @@ -282,9 +284,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.4" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" dependencies = [ "shlex", ] @@ -353,9 +355,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" dependencies = [ "clap_builder", "clap_derive", @@ -363,9 +365,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" dependencies = [ "anstream", "anstyle", @@ -375,9 +377,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck", "proc-macro2", @@ -399,12 +401,12 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "colored" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -444,9 +446,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -575,9 +577,9 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" @@ -772,9 +774,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.20.4" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" +checksum = "7563afd6ff0a221edfbb70a78add5075b8d9cb48e637a40a24c3ece3fea414d0" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -784,9 +786,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.20.4" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" +checksum = "67f2587c9202bf997476bbba6aaed4f78a11538a2567df002a5f57f5331d0b5c" dependencies = [ "gio-sys", "glib-sys", @@ -797,9 +799,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75933c4a86e8a2428814d367e22c733304fdfabc87f415750fd2f55409b6ee48" +checksum = "4850c9d9c1aecd1a3eb14fadc1cdb0ac0a2298037e116264c7473e1740a32d60" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -812,9 +814,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20af0656d543aed3e57ac4120ef76d091c3c42ab1e0507a8febde7cd005640e2" +checksum = "6f6eb95798e2b46f279cf59005daf297d5b69555428f185650d71974a910473a" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -846,10 +848,22 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + [[package]] name = "gimli" version = "0.31.1" @@ -858,9 +872,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.20.6" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8826d2a9ad56ce3de1f04bea0bea0daff6f5f1c913cc834996cfea1f9401361c" +checksum = "a4f00c70f8029d84ea7572dd0e1aaa79e5329667b4c17f329d79ffb1e6277487" dependencies = [ "futures-channel", "futures-core", @@ -875,24 +889,24 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.20.6" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b965df6f3534c84816b5c1a7d9efcb5671ae790822de5abe8e299797039529bc" +checksum = "160eb5250a26998c3e1b54e6a3d4ea15c6c7762a6062a19a7b63eff6e2b33f9e" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "glib" -version = "0.20.6" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd3e4ee7998ab5a135d900db56930cc19ad16681adf245daff54f618b9d5e1" +checksum = "707b819af8059ee5395a2de9f2317d87a53dbad8846a2f089f0bb44703f37686" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "futures-channel", "futures-core", "futures-executor", @@ -918,9 +932,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.20.5" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" +checksum = "715601f8f02e71baef9c1f94a657a9a77c192aea6097cf9ae7e5e177cd8cde68" dependencies = [ "heck", "proc-macro-crate", @@ -931,9 +945,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.20.6" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b1827e8621fc42c0dfb228e5d57ff6a71f9699e666ece8113f979ad87c2de" +checksum = "a8928869a44cfdd1fccb17d6746e4ff82c8f82e41ce705aa026a52ca8dc3aefb" dependencies = [ "libc", "system-deps", @@ -941,9 +955,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.20.4" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" +checksum = "c773a3cb38a419ad9c26c81d177d96b4b08980e8bdbbf32dace883e96e96e7e3" dependencies = [ "glib-sys", "libc", @@ -952,9 +966,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.20.4" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" +checksum = "3cbc5911bfb32d68dcfa92c9510c462696c2f715548fcd7f3f1be424c739de19" dependencies = [ "glib", "graphene-sys", @@ -963,9 +977,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.20.4" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" +checksum = "11a68d39515bf340e879b72cecd4a25c1332557757ada6e8aba8654b4b81d23a" dependencies = [ "glib-sys", "libc", @@ -975,9 +989,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36933c1e79df378aa6e606576e680358a9582ed8c16f33e94899636e6fa6df6" +checksum = "61f5e72f931c8c9f65fbfc89fe0ddc7746f147f822f127a53a9854666ac1f855" dependencies = [ "cairo-rs", "gdk4", @@ -990,9 +1004,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0877a9d485bd9ba5262b0c9bce39e63750e525e3aebeb359d271ca1f0e111f1d" +checksum = "755059de55fa6f85a46bde8caf03e2184c96bfda1f6206163c72fb0ea12436dc" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -1006,9 +1020,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9376d14d7e33486c54823a42bef296e882b9f25cb4c52b52f4d1d57bbadb5b6d" +checksum = "af1c491051f030994fd0cde6f3c44f3f5640210308cff1298c7673c47408091d" dependencies = [ "cairo-rs", "field-offset", @@ -1027,9 +1041,9 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c518d5dd41c57385c7cd30af52e261820c897fc1144e558bb88c303d048ae2" +checksum = "0ed1786c4703dd196baf7e103525ce0cf579b3a63a0570fe653b7ee6bac33999" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1039,9 +1053,9 @@ dependencies = [ [[package]] name = "gtk4-sys" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e653b0a9001ba9be1ffddb9373bfe9a111f688222f5aeee2841481300d91b55a" +checksum = "41e03b01e54d77c310e1d98647d73f996d04b2f29b9121fe493ea525a7ec03d6" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1077,9 +1091,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", @@ -1170,9 +1184,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -1182,9 +1196,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -1206,14 +1220,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", + "h2 0.4.8", "http 1.2.0", "http-body 1.0.1", "httparse", @@ -1226,15 +1240,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.1", + "hyper 1.6.0", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.23", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1248,7 +1262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -1262,7 +1276,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.1", + "hyper 1.6.0", "hyper-util", "native-tls", "tokio", @@ -1281,7 +1295,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.6.0", "pin-project-lite", "socket2", "tokio", @@ -1430,9 +1444,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown", @@ -1440,9 +1454,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", "number_prefix", @@ -1453,9 +1467,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is_terminal_polyfill" @@ -1471,9 +1485,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1518,9 +1532,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libredox" @@ -1528,16 +1542,16 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", "redox_syscall", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -1557,9 +1571,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" @@ -1567,6 +1581,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -1584,18 +1607,18 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] [[package]] name = "minreq" -version = "2.13.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" dependencies = [ "log", "once_cell", @@ -1612,7 +1635,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -1622,14 +1645,14 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -1675,26 +1698,26 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg-if", "foreign-types", "libc", @@ -1716,15 +1739,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -1740,9 +1763,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "pango" -version = "0.20.6" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e34e7ca2c52e3933d7e5251409a82b83725fa9d6d48fbdaacec056b3a0554a" +checksum = "6b1f5dc1b8cf9bc08bfc0843a04ee0fa2e78f1e1fa4b126844a383af4f25f0ec" dependencies = [ "gio", "glib", @@ -1752,9 +1775,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.20.4" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" +checksum = "0dbb9b751673bd8fe49eb78620547973a1e719ed431372122b20abd12445bab5" dependencies = [ "glib-sys", "gobject-sys", @@ -1793,9 +1816,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1841,18 +1864,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1884,7 +1907,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -1893,7 +1916,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -1902,7 +1925,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror", ] @@ -1967,7 +1990,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -1995,9 +2018,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "async-compression", "base64 0.22.1", @@ -2005,11 +2028,11 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.7", + "h2 0.4.8", "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.6.0", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -2030,6 +2053,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -2040,15 +2064,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -2104,11 +2127,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys", @@ -2129,9 +2152,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "once_cell", "rustls-pki-types", @@ -2172,9 +2195,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -2198,10 +2221,16 @@ dependencies = [ ] [[package]] -name = "ryu" -version = "1.0.18" +name = "rustversion" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "ryu" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -2243,7 +2272,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "core-foundation-sys", "libc", @@ -2252,9 +2281,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -2262,24 +2291,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -2288,9 +2317,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -2386,9 +2415,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" @@ -2429,9 +2458,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2481,7 +2510,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "core-foundation", "system-configuration-sys 0.6.0", ] @@ -2538,12 +2567,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.14.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2614,9 +2644,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.42.0" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -2632,9 +2662,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -2657,7 +2687,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.23", "tokio", ] @@ -2676,9 +2706,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -2697,9 +2727,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", "serde", @@ -2708,6 +2738,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -2773,15 +2824,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-width" @@ -2868,21 +2919,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasm-bindgen" -version = "0.2.99" +name = "wasi" +version = "0.13.3+wasi-0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -2894,9 +2955,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -2907,9 +2968,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2917,9 +2978,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -2930,15 +2991,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3160,9 +3224,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] @@ -3177,6 +3241,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -3191,9 +3264,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "xattr" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", "linux-raw-sys", diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..77b691a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[workspace] +resolver = "2" +members = [ + "babylonia-terminal", + "babylonia-terminal-cli", + "babylonia-terminal-gui", + "babylonia-terminal-sdk", +] diff --git a/babylonia-terminal-cli/Cargo.lock b/babylonia-terminal-cli/Cargo.lock deleted file mode 100644 index 1f095ae..0000000 --- a/babylonia-terminal-cli/Cargo.lock +++ /dev/null @@ -1,2491 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" -dependencies = [ - "backtrace", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-compression" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" -dependencies = [ - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "babylonia-terminal-cli" -version = "0.1.2" -dependencies = [ - "anyhow", - "babylonia-terminal-sdk", - "clap", - "derive", - "dialoguer", - "downloader", - "indicatif", - "log", - "simple_logger", - "tokio", - "wincompatlib", -] - -[[package]] -name = "babylonia-terminal-sdk" -version = "0.1.2" -dependencies = [ - "anyhow", - "chksum-md5", - "dirs", - "dotenv", - "downloader", - "flate2", - "fs_extra", - "futures", - "log", - "num_cpus", - "reqwest 0.12.7", - "rust-embed", - "serde", - "serde_json", - "tar", - "tokio", - "wincompatlib", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" - -[[package]] -name = "cc" -version = "1.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chksum-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6db20071fdeca52ed6a7745519fb2d343fddcb93af81448373b851f072aaec5" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-hash-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221456234d441c788a2c51a27b91c4380f499de560670a67d3303e621d37b3bd" - -[[package]] -name = "chksum-hash-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c33d01c33c9e193fe33e719a29a7eb900c08583375dd1d3269991aacbe434a" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95dda0f76fbb6069e042c370a928457086e1b4eabc7e75f5f49fe1b913634351" -dependencies = [ - "chksum-core", - "chksum-hash-md5", - "chksum-reader", -] - -[[package]] -name = "chksum-reader" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bcdf6bcd410820599b7501d9bc3346964c4d472f48905685e08e07359d2fff9" -dependencies = [ - "chksum-core", -] - -[[package]] -name = "clap" -version = "4.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[package]] -name = "colored" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" -dependencies = [ - "lazy_static", - "windows-sys 0.48.0", -] - -[[package]] -name = "console" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derive" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e3ae26c830a573f2e231fc2475f71fce4705609097cb9523abfc4007caed0b" - -[[package]] -name = "dialoguer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" -dependencies = [ - "console", - "shell-words", - "tempfile", - "thiserror", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "downloader" -version = "0.2.7" -source = "git+https://github.com/ALEZ-DEV/downloader#5572a0875ec4f04b0514342f9acff21252beb579" -dependencies = [ - "futures", - "rand", - "reqwest 0.11.27", - "thiserror", - "tokio", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "flate2" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.4.1", - "hyper-util", - "rustls 0.23.13", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "indicatif" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.158" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "minreq" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" -dependencies = [ - "log", - "once_cell", - "rustls 0.21.12", - "rustls-native-certs", - "rustls-webpki 0.101.7", - "webpki-roots", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi", - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - -[[package]] -name = "object" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "portable-atomic" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d30538d42559de6b034bc76fd6dd4c38961b1ee5c6c56e3808c50128fdbc22ce" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.1.3", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rust-embed" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simple_logger" -version = "4.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1" -dependencies = [ - "colored", - "log", - "time", - "windows-sys 0.48.0", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tar" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.13", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "wincompatlib" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2475ec2859b4310dbf008f8c0cafc55202137aac0062f52a0e7651459f6ad88e" -dependencies = [ - "anyhow", - "blake3", - "minreq", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[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", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "xattr" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/babylonia-terminal-gui/Cargo.lock b/babylonia-terminal-gui/Cargo.lock deleted file mode 100644 index 334e7c5..0000000 --- a/babylonia-terminal-gui/Cargo.lock +++ /dev/null @@ -1,2919 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "anyhow" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" -dependencies = [ - "backtrace", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-compression" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" -dependencies = [ - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "babylonia-terminal-gui" -version = "0.1.0" -dependencies = [ - "anyhow", - "babylonia-terminal-sdk", - "glib-build-tools", - "libadwaita", - "log", - "relm4", - "relm4-components", - "wincompatlib", -] - -[[package]] -name = "babylonia-terminal-sdk" -version = "0.1.2" -dependencies = [ - "anyhow", - "chksum-md5", - "dirs", - "dotenv", - "downloader", - "flate2", - "fs_extra", - "futures", - "log", - "num_cpus", - "reqwest 0.12.9", - "rust-embed", - "serde", - "serde_json", - "tar", - "tokio", - "wincompatlib", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "blake3" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cairo-rs" -version = "0.20.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fa699e1d7ae691001a811dda5ef0e3e42e1d4119b26426352989df9e94e3e6" -dependencies = [ - "bitflags 2.6.0", - "cairo-sys-rs", - "glib", - "libc", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "cc" -version = "1.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-expr" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chksum-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6db20071fdeca52ed6a7745519fb2d343fddcb93af81448373b851f072aaec5" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-hash-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221456234d441c788a2c51a27b91c4380f499de560670a67d3303e621d37b3bd" - -[[package]] -name = "chksum-hash-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c33d01c33c9e193fe33e719a29a7eb900c08583375dd1d3269991aacbe434a" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95dda0f76fbb6069e042c370a928457086e1b4eabc7e75f5f49fe1b913634351" -dependencies = [ - "chksum-core", - "chksum-hash-md5", - "chksum-reader", -] - -[[package]] -name = "chksum-reader" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bcdf6bcd410820599b7501d9bc3346964c4d472f48905685e08e07359d2fff9" -dependencies = [ - "chksum-core", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "downloader" -version = "0.2.7" -source = "git+https://github.com/ALEZ-DEV/downloader#5572a0875ec4f04b0514342f9acff21252beb579" -dependencies = [ - "futures", - "rand", - "reqwest 0.11.27", - "thiserror", - "tokio", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[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 = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "flate2" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4c29071a9e92337d8270a85cb0510cda4ac478be26d09ad027cc1d081911b19" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687343b059b91df5f3fbd87b4307038fa9e647fcc0461d0d3f93e94fee20bf3d" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk4" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75933c4a86e8a2428814d367e22c733304fdfabc87f415750fd2f55409b6ee48" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk4-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk4-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20af0656d543aed3e57ac4120ef76d091c3c42ab1e0507a8febde7cd005640e2" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gio" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8826d2a9ad56ce3de1f04bea0bea0daff6f5f1c913cc834996cfea1f9401361c" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "pin-project-lite", - "smallvec", -] - -[[package]] -name = "gio-sys" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b965df6f3534c84816b5c1a7d9efcb5671ae790822de5abe8e299797039529bc" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "windows-sys 0.52.0", -] - -[[package]] -name = "glib" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd3e4ee7998ab5a135d900db56930cc19ad16681adf245daff54f618b9d5e1" -dependencies = [ - "bitflags 2.6.0", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "smallvec", -] - -[[package]] -name = "glib-build-tools" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7029c2651d9b5d5a3eea93ec8a1995665c6d3a69ce9bf6042ad9064d134736d8" -dependencies = [ - "gio", -] - -[[package]] -name = "glib-macros" -version = "0.20.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d21ca27acfc3e91da70456edde144b4ac7c36f78ee77b10189b3eb4901c156" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "glib-sys" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b1827e8621fc42c0dfb228e5d57ff6a71f9699e666ece8113f979ad87c2de" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "gobject-sys" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "graphene-rs" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f53144c7fe78292705ff23935f1477d511366fb2f73c43d63b37be89076d2fe" -dependencies = [ - "glib", - "graphene-sys", - "libc", -] - -[[package]] -name = "graphene-sys" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e741797dc5081e59877a4d72c442c72d61efdd99161a0b1c1b29b6b988934b99" -dependencies = [ - "glib-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gsk4" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36933c1e79df378aa6e606576e680358a9582ed8c16f33e94899636e6fa6df6" -dependencies = [ - "cairo-rs", - "gdk4", - "glib", - "graphene-rs", - "gsk4-sys", - "libc", - "pango", -] - -[[package]] -name = "gsk4-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0877a9d485bd9ba5262b0c9bce39e63750e525e3aebeb359d271ca1f0e111f1d" -dependencies = [ - "cairo-sys-rs", - "gdk4-sys", - "glib-sys", - "gobject-sys", - "graphene-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk4" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9376d14d7e33486c54823a42bef296e882b9f25cb4c52b52f4d1d57bbadb5b6d" -dependencies = [ - "cairo-rs", - "field-offset", - "futures-channel", - "gdk-pixbuf", - "gdk4", - "gio", - "glib", - "graphene-rs", - "gsk4", - "gtk4-macros", - "gtk4-sys", - "libc", - "pango", -] - -[[package]] -name = "gtk4-macros" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c518d5dd41c57385c7cd30af52e261820c897fc1144e558bb88c303d048ae2" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "gtk4-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e653b0a9001ba9be1ffddb9373bfe9a111f688222f5aeee2841481300d91b55a" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk4-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "graphene-sys", - "gsk4-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.2.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.2.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http 1.2.0", - "hyper 1.5.1", - "hyper-util", - "rustls 0.23.20", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.31", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.5.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.5.1", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[package]] -name = "itoa" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" - -[[package]] -name = "js-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "libadwaita" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8611ee9fb85e7606c362b513afcaf5b59853f79e4d98caaaf581d99465014247" -dependencies = [ - "gdk4", - "gio", - "glib", - "gtk4", - "libadwaita-sys", - "libc", - "pango", -] - -[[package]] -name = "libadwaita-sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b099a223560118d4d4fa04b6d23f3ea5b7171fe1d83dfb7e6b45b54cdfc83af9" -dependencies = [ - "gdk4-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk4-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "libc" -version = "0.2.168" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "minreq" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" -dependencies = [ - "log", - "once_cell", - "rustls 0.21.12", - "rustls-native-certs", - "rustls-webpki 0.101.7", - "webpki-roots", -] - -[[package]] -name = "mio" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "openssl" -version = "0.10.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "pango" -version = "0.20.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e34e7ca2c52e3933d7e5251409a82b83725fa9d6d48fbdaacec056b3a0554a" -dependencies = [ - "gio", - "glib", - "libc", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fd65917bf12f06544ae2bbc200abf9fc0a513a5a88a0fa81013893aef2b838" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "relm4" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30837553c1a8cfea1a404c83ec387c5c8ff9358e1060b057c274c5daa5035ad1" -dependencies = [ - "flume", - "fragile", - "futures", - "gtk4", - "libadwaita", - "once_cell", - "relm4-css", - "relm4-macros", - "tokio", - "tracing", -] - -[[package]] -name = "relm4-components" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3d67f2982131c5e6047af4278d8fe750266767e57b58bc15f2e11e190eef36" -dependencies = [ - "once_cell", - "relm4", - "tracker", -] - -[[package]] -name = "relm4-css" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3b924557df1cddc687b60b313c4b76620fdbf0e463afa4b29f67193ccf37f9" - -[[package]] -name = "relm4-macros" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a895a7455441a857d100ca679bd24a92f91d28b5e3df63296792ac1af2eddde" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.5.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.2.0", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "system-configuration 0.6.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rust-embed" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" - -[[package]] -name = "serde" -version = "1.0.216" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.216" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.133" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-deps" -version = "7.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "tar" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" -dependencies = [ - "rustls 0.23.20", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tracker" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5c98457ff700aaeefcd4a4a492096e78a2af1dd8523c66e94a3adb0fdbd415" -dependencies = [ - "tracker-macros", -] - -[[package]] -name = "tracker-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19eb2373ccf3d1999967c26c3d44534ff71ae5d8b9dacf78f4b13132229e48" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "vcpkg" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" - -[[package]] -name = "web-sys" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "wincompatlib" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2475ec2859b4310dbf008f8c0cafc55202137aac0062f52a0e7651459f6ad88e" -dependencies = [ - "anyhow", - "blake3", - "minreq", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[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", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - -[[package]] -name = "xattr" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/babylonia-terminal-sdk/Cargo.lock b/babylonia-terminal-sdk/Cargo.lock deleted file mode 100644 index c11c313..0000000 --- a/babylonia-terminal-sdk/Cargo.lock +++ /dev/null @@ -1,2118 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "anyhow" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" -dependencies = [ - "backtrace", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-compression" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" -dependencies = [ - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "babylonia-terminal-sdk" -version = "0.1.2" -dependencies = [ - "anyhow", - "chksum-md5", - "dirs", - "dotenv", - "downloader", - "flate2", - "fs_extra", - "futures", - "log", - "num_cpus", - "reqwest 0.12.7", - "rust-embed", - "serde", - "serde_json", - "tar", - "tokio", - "wincompatlib", -] - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "blake3" -version = "1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" - -[[package]] -name = "cc" -version = "1.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chksum-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6db20071fdeca52ed6a7745519fb2d343fddcb93af81448373b851f072aaec5" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-hash-core" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221456234d441c788a2c51a27b91c4380f499de560670a67d3303e621d37b3bd" - -[[package]] -name = "chksum-hash-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c33d01c33c9e193fe33e719a29a7eb900c08583375dd1d3269991aacbe434a" -dependencies = [ - "chksum-hash-core", - "thiserror", -] - -[[package]] -name = "chksum-md5" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95dda0f76fbb6069e042c370a928457086e1b4eabc7e75f5f49fe1b913634351" -dependencies = [ - "chksum-core", - "chksum-hash-md5", - "chksum-reader", -] - -[[package]] -name = "chksum-reader" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bcdf6bcd410820599b7501d9bc3346964c4d472f48905685e08e07359d2fff9" -dependencies = [ - "chksum-core", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "downloader" -version = "0.2.7" -source = "git+https://github.com/ALEZ-DEV/downloader#5572a0875ec4f04b0514342f9acff21252beb579" -dependencies = [ - "futures", - "rand", - "reqwest 0.11.27", - "thiserror", - "tokio", -] - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" - -[[package]] -name = "filetime" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" -dependencies = [ - "cfg-if", - "libc", - "libredox", - "windows-sys 0.59.0", -] - -[[package]] -name = "flate2" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http 1.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.4.1", - "hyper-util", - "rustls 0.23.13", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.4.1", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.158" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", - "redox_syscall", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "minreq" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763d142cdff44aaadd9268bebddb156ef6c65a0e13486bb81673cf2d8739f9b0" -dependencies = [ - "log", - "once_cell", - "rustls 0.21.12", - "rustls-native-certs", - "rustls-webpki 0.101.7", - "webpki-roots", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi", - "libc", - "wasi", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl" -version = "0.10.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-rustls", - "hyper-tls 0.6.0", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 2.1.3", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rust-embed" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" -dependencies = [ - "once_cell", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tar" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" -dependencies = [ - "filetime", - "libc", - "xattr", -] - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - -[[package]] -name = "thiserror" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.13", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" - -[[package]] -name = "web-sys" -version = "0.3.70" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "wincompatlib" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2475ec2859b4310dbf008f8c0cafc55202137aac0062f52a0e7651459f6ad88e" -dependencies = [ - "anyhow", - "blake3", - "minreq", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.52.6", -] - -[[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", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "xattr" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" -dependencies = [ - "libc", - "linux-raw-sys", - "rustix", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" From fa242c1ccae9a4e1fd580f48528fbc87193ff3d2 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Wed, 26 Feb 2025 21:46:56 +0100 Subject: [PATCH 12/23] can now download proton from the new gtk launcher --- Cargo.lock | 782 +++++++++++++++++- babylonia-terminal-gui/Cargo.toml | 2 + babylonia-terminal-gui/src/manager.rs | 81 +- babylonia-terminal-gui/src/reporter.rs | 0 babylonia-terminal-gui/src/ui/mod.rs | 10 +- .../ui/pages/steps/choose_game_directory.rs | 122 +++ .../src/ui/pages/steps/download_components.rs | 295 +++++-- .../src/ui/pages/steps/mod.rs | 44 +- .../src/ui/pages/steps/welcome.rs | 4 +- babylonia-terminal-sdk/src/game_state.rs | 7 + 10 files changed, 1273 insertions(+), 74 deletions(-) create mode 100644 babylonia-terminal-gui/src/reporter.rs create mode 100644 babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs diff --git a/Cargo.lock b/Cargo.lock index 5e264ee..b6c224f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,6 +88,52 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ashpd" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand", + "raw-window-handle", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + [[package]] name = "async-compression" version = "0.4.18" @@ -101,6 +147,136 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[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.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -148,11 +324,13 @@ version = "0.1.0" dependencies = [ "anyhow", "babylonia-terminal-sdk", + "downloader", "glib-build-tools", "libadwaita", "log", "relm4", "relm4-components", + "rfd", "wincompatlib", ] @@ -241,6 +419,28 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "bumpalo" version = "3.17.0" @@ -307,6 +507,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chksum-core" version = "0.0.0" @@ -409,6 +615,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.10" @@ -438,6 +653,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -462,6 +687,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.6" @@ -531,6 +762,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + [[package]] name = "displaydoc" version = "0.2.5" @@ -542,12 +779,27 @@ dependencies = [ "syn", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "downloader" version = "0.2.7" @@ -575,6 +827,33 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -591,6 +870,27 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -731,6 +1031,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -1126,6 +1439,18 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "http" version = "0.2.12" @@ -1536,6 +1861,16 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libredox" version = "0.1.3" @@ -1665,6 +2000,19 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1677,7 +2025,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -1696,6 +2044,106 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[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-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.8.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "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.8.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "object" version = "0.36.7" @@ -1761,6 +2209,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[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 = "pango" version = "0.20.9" @@ -1785,6 +2243,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1826,12 +2290,44 @@ 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 = "pkg-config" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + [[package]] name = "portable-atomic" version = "1.10.0" @@ -1871,6 +2367,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.38" @@ -1910,6 +2415,12 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + [[package]] name = "redox_syscall" version = "0.5.8" @@ -2062,6 +2573,30 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "rfd" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a24763657bff09769a8ccf12c8b8a50416fb035fe199263b4c5071e4e3f006f" +dependencies = [ + "ashpd", + "block2", + "core-foundation 0.10.0", + "core-foundation-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "pollster", + "raw-window-handle", + "urlencoding", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.59.0", +] + [[package]] name = "ring" version = "0.17.9" @@ -2250,6 +2785,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[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" @@ -2273,7 +2814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.8.0", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", @@ -2327,6 +2868,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -2444,6 +2996,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" @@ -2500,7 +3058,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys 0.5.0", ] @@ -2511,7 +3069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.8.0", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys 0.6.0", ] @@ -2828,6 +3386,17 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[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 = "unicode-ident" version = "1.0.17" @@ -2855,8 +3424,15 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -2998,6 +3574,66 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wayland-backend" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +dependencies = [ + "bitflags 2.8.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -3024,6 +3660,22 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.9" @@ -3033,6 +3685,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "wincompatlib" version = "0.7.5" @@ -3273,6 +3931,16 @@ dependencies = [ "rustix", ] +[[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 = "yoke" version = "0.7.5" @@ -3297,6 +3965,69 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[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", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -3366,3 +4097,46 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zvariant" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "url", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[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", + "winnow", +] diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml index 28f6ebc..51baef4 100644 --- a/babylonia-terminal-gui/Cargo.toml +++ b/babylonia-terminal-gui/Cargo.toml @@ -11,6 +11,8 @@ relm4-components = "0.9.1" wincompatlib = "0.7.5" relm4 = { version = "0.9.1", features = ["libadwaita"] } libadwaita = { version = "0.7.1", features = ["v1_4"] } +downloader = { git = "https://github.com/ALEZ-DEV/downloader" } # version = "0.2.7", +rfd = "0.15.2" [build-dependencies] glib-build-tools = "0.20.0" diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index f19e818..09426ff 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -1,6 +1,8 @@ +use std::{ops::Deref, sync::Arc}; + use babylonia_terminal_sdk::{ components::proton_component::ProtonComponent, game_config::GameConfig, - game_manager::GameManager, + game_manager::GameManager, utils::github_requester::GithubRelease, }; use log::error; use relm4::{ @@ -9,7 +11,10 @@ use relm4::{ }; use wincompatlib::prelude::Proton; -use crate::ui; +use crate::ui::{ + self, + pages::steps::{self, download_components}, +}; static PROTON: OnceCell = OnceCell::const_new(); @@ -71,3 +76,75 @@ impl Worker for HandleGameProcess { } } } + +#[derive(Debug)] +pub enum HandleComponentInstallationMsg { + StartInstallation( + ( + usize, + usize, + Arc, + ), + ), // proton release and dxvk release +} + +#[derive(Debug)] +pub struct HandleComponentInstallation; + +impl Worker for HandleComponentInstallation { + type Init = (); + + type Input = HandleComponentInstallationMsg; + + type Output = download_components::DownloadComponentsMsg; + + fn init(_init: Self::Init, _sender: relm4::ComponentSender) -> Self { + Self + } + + fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { + match message { + HandleComponentInstallationMsg::StartInstallation(( + proton_release, + dxvk_release, + progress_bar, + )) => { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + let _ = sender.output( + download_components::DownloadComponentsMsg::UpdateProgressBarMsg( + String::from("Starting download for proton"), + ), + ); + + let _ = sender.output( + download_components::DownloadComponentsMsg::UpdateDownloadedComponentName( + String::from("proton"), + ), + ); + + let game_dir = if let Some(dir) = GameConfig::get_config().await.game_dir { + dir + } else { + GameConfig::get_config_directory().await + }; + + GameManager::install_wine(game_dir, proton_release, Some(progress_bar)) + .await; + + let _ = sender.output( + download_components::DownloadComponentsMsg::UpdateProgressBarMsg( + String::from("Unpacking proton"), + ), + ); + + let _ = sender + .output(download_components::DownloadComponentsMsg::UpdateGameState); + }); + } + } + } +} diff --git a/babylonia-terminal-gui/src/reporter.rs b/babylonia-terminal-gui/src/reporter.rs new file mode 100644 index 0000000..e69de29 diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 9e09ef6..aa7156a 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -17,7 +17,7 @@ use libadwaita as adw; use crate::APP_RESOURCE_PATH; -mod pages; +pub mod pages; pub fn run(app: RelmApp) { app.run_async::(None); @@ -28,6 +28,7 @@ pub enum MainWindowMsg { ToggleMenuVisibility, SelectPage, SetIsGameRunning(bool), + UpdateGameState, } struct MainWindow { @@ -103,7 +104,7 @@ impl SimpleAsyncComponent for MainWindow { set_valign: gtk::Align::Center, #[watch] - set_visible: model.game_state == GameState::GameInstalled, + set_visible: model.game_state.is_environment_ready(), adw::PreferencesPage { add = &adw::PreferencesGroup { @@ -142,7 +143,7 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - set_visible: model.game_state != GameState::GameInstalled, + set_visible: !model.game_state.is_environment_ready(), model.setup_page.widget(), } @@ -236,6 +237,9 @@ impl SimpleAsyncComponent for MainWindow { MainWindowMsg::ToggleMenuVisibility => self.is_menu_visible = !self.is_menu_visible, MainWindowMsg::SelectPage => println!("Tried to select a new page"), MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, + MainWindowMsg::UpdateGameState => { + self.game_state = GameState::get_current_state().await.unwrap(); + } } } } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs b/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs new file mode 100644 index 0000000..cbb531e --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs @@ -0,0 +1,122 @@ +use std::{path::PathBuf, str::FromStr}; + +use babylonia_terminal_sdk::{game_config::GameConfig, game_manager::GameManager}; +use log::info; +use relm4::{ + gtk, + prelude::{AsyncComponentParts, SimpleAsyncComponent}, + view, RelmWidgetExt, +}; + +use libadwaita::{self as adw, prelude::*}; + +use super::SetupPageMsg; + +#[derive(Debug)] +pub enum ChooseGameDirectoryMsg { + ChoosePath, + Next, +} + +pub struct ChooseGameDirectoryPage { + path: PathBuf, +} + +#[relm4::component(async, pub)] +impl SimpleAsyncComponent for ChooseGameDirectoryPage { + type Input = ChooseGameDirectoryMsg; + + type Output = SetupPageMsg; + + type Init = (); + + view! { + #[root] + gtk::Box { + adw::PreferencesPage { + set_hexpand: true, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + gtk::Label { + set_label: "Game directory", + add_css_class: "title-1" + }, + }, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + adw::ActionRow { + set_title: "Game directory", + set_icon_name: Some("folder-symbolic"), + set_activatable: true, + + #[watch] + set_subtitle: model.path.to_str().unwrap(), + + connect_activated => ChooseGameDirectoryMsg::ChoosePath, + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Next", + set_hexpand: false, + set_width_request: 200, + + connect_clicked => ChooseGameDirectoryMsg::Next, + }, + }, + }, + } + } + + async fn init( + init: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> relm4::prelude::AsyncComponentParts { + let path = if let Some(dir) = GameConfig::get_config().await.game_dir { + dir + } else { + GameConfig::get_config_directory().await + }; + + let model = ChooseGameDirectoryPage { path }; + + let widgets = view_output!(); + + AsyncComponentParts { widgets, model } + } + + async fn update(&mut self, message: Self::Input, sender: relm4::AsyncComponentSender) { + match message { + ChooseGameDirectoryMsg::ChoosePath => { + info!("choose path"); + let result = rfd::AsyncFileDialog::new() + .set_directory(self.path.clone()) + .pick_folder() + .await; + + if let Some(result) = result { + self.path = result.path().to_path_buf(); + } + + GameConfig::set_game_dir(Some(self.path.clone())) + .await + .unwrap(); // TODO: remove unwrap + } + ChooseGameDirectoryMsg::Next => { + let _ = sender.output(SetupPageMsg::GoToDownloadComponentPage); + } + } + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index 09e82bb..cd1af05 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -1,10 +1,14 @@ +use std::{convert::identity, usize}; + use babylonia_terminal_sdk::{ components::{ dxvk_component::{self, DXVKComponent}, proton_component::{self, ProtonComponent}, }, + game_state::GameState, utils::github_requester::{GithubRelease, GithubRequester}, }; +use log::{error, info}; use relm4::{ self, gtk::{self, prelude::*}, @@ -15,18 +19,44 @@ use relm4::{ use adw::prelude::*; use libadwaita as adw; -use crate::ui::MainWindowMsg; +use crate::{manager, ui::MainWindowMsg}; use super::SetupPageMsg; #[derive(Debug)] pub enum DownloadComponentsMsg { Next, + UpdateGameState, + UpdateProgressBar((u64, u64)), // current and max_progress + UpdateProgressBarMsg(String), + UpdateDownloadedComponentName(String), } +#[derive(Debug)] pub struct DownloadComponentsPage { + //state + game_state: GameState, + + // widgets + proton_combo: adw::ComboRow, + dxvk_combo: adw::ComboRow, + + // values proton_versions: Vec, dxvk_versions: Vec, + selected_proton_version: Option, + selected_dxvk_version: Option, + + //progress_bar + progress_bar_reporter: std::sync::Arc, + progress_bar_message: String, + fraction: f64, + show_progress_bar: bool, + + // download part + is_installing: bool, + installation_handler: WorkerController, + downloaded_component_name: String, } #[relm4::component(async, pub)] @@ -35,68 +65,128 @@ impl SimpleAsyncComponent for DownloadComponentsPage { type Output = SetupPageMsg; - type Init = (); + type Init = GameState; view! { #[root] - adw::PreferencesPage { - set_hexpand: true, + gtk::Box { + adw::PreferencesPage { + set_hexpand: true, + #[watch] + set_visible: !model.is_installing, - add = &adw::PreferencesGroup { - set_valign: gtk::Align::Center, - set_vexpand: true, + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, - gtk::Label { - set_label: "Install components", - add_css_class: "title-1" + gtk::Label { + set_label: "Install components", + add_css_class: "title-1" + }, + }, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + #[local_ref] + proton_combo -> adw::ComboRow { + set_title: "proton version", + + set_model: Some(>k::StringList::new(model + .proton_versions + .iter() + .map(|r| r.tag_name.as_str()) + .collect::>() + .as_slice())), + }, + + #[local_ref] + dxvk_combo -> adw::ComboRow { + set_title: "dxvk version", + + set_model: Some(>k::StringList::new(model + .dxvk_versions + .iter() + .map(|r| r.tag_name.as_str()) + .collect::>() + .as_slice())), + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Next", + set_hexpand: false, + set_width_request: 200, + + connect_clicked => DownloadComponentsMsg::Next, + }, }, }, - add = &adw::PreferencesGroup { - set_valign: gtk::Align::Center, - set_vexpand: true, + adw::PreferencesPage { + set_hexpand: true, + #[watch] + set_visible: model.is_installing, - adw::ComboRow { - set_title: "Proton version", + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, - set_model: Some(>k::StringList::new(model - .proton_versions - .iter() - .map(|r| r.tag_name.as_str()) - .collect::>() - .as_slice())), + gtk::Label { + set_label: "Downloading and installing components", + add_css_class: "title-1" + }, }, - adw::ComboRow { - set_title: "DXVK version", + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, - set_model: Some(>k::StringList::new(model - .dxvk_versions - .iter() - .map(|r| r.tag_name.as_str()) - .collect::>() - .as_slice())), + adw::ActionRow { + #[watch] + set_title: match &model.selected_proton_version { + Some(release) => &release.tag_name, + None => "WTF??!! there's no proton version found ????", + }, + set_subtitle: "Proton version", + + #[watch] + set_icon_name: if model.game_state == GameState::ProtonNotInstalled { Some("emblem-ok-symbolic") } else { Some("process-working") }, + + add_prefix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.game_state == GameState::ProtonNotInstalled, + } + } }, + + add = &adw::PreferencesGroup { + set_valign: gtk::Align::Center, + set_vexpand: true, + + gtk::ProgressBar { + #[watch] + set_fraction: model.fraction, + + #[watch] + set_text: Some(&model.progress_bar_message), + set_show_text: true, + } + } }, - - add = &adw::PreferencesGroup { - set_margin_vertical: 48, - - gtk::Button { - set_css_classes: &["suggested-action", "pill"], - - set_label: "Next", - set_hexpand: false, - set_width_request: 200, - - connect_clicked => DownloadComponentsMsg::Next, - }, - }, - }, + } } async fn init( - init: Self::Init, + game_state: Self::Init, root: Self::Root, sender: AsyncComponentSender, ) -> AsyncComponentParts { @@ -113,16 +203,129 @@ impl SimpleAsyncComponent for DownloadComponentsPage { .unwrap(); //TODO: remove unwrap() let model = DownloadComponentsPage { + game_state, + + proton_combo: adw::ComboRow::new(), + dxvk_combo: adw::ComboRow::new(), + proton_versions: proton_releases, dxvk_versions: dxvk_releases, + selected_proton_version: None, + selected_dxvk_version: None, + + progress_bar_reporter: DownloadComponentProgressBarReporter::create(sender.clone()), + progress_bar_message: String::new(), + fraction: 0.0, + show_progress_bar: false, + + is_installing: false, + installation_handler: manager::HandleComponentInstallation::builder() + .detach_worker(()) + .forward(sender.input_sender(), identity), + downloaded_component_name: String::new(), }; + let proton_combo = &model.proton_combo; + let dxvk_combo = &model.dxvk_combo; + let widgets = view_output!(); AsyncComponentParts { widgets, model } } async fn update(&mut self, message: Self::Input, sender: AsyncComponentSender) -> () { - todo!(); + match message { + DownloadComponentsMsg::Next => { + if !self.is_installing { + self.is_installing = true; + + let proton_index = self.proton_combo.selected() as usize; + let dxvk_index = self.dxvk_combo.selected() as usize; + + let proton_release = self.proton_versions[proton_index].clone(); + let dxvk_release = self.dxvk_versions[dxvk_index].clone(); + + self.selected_proton_version = Some(proton_release); + self.selected_dxvk_version = Some(dxvk_release); + let _ = self.installation_handler.sender().send( + manager::HandleComponentInstallationMsg::StartInstallation(( + proton_index, + dxvk_index, + self.progress_bar_reporter.clone(), + )), + ); + } else { + let _ = sender.output(SetupPageMsg::Finish); + } + } + DownloadComponentsMsg::UpdateDownloadedComponentName(name) => { + self.downloaded_component_name = name; + } + DownloadComponentsMsg::UpdateGameState => { + self.game_state = GameState::get_current_state().await.unwrap(); + } + DownloadComponentsMsg::UpdateProgressBar((current, max_progress)) => { + self.fraction = if current == 0 { + 0.0 + } else { + current as f64 / max_progress as f64 + }; + + self.progress_bar_message = format!( + "Downloading {} : {:.2}%", + self.downloaded_component_name, + self.fraction * 100.0 + ); + } + DownloadComponentsMsg::UpdateProgressBarMsg(message) => { + self.progress_bar_message = message; + } + } + } +} + +#[derive(Debug)] +struct ProgressBarReporterPrivate { + max_progress: Option, +} + +#[derive(Debug)] +pub struct DownloadComponentProgressBarReporter { + private: std::sync::Mutex>, + sender: relm4::AsyncComponentSender, +} + +impl DownloadComponentProgressBarReporter { + fn create(page: relm4::AsyncComponentSender) -> std::sync::Arc { + std::sync::Arc::new(Self { + private: std::sync::Mutex::new(None), + sender: page, + }) + } +} + +impl downloader::progress::Reporter for DownloadComponentProgressBarReporter { + fn setup(&self, max_progress: Option, message: &str) { + let private = ProgressBarReporterPrivate { max_progress }; + + let mut guard = self.private.lock().unwrap(); + *guard = Some(private); + } + + fn progress(&self, current: u64) { + if let Some(p) = self.private.lock().unwrap().as_mut() { + self.sender.input(DownloadComponentsMsg::UpdateProgressBar(( + current, + p.max_progress.unwrap(), + ))); + } + } + + fn set_message(&self, message: &str) {} + + fn done(&self) { + self.sender.input(DownloadComponentsMsg::Next); + let mut guard = self.private.lock().unwrap(); + *guard = None; } } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/mod.rs b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs index af69500..d3865aa 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/mod.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs @@ -1,6 +1,7 @@ use std::convert::identity; -use babylonia_terminal_sdk::game_state::GameState; +use babylonia_terminal_sdk::{game_config::GameConfig, game_state::GameState}; +use choose_game_directory::ChooseGameDirectoryPage; use download_components::DownloadComponentsPage; use libadwaita::prelude::{OrientableExt, WidgetExt}; use relm4::{ @@ -14,17 +15,21 @@ use welcome::WelcomePage; use crate::ui::MainWindowMsg; -mod download_components; +mod choose_game_directory; +pub mod download_components; mod welcome; #[derive(Debug)] pub enum SetupPageMsg { - UpdateGameState, + GoToChooseGameDirectoryPage, + GoToDownloadComponentPage, + Finish, } pub struct SetupPage { game_state: GameState, welcome_page: Controller, + choose_game_directory_page: AsyncController, download_components_page: AsyncController, carousel: adw::Carousel, @@ -42,6 +47,8 @@ impl SimpleAsyncComponent for SetupPage { #[root] gtk::Box { set_orientation: gtk::Orientation::Vertical, + set_hexpand: true, + set_vexpand: true, #[local_ref] carousel -> adw::Carousel { @@ -50,6 +57,7 @@ impl SimpleAsyncComponent for SetupPage { set_allow_scroll_wheel: false, append = model.welcome_page.widget(), + append = model.choose_game_directory_page.widget(), append = model.download_components_page.widget(), }, @@ -68,9 +76,12 @@ impl SimpleAsyncComponent for SetupPage { let welcome_page = WelcomePage::builder() .launch(()) .forward(sender.input_sender(), identity); - let download_components_page = DownloadComponentsPage::builder() + let choose_game_directory_page = ChooseGameDirectoryPage::builder() .launch(()) .forward(sender.input_sender(), identity); + let download_components_page = DownloadComponentsPage::builder() + .launch(game_state.clone()) + .forward(sender.input_sender(), identity); let carousel = adw::Carousel::new(); @@ -78,6 +89,7 @@ impl SimpleAsyncComponent for SetupPage { let model = SetupPage { welcome_page, + choose_game_directory_page, download_components_page, game_state, carousel: carousel.clone(), @@ -88,24 +100,20 @@ impl SimpleAsyncComponent for SetupPage { } async fn update(&mut self, message: Self::Input, sender: AsyncComponentSender) { - match message { - SetupPageMsg::UpdateGameState => { - self.game_state = GameState::get_current_state().await.unwrap() - } // TODO: delete this unwrap() - } + self.game_state = GameState::get_current_state().await.unwrap(); // TODO: delete this unwrap() - match self.game_state { - GameState::ProtonNotInstalled => { + match message { + SetupPageMsg::GoToChooseGameDirectoryPage => { + self.carousel + .scroll_to(self.choose_game_directory_page.widget(), true); + } + SetupPageMsg::GoToDownloadComponentPage => { self.carousel .scroll_to(self.download_components_page.widget(), true); } - GameState::DXVKNotInstalled => todo!(), - GameState::FontNotInstalled => todo!(), - GameState::DependecieNotInstalled => todo!(), - GameState::GameNotInstalled => todo!(), - GameState::GameNeedUpdate => todo!(), - GameState::GameNotPatched => todo!(), - GameState::GameInstalled => todo!(), + SetupPageMsg::Finish => { + sender.output(MainWindowMsg::UpdateGameState); + } } } } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs b/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs index 12e85b4..d8de791 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/welcome.rs @@ -78,7 +78,9 @@ impl SimpleComponent for WelcomePage { fn update(&mut self, message: Self::Input, sender: ComponentSender) { match message { - WelcomePageMsg::Next => sender.output(SetupPageMsg::UpdateGameState).unwrap(), + WelcomePageMsg::Next => sender + .output(SetupPageMsg::GoToChooseGameDirectoryPage) + .unwrap(), } } } diff --git a/babylonia-terminal-sdk/src/game_state.rs b/babylonia-terminal-sdk/src/game_state.rs index 3eb2763..3200135 100644 --- a/babylonia-terminal-sdk/src/game_state.rs +++ b/babylonia-terminal-sdk/src/game_state.rs @@ -46,4 +46,11 @@ impl GameState { Ok(GameState::GameInstalled) } + + pub fn is_environment_ready(&self) -> bool { + self == &GameState::GameNotInstalled + || self == &GameState::GameNeedUpdate + || self == &GameState::GameNotPatched + || self == &GameState::GameInstalled + } } From 23acb09ef31516494591eff6bc33b2e1d9baf87b Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Tue, 11 Mar 2025 21:14:55 +0100 Subject: [PATCH 13/23] can now download dxvk, fonts and the denpendecies correctly the fonts installation seems to fail, idk why because it work in ulterior version but not on this one and I have litteraly changed nothing, do idk what's going on, but I need to implement error handling and fix this little issue before continuing --- babylonia-terminal-gui/src/manager.rs | 46 ++++- babylonia-terminal-gui/src/ui/mod.rs | 7 + .../src/ui/pages/steps/download_components.rs | 168 +++++++++++++----- .../src/ui/pages/steps/mod.rs | 2 +- 4 files changed, 165 insertions(+), 58 deletions(-) diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index 09426ff..c38e4f7 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -4,7 +4,8 @@ use babylonia_terminal_sdk::{ components::proton_component::ProtonComponent, game_config::GameConfig, game_manager::GameManager, utils::github_requester::GithubRelease, }; -use log::error; +use downloader::download; +use log::{debug, error}; use relm4::{ tokio::{self, sync::OnceCell}, Worker, @@ -117,6 +118,13 @@ impl Worker for HandleComponentInstallation { let _ = sender.output( download_components::DownloadComponentsMsg::UpdateProgressBarMsg( String::from("Starting download for proton"), + Some(String::from("Unpacking and initializing proton")), + ), + ); + + let _ = sender.output( + download_components::DownloadComponentsMsg::UpdateCurrentlyInstalling( + download_components::CurrentlyInstalling::Proton, ), ); @@ -132,17 +140,39 @@ impl Worker for HandleComponentInstallation { GameConfig::get_config_directory().await }; - GameManager::install_wine(game_dir, proton_release, Some(progress_bar)) + GameManager::install_wine(game_dir.clone(), proton_release, Some(progress_bar.clone())) .await; - let _ = sender.output( - download_components::DownloadComponentsMsg::UpdateProgressBarMsg( - String::from("Unpacking proton"), - ), - ); + let _ = sender + .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Starting download for DXVK"), Some(String::from("Installing DXVK")))); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateCurrentlyInstalling(download_components::CurrentlyInstalling::DXVK)); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("DXVK"))); + + GameManager::install_dxvk(&get_proton().await, game_dir, dxvk_release, Some(progress_bar.clone())).await; let _ = sender - .output(download_components::DownloadComponentsMsg::UpdateGameState); + .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Downloading and installing fonts"), Some(String::from("Fonts installed")))); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateCurrentlyInstalling(download_components::CurrentlyInstalling::Fonts)); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("fonts"))); + + GameManager::install_font(&get_proton().await, Some(progress_bar.clone())).await; + + let _ = sender + .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Download and installing denpendecies"), None)); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateCurrentlyInstalling(download_components::CurrentlyInstalling::Denpendecies)); + + let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("denpendecies"))); + + GameManager::install_dependencies(&get_proton().await).await; + + debug!("Finished to installing the components!"); + + let _ = sender.output(download_components::DownloadComponentsMsg::Finish); }); } } diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index aa7156a..8a404b9 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -143,6 +143,7 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, + #[watch] set_visible: !model.game_state.is_environment_ready(), model.setup_page.widget(), @@ -210,6 +211,8 @@ impl SimpleAsyncComponent for MainWindow { let widgets = view_output!(); + debug!("current GameState : {:?}", model.game_state); + AsyncComponentParts { model, widgets } } @@ -239,6 +242,10 @@ impl SimpleAsyncComponent for MainWindow { MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, MainWindowMsg::UpdateGameState => { self.game_state = GameState::get_current_state().await.unwrap(); + debug!( + "is_environment_ready : {}", + self.game_state.is_environment_ready() + ); } } } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index cd1af05..9fd8b1b 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -6,9 +6,12 @@ use babylonia_terminal_sdk::{ proton_component::{self, ProtonComponent}, }, game_state::GameState, - utils::github_requester::{GithubRelease, GithubRequester}, + utils::{ + github_requester::{GithubRelease, GithubRequester}, + kuro_prod_api::CurrentGameInfo, + }, }; -use log::{error, info}; +use log::{debug, error, info}; use relm4::{ self, gtk::{self, prelude::*}, @@ -25,18 +28,25 @@ use super::SetupPageMsg; #[derive(Debug)] pub enum DownloadComponentsMsg { - Next, - UpdateGameState, UpdateProgressBar((u64, u64)), // current and max_progress - UpdateProgressBarMsg(String), + UpdateProgressBarMsg(String, Option), // current msg and when done msg + ShowDoneMsg, UpdateDownloadedComponentName(String), + UpdateCurrentlyInstalling(CurrentlyInstalling), + Finish, +} + +#[derive(Debug, PartialEq, Eq)] +pub enum CurrentlyInstalling { + None, + Proton, + DXVK, + Fonts, + Denpendecies, } #[derive(Debug)] pub struct DownloadComponentsPage { - //state - game_state: GameState, - // widgets proton_combo: adw::ComboRow, dxvk_combo: adw::ComboRow, @@ -54,9 +64,10 @@ pub struct DownloadComponentsPage { show_progress_bar: bool, // download part - is_installing: bool, installation_handler: WorkerController, downloaded_component_name: String, + currently_installing: CurrentlyInstalling, + msg_when_done: Option, } #[relm4::component(async, pub)] @@ -65,7 +76,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { type Output = SetupPageMsg; - type Init = GameState; + type Init = (); view! { #[root] @@ -73,7 +84,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { adw::PreferencesPage { set_hexpand: true, #[watch] - set_visible: !model.is_installing, + set_visible: model.currently_installing == CurrentlyInstalling::None, add = &adw::PreferencesGroup { set_valign: gtk::Align::Center, @@ -124,7 +135,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_hexpand: false, set_width_request: 200, - connect_clicked => DownloadComponentsMsg::Next, + connect_clicked => DownloadComponentsMsg::UpdateCurrentlyInstalling(CurrentlyInstalling::Proton), }, }, }, @@ -132,7 +143,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { adw::PreferencesPage { set_hexpand: true, #[watch] - set_visible: model.is_installing, + set_visible: model.currently_installing != CurrentlyInstalling::None, add = &adw::PreferencesGroup { set_valign: gtk::Align::Center, @@ -149,21 +160,72 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_vexpand: true, adw::ActionRow { + set_title: "Proton", #[watch] - set_title: match &model.selected_proton_version { + set_subtitle: match &model.selected_proton_version { Some(release) => &release.tag_name, None => "WTF??!! there's no proton version found ????", }, - set_subtitle: "Proton version", #[watch] - set_icon_name: if model.game_state == GameState::ProtonNotInstalled { Some("emblem-ok-symbolic") } else { Some("process-working") }, + set_icon_name: if model.currently_installing == CurrentlyInstalling::Proton { Some("process-working") } else { Some("emblem-ok-symbolic") }, add_prefix = >k::Spinner { set_spinning: true, #[watch] - set_visible: model.game_state == GameState::ProtonNotInstalled, + set_visible: model.currently_installing == CurrentlyInstalling::Proton, + } + }, + + adw::ActionRow { + set_title: "DXVK", + #[watch] + set_subtitle: match &model.selected_dxvk_version { + Some(release) => &release.tag_name, + None => "WTF??!! there's no proton version found ????", + }, + + #[watch] + set_icon_name: if model.currently_installing == CurrentlyInstalling::DXVK { Some("process-working") } else { Some("emblem-ok-symbolic") }, + + add_prefix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.currently_installing == CurrentlyInstalling::DXVK, + } + }, + + adw::ActionRow { + #[watch] + set_title: "Fonts", + set_subtitle: "Arial", + + #[watch] + set_icon_name: if model.currently_installing == CurrentlyInstalling::Fonts { Some("process-working") } else { Some("emblem-ok-symbolic") }, + + add_prefix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.currently_installing == CurrentlyInstalling::Fonts, + } + }, + + adw::ActionRow { + #[watch] + set_title: "vcrun2022", + set_subtitle: "Denpendecies", + + #[watch] + set_icon_name: if model.currently_installing == CurrentlyInstalling::Denpendecies { Some("process-working") } else { Some("emblem-ok-symbolic") }, + + add_prefix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.currently_installing == CurrentlyInstalling::Denpendecies, } } }, @@ -172,6 +234,8 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_valign: gtk::Align::Center, set_vexpand: true, + set_visible: model.currently_installing != CurrentlyInstalling::Fonts && model.currently_installing != CurrentlyInstalling::Denpendecies, + gtk::ProgressBar { #[watch] set_fraction: model.fraction, @@ -186,7 +250,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { } async fn init( - game_state: Self::Init, + _: Self::Init, root: Self::Root, sender: AsyncComponentSender, ) -> AsyncComponentParts { @@ -203,8 +267,6 @@ impl SimpleAsyncComponent for DownloadComponentsPage { .unwrap(); //TODO: remove unwrap() let model = DownloadComponentsPage { - game_state, - proton_combo: adw::ComboRow::new(), dxvk_combo: adw::ComboRow::new(), @@ -218,11 +280,12 @@ impl SimpleAsyncComponent for DownloadComponentsPage { fraction: 0.0, show_progress_bar: false, - is_installing: false, installation_handler: manager::HandleComponentInstallation::builder() .detach_worker(()) .forward(sender.input_sender(), identity), downloaded_component_name: String::new(), + currently_installing: CurrentlyInstalling::None, + msg_when_done: None, }; let proton_combo = &model.proton_combo; @@ -235,35 +298,9 @@ impl SimpleAsyncComponent for DownloadComponentsPage { async fn update(&mut self, message: Self::Input, sender: AsyncComponentSender) -> () { match message { - DownloadComponentsMsg::Next => { - if !self.is_installing { - self.is_installing = true; - - let proton_index = self.proton_combo.selected() as usize; - let dxvk_index = self.dxvk_combo.selected() as usize; - - let proton_release = self.proton_versions[proton_index].clone(); - let dxvk_release = self.dxvk_versions[dxvk_index].clone(); - - self.selected_proton_version = Some(proton_release); - self.selected_dxvk_version = Some(dxvk_release); - let _ = self.installation_handler.sender().send( - manager::HandleComponentInstallationMsg::StartInstallation(( - proton_index, - dxvk_index, - self.progress_bar_reporter.clone(), - )), - ); - } else { - let _ = sender.output(SetupPageMsg::Finish); - } - } DownloadComponentsMsg::UpdateDownloadedComponentName(name) => { self.downloaded_component_name = name; } - DownloadComponentsMsg::UpdateGameState => { - self.game_state = GameState::get_current_state().await.unwrap(); - } DownloadComponentsMsg::UpdateProgressBar((current, max_progress)) => { self.fraction = if current == 0 { 0.0 @@ -277,9 +314,42 @@ impl SimpleAsyncComponent for DownloadComponentsPage { self.fraction * 100.0 ); } - DownloadComponentsMsg::UpdateProgressBarMsg(message) => { + DownloadComponentsMsg::UpdateProgressBarMsg(message, message_when_done) => { self.progress_bar_message = message; + self.msg_when_done = message_when_done; } + DownloadComponentsMsg::ShowDoneMsg => { + if let Some(msg) = self.msg_when_done.clone() { + self.progress_bar_message = msg; + } + } + DownloadComponentsMsg::UpdateCurrentlyInstalling(currently_installing) => { + self.currently_installing = currently_installing; + } + DownloadComponentsMsg::Finish => { + let _ = sender.output(SetupPageMsg::Finish); + } + } + + if self.selected_proton_version.is_none() + && self.selected_dxvk_version.is_none() + && self.currently_installing != CurrentlyInstalling::None + { + let proton_index = self.proton_combo.selected() as usize; + let dxvk_index = self.dxvk_combo.selected() as usize; + + let proton_release = self.proton_versions[proton_index].clone(); + let dxvk_release = self.dxvk_versions[dxvk_index].clone(); + + self.selected_proton_version = Some(proton_release); + self.selected_dxvk_version = Some(dxvk_release); + let _ = self.installation_handler.sender().send( + manager::HandleComponentInstallationMsg::StartInstallation(( + proton_index, + dxvk_index, + self.progress_bar_reporter.clone(), + )), + ); } } } @@ -324,7 +394,7 @@ impl downloader::progress::Reporter for DownloadComponentProgressBarReporter { fn set_message(&self, message: &str) {} fn done(&self) { - self.sender.input(DownloadComponentsMsg::Next); + self.sender.input(DownloadComponentsMsg::ShowDoneMsg); let mut guard = self.private.lock().unwrap(); *guard = None; } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/mod.rs b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs index d3865aa..6f2dad2 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/mod.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/mod.rs @@ -80,7 +80,7 @@ impl SimpleAsyncComponent for SetupPage { .launch(()) .forward(sender.input_sender(), identity); let download_components_page = DownloadComponentsPage::builder() - .launch(game_state.clone()) + .launch(()) .forward(sender.input_sender(), identity); let carousel = adw::Carousel::new(); From 0a60f79daa4701d8dff5abfe2404d861e01710c2 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Wed, 12 Mar 2025 21:31:30 +0100 Subject: [PATCH 14/23] added a dialog for errors --- Cargo.lock | 338 +++++++++++++++++- babylonia-terminal-gui/Cargo.toml | 1 + babylonia-terminal-gui/src/manager.rs | 23 +- babylonia-terminal-gui/src/ui/mod.rs | 9 +- .../src/ui/pages/steps/download_components.rs | 46 ++- 5 files changed, 403 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b6c224f..4e6134f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,25 @@ dependencies = [ "backtrace", ] +[[package]] +name = "arboard" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +dependencies = [ + "clipboard-win", + "core-graphics", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "windows-sys 0.48.0", + "wl-clipboard-rs", + "x11rb", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -106,7 +125,7 @@ dependencies = [ "url", "wayland-backend", "wayland-client", - "wayland-protocols", + "wayland-protocols 0.32.6", "zbus", ] @@ -323,6 +342,7 @@ name = "babylonia-terminal-gui" version = "0.1.0" dependencies = [ "anyhow", + "arboard", "babylonia-terminal-sdk", "downloader", "glib-build-tools", @@ -447,12 +467,24 @@ version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" + [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.0" @@ -507,6 +539,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "cfg_aliases" version = "0.2.1" @@ -599,6 +637,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + [[package]] name = "colorchoice" version = "1.0.3" @@ -669,6 +716,30 @@ 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", + "foreign-types 0.5.0", + "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 = "cpufeatures" version = "0.2.17" @@ -718,6 +789,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72e3ae26c830a573f2e231fc2475f71fce4705609097cb9523abfc4007caed0b" +[[package]] +name = "derive-new" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dialoguer" version = "0.11.0" @@ -870,6 +952,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + [[package]] name = "event-listener" version = "5.4.0" @@ -897,6 +985,15 @@ 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 = "field-offset" version = "0.3.6" @@ -919,6 +1016,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.35" @@ -953,7 +1056,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[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 0.3.1", +] + +[[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", ] [[package]] @@ -962,6 +1086,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[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" @@ -1152,6 +1282,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -1767,6 +1907,19 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "tiff", +] + [[package]] name = "indexmap" version = "2.7.1" @@ -1808,6 +1961,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.77" @@ -1940,6 +2099,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.4" @@ -1947,6 +2112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -2000,6 +2166,18 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nix" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "cfg_aliases 0.1.1", + "libc", +] + [[package]] name = "nix" version = "0.29.0" @@ -2008,17 +2186,36 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.8.0", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.2.1", "libc", "memoffset", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -2167,7 +2364,7 @@ checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ "bitflags 2.8.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -2219,6 +2416,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "os_pipe" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "pango" version = "0.20.9" @@ -2278,6 +2485,16 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -2307,6 +2524,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[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.7.4" @@ -2932,6 +3162,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simple_logger" version = "4.3.3" @@ -3157,6 +3393,17 @@ dependencies = [ "syn", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.37" @@ -3374,6 +3621,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tree_magic_mini" +version = "3.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac5e8971f245c3389a5a76e648bfc80803ae066a1243a75db0064d7c1129d63" +dependencies = [ + "fnv", + "memchr", + "nom", + "once_cell", + "petgraph", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -3600,6 +3860,18 @@ dependencies = [ "wayland-scanner", ] +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + [[package]] name = "wayland-protocols" version = "0.32.6" @@ -3612,6 +3884,19 @@ dependencies = [ "wayland-scanner", ] +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-scanner", +] + [[package]] name = "wayland-scanner" version = "0.31.6" @@ -3660,6 +3945,12 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -3908,6 +4199,26 @@ dependencies = [ "bitflags 2.8.0", ] +[[package]] +name = "wl-clipboard-rs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" +dependencies = [ + "derive-new", + "libc", + "log", + "nix 0.28.0", + "os_pipe", + "tempfile", + "thiserror", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-protocols-wlr", +] + [[package]] name = "write16" version = "1.0.0" @@ -3920,6 +4231,23 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "gethostname", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + [[package]] name = "xattr" version = "1.4.0" @@ -3986,7 +4314,7 @@ dependencies = [ "futures-core", "futures-lite", "hex", - "nix", + "nix 0.29.0", "ordered-stream", "serde", "serde_repr", diff --git a/babylonia-terminal-gui/Cargo.toml b/babylonia-terminal-gui/Cargo.toml index 51baef4..c350218 100644 --- a/babylonia-terminal-gui/Cargo.toml +++ b/babylonia-terminal-gui/Cargo.toml @@ -13,6 +13,7 @@ relm4 = { version = "0.9.1", features = ["libadwaita"] } libadwaita = { version = "0.7.1", features = ["v1_4"] } downloader = { git = "https://github.com/ALEZ-DEV/downloader" } # version = "0.2.7", rfd = "0.15.2" +arboard = { version = "3.4.1", features = ["wayland-data-control"] } [build-dependencies] glib-build-tools = "0.20.0" diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index c38e4f7..db1849d 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -14,7 +14,10 @@ use wincompatlib::prelude::Proton; use crate::ui::{ self, - pages::steps::{self, download_components}, + pages::steps::{ + self, + download_components::{self, DownloadComponentsPageWidgets}, + }, }; static PROTON: OnceCell = OnceCell::const_new(); @@ -140,8 +143,9 @@ impl Worker for HandleComponentInstallation { GameConfig::get_config_directory().await }; - GameManager::install_wine(game_dir.clone(), proton_release, Some(progress_bar.clone())) - .await; + if let Err(error) = GameManager::install_wine(game_dir.clone(), proton_release, Some(progress_bar.clone())).await { + sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install proton : {}", error))).unwrap(); + } let _ = sender .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Starting download for DXVK"), Some(String::from("Installing DXVK")))); @@ -150,7 +154,9 @@ impl Worker for HandleComponentInstallation { let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("DXVK"))); - GameManager::install_dxvk(&get_proton().await, game_dir, dxvk_release, Some(progress_bar.clone())).await; + if let Err(error) = GameManager::install_dxvk(&get_proton().await, game_dir, dxvk_release, Some(progress_bar.clone())).await { + sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install DXVK : {}", error))).unwrap(); + } let _ = sender .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Downloading and installing fonts"), Some(String::from("Fonts installed")))); @@ -159,7 +165,9 @@ impl Worker for HandleComponentInstallation { let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("fonts"))); - GameManager::install_font(&get_proton().await, Some(progress_bar.clone())).await; + if let Err(error) = GameManager::install_font(&get_proton().await, Some(progress_bar.clone())).await { + sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install fonts : {}", error))).unwrap(); + } let _ = sender .output(download_components::DownloadComponentsMsg::UpdateProgressBarMsg(String::from("Download and installing denpendecies"), None)); @@ -168,7 +176,10 @@ impl Worker for HandleComponentInstallation { let _ = sender.output(download_components::DownloadComponentsMsg::UpdateDownloadedComponentName(String::from("denpendecies"))); - GameManager::install_dependencies(&get_proton().await).await; + if let Err(error) = GameManager::install_dependencies(&get_proton().await).await { + sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install dependencies : {}", error))).unwrap(); + + } debug!("Finished to installing the components!"); diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 8a404b9..527915d 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -8,6 +8,7 @@ use relm4::{ self, gtk::{self, prelude::*}, loading_widgets::LoadingWidgets, + once_cell::sync::OnceCell, prelude::*, *, }; @@ -19,6 +20,8 @@ use crate::APP_RESOURCE_PATH; pub mod pages; +pub static mut MAIN_WINDOW: Option = None; + pub fn run(app: RelmApp) { app.run_async::(None); } @@ -69,7 +72,7 @@ impl SimpleAsyncComponent for MainWindow { view! { #[root] - adw::ApplicationWindow { + main_window = adw::ApplicationWindow { set_default_size: (700, 560), add_css_class?: IS_DEVEL.then_some("devel"), @@ -211,6 +214,10 @@ impl SimpleAsyncComponent for MainWindow { let widgets = view_output!(); + unsafe { + MAIN_WINDOW = Some(widgets.main_window.clone()); + } + debug!("current GameState : {:?}", model.game_state); AsyncComponentParts { model, widgets } diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index 9fd8b1b..68a1057 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -1,5 +1,6 @@ use std::{convert::identity, usize}; +use arboard::Clipboard; use babylonia_terminal_sdk::{ components::{ dxvk_component::{self, DXVKComponent}, @@ -22,7 +23,7 @@ use relm4::{ use adw::prelude::*; use libadwaita as adw; -use crate::{manager, ui::MainWindowMsg}; +use crate::{manager, ui::MAIN_WINDOW}; use super::SetupPageMsg; @@ -33,7 +34,9 @@ pub enum DownloadComponentsMsg { ShowDoneMsg, UpdateDownloadedComponentName(String), UpdateCurrentlyInstalling(CurrentlyInstalling), + ShowError(String), // error message Finish, + Quit, } #[derive(Debug, PartialEq, Eq)] @@ -50,6 +53,7 @@ pub struct DownloadComponentsPage { // widgets proton_combo: adw::ComboRow, dxvk_combo: adw::ComboRow, + //error_dialog: Controller, // values proton_versions: Vec, @@ -137,6 +141,16 @@ impl SimpleAsyncComponent for DownloadComponentsPage { connect_clicked => DownloadComponentsMsg::UpdateCurrentlyInstalling(CurrentlyInstalling::Proton), }, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Test dialog", + set_hexpand: false, + set_width_request: 200, + + connect_clicked => DownloadComponentsMsg::ShowError(String::from("Test dialog")), + }, }, }, @@ -269,7 +283,12 @@ impl SimpleAsyncComponent for DownloadComponentsPage { let model = DownloadComponentsPage { proton_combo: adw::ComboRow::new(), dxvk_combo: adw::ComboRow::new(), - + //error_dialog: CopyDialog::builder() + // .transient_for(&root) + // .launch(()) + // .forward(sender.input_sender(), move |msg| match msg { + // DialogOutput::Close => DownloadComponentsMsg::Quit, + // }), proton_versions: proton_releases, dxvk_versions: dxvk_releases, selected_proton_version: None, @@ -326,9 +345,32 @@ impl SimpleAsyncComponent for DownloadComponentsPage { DownloadComponentsMsg::UpdateCurrentlyInstalling(currently_installing) => { self.currently_installing = currently_installing; } + DownloadComponentsMsg::ShowError(message) => { + let dialog = unsafe { + adw::MessageDialog::new( + MAIN_WINDOW.as_ref(), + Some("Error while downloading components"), + Some(&message), + ) + }; + + dialog.add_response("close", "Close"); + dialog.add_response("copy", "Copy"); + + dialog.set_response_appearance("copy", adw::ResponseAppearance::Suggested); + + dialog.connect_response(Some("copy"), move |_, _| { + if let Err(err) = Clipboard::new().unwrap().set_text(&message.clone()) { + error!("Failed to copy the error to the clipboard : {}", err); + } + }); + + dialog.present(); + } DownloadComponentsMsg::Finish => { let _ = sender.output(SetupPageMsg::Finish); } + DownloadComponentsMsg::Quit => relm4::main_application().quit(), } if self.selected_proton_version.is_none() From f793b18b2c41cfc27d3da8d63fa77d7dc525abe4 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 13 Mar 2025 18:48:48 +0100 Subject: [PATCH 15/23] some refactor and cleaning --- babylonia-terminal-gui/src/manager.rs | 5 ++++- .../src/ui/pages/steps/download_components.rs | 17 +---------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index db1849d..91fc61b 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -145,6 +145,7 @@ impl Worker for HandleComponentInstallation { if let Err(error) = GameManager::install_wine(game_dir.clone(), proton_release, Some(progress_bar.clone())).await { sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install proton : {}", error))).unwrap(); + return; } let _ = sender @@ -156,6 +157,7 @@ impl Worker for HandleComponentInstallation { if let Err(error) = GameManager::install_dxvk(&get_proton().await, game_dir, dxvk_release, Some(progress_bar.clone())).await { sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install DXVK : {}", error))).unwrap(); + return; } let _ = sender @@ -167,6 +169,7 @@ impl Worker for HandleComponentInstallation { if let Err(error) = GameManager::install_font(&get_proton().await, Some(progress_bar.clone())).await { sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install fonts : {}", error))).unwrap(); + return; } let _ = sender @@ -178,7 +181,7 @@ impl Worker for HandleComponentInstallation { if let Err(error) = GameManager::install_dependencies(&get_proton().await).await { sender.output(download_components::DownloadComponentsMsg::ShowError(format!("Failed to install dependencies : {}", error))).unwrap(); - + return; } debug!("Finished to installing the components!"); diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index 68a1057..d6b54d4 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -141,16 +141,6 @@ impl SimpleAsyncComponent for DownloadComponentsPage { connect_clicked => DownloadComponentsMsg::UpdateCurrentlyInstalling(CurrentlyInstalling::Proton), }, - - gtk::Button { - set_css_classes: &["suggested-action", "pill"], - - set_label: "Test dialog", - set_hexpand: false, - set_width_request: 200, - - connect_clicked => DownloadComponentsMsg::ShowError(String::from("Test dialog")), - }, }, }, @@ -283,12 +273,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { let model = DownloadComponentsPage { proton_combo: adw::ComboRow::new(), dxvk_combo: adw::ComboRow::new(), - //error_dialog: CopyDialog::builder() - // .transient_for(&root) - // .launch(()) - // .forward(sender.input_sender(), move |msg| match msg { - // DialogOutput::Close => DownloadComponentsMsg::Quit, - // }), + proton_versions: proton_releases, dxvk_versions: dxvk_releases, selected_proton_version: None, From c84520212cf0d4a4199bbb0b1f17855b37edd869 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 13 Mar 2025 21:29:51 +0100 Subject: [PATCH 16/23] added game page and about page --- babylonia-terminal-gui/src/manager.rs | 6 +- babylonia-terminal-gui/src/ui/mod.rs | 87 ++- babylonia-terminal-gui/src/ui/pages/about.rs | 730 ++++++++++++++++++ babylonia-terminal-gui/src/ui/pages/game.rs | 95 +++ babylonia-terminal-gui/src/ui/pages/mod.rs | 2 + .../src/ui/pages/steps/download_components.rs | 53 +- 6 files changed, 917 insertions(+), 56 deletions(-) create mode 100644 babylonia-terminal-gui/src/ui/pages/about.rs create mode 100644 babylonia-terminal-gui/src/ui/pages/game.rs diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index 91fc61b..bf9d919 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -58,7 +58,7 @@ impl Worker for HandleGameProcess { type Input = HandleGameProcessMsg; - type Output = ui::MainWindowMsg; + type Output = ui::pages::game::GamePageMsg; fn init(_init: Self::Init, _sender: relm4::ComponentSender) -> Self { Self @@ -72,9 +72,9 @@ impl Worker for HandleGameProcess { .build() .unwrap() .block_on(async { - sender.output(ui::MainWindowMsg::SetIsGameRunning(true)); + sender.output(ui::pages::game::GamePageMsg::SetIsGameRunning(true)); run_game().await; - sender.output(ui::MainWindowMsg::SetIsGameRunning(false)); + sender.output(ui::pages::game::GamePageMsg::SetIsGameRunning(false)); }); } } diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 527915d..8a8752e 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -6,7 +6,8 @@ use babylonia_terminal_sdk::game_state::GameState; use log::debug; use relm4::{ self, - gtk::{self, prelude::*}, + component::AsyncConnector, + gtk::{self, prelude::*, Widget}, loading_widgets::LoadingWidgets, once_cell::sync::OnceCell, prelude::*, @@ -29,16 +30,16 @@ pub fn run(app: RelmApp) { #[derive(Debug)] pub enum MainWindowMsg { ToggleMenuVisibility, - SelectPage, - SetIsGameRunning(bool), + SelectPage(Pages), UpdateGameState, } struct MainWindow { game_state: GameState, setup_page: AsyncController, - game_handler: WorkerController, - is_game_running: bool, + game_page: AsyncController, + about_page: AsyncConnector, + current_page: Pages, is_menu_visible: bool, } @@ -48,20 +49,29 @@ impl MainWindow { .launch(game_state.clone()) .forward(sender.input_sender(), identity); - let game_handler = manager::HandleGameProcess::builder() - .detach_worker(()) + let game_page = pages::game::GamePage::builder() + .launch(()) .forward(sender.input_sender(), identity); + let about_page = pages::about::AboutPage::builder().launch(()); + MainWindow { game_state, setup_page, - game_handler, + game_page, + about_page, + current_page: Pages::GamePage, is_menu_visible: false, - is_game_running: false, } } } +#[derive(Debug, PartialEq, Eq)] +enum Pages { + GamePage, + AboutPage, +} + #[relm4::component(async)] impl SimpleAsyncComponent for MainWindow { type Input = MainWindowMsg; @@ -94,7 +104,7 @@ impl SimpleAsyncComponent for MainWindow { set_icon_name: "open-menu-symbolic", #[watch] - set_visible: model.game_state == GameState::GameInstalled, + set_visible: model.game_state.is_environment_ready(), connect_clicked => MainWindowMsg::ToggleMenuVisibility, }, @@ -109,37 +119,24 @@ impl SimpleAsyncComponent for MainWindow { #[watch] set_visible: model.game_state.is_environment_ready(), - adw::PreferencesPage { - add = &adw::PreferencesGroup { - gtk::Picture { - set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), - set_vexpand: true, - }, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, - gtk::Label { - set_label: "Babylonia Terminal", - set_margin_top: 24, - add_css_class: "title-1", - }, - }, + #[watch] + set_visible: model.current_page == Pages::GamePage, - add = &adw::PreferencesGroup { - set_margin_vertical: 48, + model.game_page.widget(), + }, - gtk::Button { - set_css_classes: &["suggested-action", "pill"], + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, - set_label: "Start game", - set_hexpand: false, - set_width_request: 200, + #[watch] + set_visible: model.current_page == Pages::AboutPage, - #[watch] - set_sensitive: !model.is_game_running, - connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { - sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); - }, - }, - }, + model.about_page.widget(), }, }, @@ -177,17 +174,23 @@ impl SimpleAsyncComponent for MainWindow { gtk::Button { set_margin_vertical: 5, - set_label: "Item 1", + set_label: "Game", + + connect_clicked => MainWindowMsg::SelectPage(Pages::GamePage), }, gtk::Button { set_margin_vertical: 5, - set_label: "Item 2" + set_label: "Settings", + + connect_clicked => MainWindowMsg::SelectPage(Pages::GamePage), }, gtk::Button { set_margin_vertical: 5, - set_label: "Item 3", + set_label: "About", + + connect_clicked => MainWindowMsg::SelectPage(Pages::AboutPage), }, }, }, @@ -245,8 +248,10 @@ impl SimpleAsyncComponent for MainWindow { async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { match message { MainWindowMsg::ToggleMenuVisibility => self.is_menu_visible = !self.is_menu_visible, - MainWindowMsg::SelectPage => println!("Tried to select a new page"), - MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, + MainWindowMsg::SelectPage(page) => { + self.current_page = page; + self.is_menu_visible = false; + } MainWindowMsg::UpdateGameState => { self.game_state = GameState::get_current_state().await.unwrap(); debug!( diff --git a/babylonia-terminal-gui/src/ui/pages/about.rs b/babylonia-terminal-gui/src/ui/pages/about.rs new file mode 100644 index 0000000..ec55615 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/about.rs @@ -0,0 +1,730 @@ +use libadwaita::prelude::PreferencesPageExt; +use relm4::{ + gtk::prelude::WidgetExt, + prelude::{adw, gtk, AsyncComponentParts, SimpleAsyncComponent}, +}; + +use crate::APP_RESOURCE_PATH; + +pub struct AboutPage; + +#[relm4::component(pub, async)] +impl SimpleAsyncComponent for AboutPage { + type Input = (); + + type Output = (); + + type Init = (); + + view! { + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + + gtk::Label { + set_label: "Made by ALEZ-DEV and the anime game community on Github", + set_margin_top: 24, + add_css_class: "title-3", + }, + + gtk::Label { + set_label: "This software was made under the GPL-3.0 license", + set_margin_top: 24, + add_css_class: "title-4", + }, + + gtk::Label { + set_label: r#" Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +."#, + + set_margin_top: 24, + set_css_classes: &["body", "monospace"], + }, + }, + }, + } + + async fn init( + _: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> relm4::prelude::AsyncComponentParts { + let model = AboutPage {}; + let widgets = view_output!(); + + AsyncComponentParts { model, widgets } + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/game.rs b/babylonia-terminal-gui/src/ui/pages/game.rs new file mode 100644 index 0000000..4de1f25 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/game.rs @@ -0,0 +1,95 @@ +use std::convert::identity; + +use libadwaita::prelude::PreferencesPageExt; +use relm4::{ + adw, + gtk::{ + self, + prelude::{ButtonExt, WidgetExt}, + }, + prelude::{AsyncComponentParts, SimpleAsyncComponent}, + Component, RelmWidgetExt, WorkerController, +}; + +use crate::{manager, ui::MainWindowMsg, APP_RESOURCE_PATH}; + +//use adw::prelude::*; +//use libadwaita as adw; + +pub struct GamePage { + game_handler: WorkerController, + is_game_running: bool, +} + +#[derive(Debug)] +pub enum GamePageMsg { + SetIsGameRunning(bool), +} + +#[relm4::component(pub, async)] +impl SimpleAsyncComponent for GamePage { + type Input = GamePageMsg; + + type Output = MainWindowMsg; + + type Init = (); + + view! { + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + set_width_request: 350, + }, + + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Start game", + set_hexpand: false, + set_width_request: 200, + + #[watch] + set_sensitive: !model.is_game_running, + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, + }, + }, + } + + async fn init( + _: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> relm4::prelude::AsyncComponentParts { + let model = GamePage { + game_handler: manager::HandleGameProcess::builder() + .detach_worker(()) + .forward(sender.input_sender(), identity), + is_game_running: false, + }; + + let widgets = view_output!(); + + AsyncComponentParts { model, widgets } + } + + async fn update(&mut self, message: Self::Input, _: relm4::AsyncComponentSender) -> () { + match message { + GamePageMsg::SetIsGameRunning(value) => self.is_game_running = value, + } + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/mod.rs b/babylonia-terminal-gui/src/ui/pages/mod.rs index f5a8b59..0bc3b99 100644 --- a/babylonia-terminal-gui/src/ui/pages/mod.rs +++ b/babylonia-terminal-gui/src/ui/pages/mod.rs @@ -1 +1,3 @@ +pub mod about; +pub mod game; pub mod steps; diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index d6b54d4..450eb24 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -238,15 +238,37 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_valign: gtk::Align::Center, set_vexpand: true, - set_visible: model.currently_installing != CurrentlyInstalling::Fonts && model.currently_installing != CurrentlyInstalling::Denpendecies, - gtk::ProgressBar { #[watch] set_fraction: model.fraction, + #[watch] + set_visible: model.currently_installing != CurrentlyInstalling::Fonts && model.currently_installing != CurrentlyInstalling::Denpendecies, + #[watch] set_text: Some(&model.progress_bar_message), set_show_text: true, + }, + + gtk::Box { + set_valign: gtk::Align::Center, + set_orientation: gtk::Orientation::Horizontal, + + gtk::Label { + #[watch] + set_visible: model.currently_installing == CurrentlyInstalling::Fonts || model.currently_installing == CurrentlyInstalling::Denpendecies, + + #[watch] + set_label: &model.progress_bar_message, + add_css_class: "title-3", + }, + + gtk::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.currently_installing == CurrentlyInstalling::Fonts || model.currently_installing == CurrentlyInstalling::Denpendecies, + } } } }, @@ -306,17 +328,24 @@ impl SimpleAsyncComponent for DownloadComponentsPage { self.downloaded_component_name = name; } DownloadComponentsMsg::UpdateProgressBar((current, max_progress)) => { - self.fraction = if current == 0 { - 0.0 - } else { - current as f64 / max_progress as f64 - }; + if self.currently_installing != CurrentlyInstalling::Fonts + && self.currently_installing != CurrentlyInstalling::Denpendecies + { + self.fraction = if current == 0 { + 0.0 + } else { + current as f64 / max_progress as f64 + }; - self.progress_bar_message = format!( - "Downloading {} : {:.2}%", - self.downloaded_component_name, - self.fraction * 100.0 - ); + self.progress_bar_message = format!( + "Downloading {} : {:.2}%", + self.downloaded_component_name, + self.fraction * 100.0 + ); + } else { + self.progress_bar_message = + format!("Downloading {}", self.downloaded_component_name); + } } DownloadComponentsMsg::UpdateProgressBarMsg(message, message_when_done) => { self.progress_bar_message = message; From ce50bf00e4713b09520fbcf928dc23efe706ac3b Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Fri, 14 Mar 2025 19:38:31 +0100 Subject: [PATCH 17/23] edited the about page --- babylonia-terminal-gui/src/ui/pages/about.rs | 250 ++++++++++--------- 1 file changed, 128 insertions(+), 122 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/pages/about.rs b/babylonia-terminal-gui/src/ui/pages/about.rs index ec55615..f52a1ef 100644 --- a/babylonia-terminal-gui/src/ui/pages/about.rs +++ b/babylonia-terminal-gui/src/ui/pages/about.rs @@ -1,7 +1,8 @@ -use libadwaita::prelude::PreferencesPageExt; +use libadwaita::prelude::{PreferencesPageExt, PreferencesRowExt}; use relm4::{ - gtk::prelude::WidgetExt, + gtk::prelude::{OrientableExt, WidgetExt}, prelude::{adw, gtk, AsyncComponentParts, SimpleAsyncComponent}, + RelmWidgetExt, }; use crate::APP_RESOURCE_PATH; @@ -17,37 +18,41 @@ impl SimpleAsyncComponent for AboutPage { type Init = (); view! { - adw::PreferencesPage { - add = &adw::PreferencesGroup { - gtk::Label { - set_label: "Babylonia Terminal", - set_margin_top: 24, - add_css_class: "title-1", - }, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, - gtk::Label { - set_label: "Made by ALEZ-DEV and the anime game community on Github", - set_margin_top: 24, - add_css_class: "title-3", - }, + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, - gtk::Label { - set_label: "This software was made under the GPL-3.0 license", - set_margin_top: 24, - add_css_class: "title-4", - }, + gtk::Label { + set_label: "Made by ALEZ-DEV and the anime game community on Github", + set_margin_top: 24, + add_css_class: "title-3", + }, - gtk::Label { - set_label: r#" Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + gtk::Label { + set_label: "This software was made under the GPL-3.0 license", + set_margin_vertical: 24, + add_css_class: "title-4", + }, + + gtk::Label { + set_justify: gtk::Justification::Fill, + set_label: r#"Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. Preamble - The GNU General Public License is a free, copyleft license for +The GNU General Public License is a free, copyleft license for software and other kinds of works. - The licenses for most software and other practical works are designed +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free @@ -56,35 +61,35 @@ GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - When we speak of free software, we are referring to freedom, not +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - To protect your rights, we need to prevent others from denying you +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - For example, if you distribute copies of such a program, whether +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - Developers that use the GNU GPL protect your rights with two steps: +Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - For the developers' and authors' protection, the GPL clearly explains +For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - Some devices are designed to deny users access to install or run +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic @@ -95,49 +100,49 @@ products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - Finally, every program is threatened constantly by software patents. +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - The precise terms and conditions for copying, distribution and +The precise terms and conditions for copying, distribution and modification follow. - TERMS AND CONDITIONS + TERMS AND CONDITIONS - 0. Definitions. +0. Definitions. - "This License" refers to version 3 of the GNU General Public License. +"This License" refers to version 3 of the GNU General Public License. - "Copyright" also means copyright-like laws that apply to other kinds of +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - "The Program" refers to any copyrightable work licensed under this +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. - To "modify" a work means to copy from or adapt all or part of the work +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. - A "covered work" means either the unmodified Program or a work based +A "covered work" means either the unmodified Program or a work based on the Program. - To "propagate" a work means to do anything with it that, without +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - To "convey" a work means any kind of propagation that enables other +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - An interactive user interface displays "Appropriate Legal Notices" +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the @@ -146,18 +151,18 @@ work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - 1. Source Code. +1. Source Code. - The "source code" for a work means the preferred form of the work +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. - A "Standard Interface" means an interface that either is an official +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - The "System Libraries" of an executable work include anything, other +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that @@ -168,7 +173,7 @@ implementation is available to the public in source code form. A (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - The "Corresponding Source" for a work in object code form means all +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's @@ -181,16 +186,16 @@ linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - The Corresponding Source need not include anything that users +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - The Corresponding Source for a work in source code form is that +The Corresponding Source for a work in source code form is that same work. - 2. Basic Permissions. +2. Basic Permissions. - All rights granted under this License are granted for the term of +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a @@ -198,7 +203,7 @@ covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - You may make, run and propagate covered works that you do not +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you @@ -209,19 +214,19 @@ for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - Conveying under any other circumstances is permitted solely under +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. +3. Protecting Users' Legal Rights From Anti-Circumvention Law. - No covered work shall be deemed part of an effective technological +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - When you convey a covered work, you waive any legal power to forbid +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or @@ -229,9 +234,9 @@ modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - 4. Conveying Verbatim Copies. +4. Conveying Verbatim Copies. - You may convey verbatim copies of the Program's source code as you +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any @@ -239,12 +244,12 @@ non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - You may charge any price or no price for each copy that you convey, +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - 5. Conveying Modified Source Versions. +5. Conveying Modified Source Versions. - You may convey a work based on the Program, or the modifications to +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @@ -269,7 +274,7 @@ terms of section 4, provided that you also meet all of these conditions: interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - A compilation of a covered work with other separate and independent +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an @@ -279,9 +284,9 @@ beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - 6. Conveying Non-Source Forms. +6. Conveying Non-Source Forms. - You may convey a covered work in object code form under the terms +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @@ -327,11 +332,11 @@ in one of these ways: Source of the work are being offered to the general public at no charge under subsection 6d. - A separable portion of the object code, whose source code is excluded +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - A "User Product" is either (1) a "consumer product", which means any +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, @@ -344,7 +349,7 @@ is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - "Installation Information" for a User Product means any methods, +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must @@ -352,7 +357,7 @@ suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - If you convey an object code work under this section in, or with, or +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a @@ -363,7 +368,7 @@ if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - The requirement to provide Installation Information does not include a +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a @@ -371,15 +376,15 @@ network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - Corresponding Source conveyed, and Installation Information provided, +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - 7. Additional Terms. +7. Additional Terms. - "Additional permissions" are terms that supplement the terms of this +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent @@ -388,14 +393,14 @@ apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - When you convey a copy of a covered work, you may at your option +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - Notwithstanding any other provision of this License, for material you +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @@ -422,7 +427,7 @@ that material) supplement the terms of this License with terms: any liability that these contractual assumptions directly impose on those licensors and authors. - All other non-permissive additional terms are considered "further +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further @@ -432,46 +437,46 @@ License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - If you add terms to a covered work in accord with this section, you +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - Additional terms, permissive or non-permissive, may be stated in the +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - 8. Termination. +8. Termination. - You may not propagate or modify a covered work except as expressly +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - However, if you cease all violation of this License, then your +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - Moreover, your license from a particular copyright holder is +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - Termination of your rights under this section does not terminate the +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - 9. Acceptance Not Required for Having Copies. +9. Acceptance Not Required for Having Copies. - You are not required to accept this License in order to receive or +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, @@ -480,14 +485,14 @@ modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - 10. Automatic Licensing of Downstream Recipients. +10. Automatic Licensing of Downstream Recipients. - Each time you convey a covered work, the recipient automatically +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - An "entity transaction" is a transaction transferring control of an +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that @@ -497,7 +502,7 @@ give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - You may not impose any further restrictions on the exercise of the +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation @@ -505,13 +510,13 @@ rights granted under this License, and you may not initiate litigation any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - 11. Patents. +11. Patents. - A "contributor" is a copyright holder who authorizes use under this +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - A contributor's "essential patent claims" are all patent claims +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, @@ -521,19 +526,19 @@ purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - Each contributor grants you a non-exclusive, worldwide, royalty-free +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - In the following three paragraphs, a "patent license" is any express +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - If you convey a covered work, knowingly relying on a patent license, +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, @@ -547,7 +552,7 @@ covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - If, pursuant to or in connection with a single transaction or +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify @@ -555,7 +560,7 @@ or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - A patent license is "discriminatory" if it does not include within +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered @@ -570,13 +575,13 @@ for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - Nothing in this License shall be construed as excluding or limiting +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - 12. No Surrender of Others' Freedom. +12. No Surrender of Others' Freedom. - If conditions are imposed on you (whether by court order, agreement or +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this @@ -586,9 +591,9 @@ to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - 13. Use with the GNU Affero General Public License. +13. Use with the GNU Affero General Public License. - Notwithstanding any other provision of this License, you have +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this @@ -597,14 +602,14 @@ but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - 14. Revised Versions of this License. +14. Revised Versions of this License. - The Free Software Foundation may publish revised and/or new versions of +The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - Each version is given a distinguishing version number. If the +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered @@ -613,19 +618,19 @@ Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - If the Program specifies that a proxy can decide which future +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - Later license versions may give you additional or different +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - 15. Disclaimer of Warranty. +15. Disclaimer of Warranty. - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, @@ -634,9 +639,9 @@ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. Limitation of Liability. +16. Limitation of Liability. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE @@ -646,24 +651,24 @@ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - 17. Interpretation of Sections 15 and 16. +17. Interpretation of Sections 15 and 16. - If the disclaimer of warranty and limitation of liability provided +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs - If you develop a new program, and you want it to be of the greatest +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - To do so, attach the following notices to the program. It is safest +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. @@ -686,7 +691,7 @@ the "copyright" line and a pointer to where the full notice is found. Also add information on how to contact you by electronic and paper mail. - If the program does terminal interaction, make it output a short +If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) @@ -698,23 +703,24 @@ The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". - You should also get your employer (if you work as a programmer) or school, +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - The GNU General Public License does not permit incorporating your program +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read ."#, - set_margin_top: 24, - set_css_classes: &["body", "monospace"], + set_margin_top: 24, + set_css_classes: &["body", "monospace"], + }, }, }, - }, + } } async fn init( From 1a6bb86cb56393b7a5f1efaeda8d7fc1f26747ba Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Fri, 14 Mar 2025 19:49:13 +0100 Subject: [PATCH 18/23] added the base for the settings page --- babylonia-terminal-gui/src/ui/mod.rs | 17 ++++++- babylonia-terminal-gui/src/ui/pages/mod.rs | 1 + .../src/ui/pages/settings.rs | 44 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 babylonia-terminal-gui/src/ui/pages/settings.rs diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 8a8752e..bd31372 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -38,6 +38,7 @@ struct MainWindow { game_state: GameState, setup_page: AsyncController, game_page: AsyncController, + settings_page: AsyncConnector, about_page: AsyncConnector, current_page: Pages, is_menu_visible: bool, @@ -55,10 +56,13 @@ impl MainWindow { let about_page = pages::about::AboutPage::builder().launch(()); + let settings_page = pages::settings::SettingsPage::builder().launch(()); + MainWindow { game_state, setup_page, game_page, + settings_page, about_page, current_page: Pages::GamePage, is_menu_visible: false, @@ -69,6 +73,7 @@ impl MainWindow { #[derive(Debug, PartialEq, Eq)] enum Pages { GamePage, + SettingsPage, AboutPage, } @@ -129,6 +134,16 @@ impl SimpleAsyncComponent for MainWindow { model.game_page.widget(), }, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, + + #[watch] + set_visible: model.current_page == Pages::SettingsPage, + + model.settings_page.widget(), + }, + gtk::Box { set_orientation: gtk::Orientation::Vertical, set_vexpand: true, @@ -183,7 +198,7 @@ impl SimpleAsyncComponent for MainWindow { set_margin_vertical: 5, set_label: "Settings", - connect_clicked => MainWindowMsg::SelectPage(Pages::GamePage), + connect_clicked => MainWindowMsg::SelectPage(Pages::SettingsPage), }, gtk::Button { diff --git a/babylonia-terminal-gui/src/ui/pages/mod.rs b/babylonia-terminal-gui/src/ui/pages/mod.rs index 0bc3b99..0e04382 100644 --- a/babylonia-terminal-gui/src/ui/pages/mod.rs +++ b/babylonia-terminal-gui/src/ui/pages/mod.rs @@ -1,3 +1,4 @@ pub mod about; pub mod game; +pub mod settings; pub mod steps; diff --git a/babylonia-terminal-gui/src/ui/pages/settings.rs b/babylonia-terminal-gui/src/ui/pages/settings.rs new file mode 100644 index 0000000..6fd6535 --- /dev/null +++ b/babylonia-terminal-gui/src/ui/pages/settings.rs @@ -0,0 +1,44 @@ +use relm4::{ + gtk::prelude::{OrientableExt, WidgetExt}, + prelude::{gtk, AsyncComponentParts, SimpleAsyncComponent}, +}; + +pub struct SettingsPage; + +#[relm4::component(pub, async)] +impl SimpleAsyncComponent for SettingsPage { + type Input = (); + + type Output = (); + + type Init = (); + + view! { + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + gtk::Label { + set_label: "This page is under construction!", + add_css_class: "title-1", + }, + + gtk::Label { + set_margin_top: 24, + + set_label: "Please wait patiently :)", + add_css_class: "title-4", + }, + } + } + + async fn init( + _: Self::Init, + root: Self::Root, + sender: relm4::AsyncComponentSender, + ) -> relm4::prelude::AsyncComponentParts { + let model = SettingsPage {}; + let widgets = view_output!(); + + AsyncComponentParts { model, widgets } + } +} From 80836f32ec449194f55766587ad4b6227424d1fb Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Fri, 14 Mar 2025 22:43:31 +0100 Subject: [PATCH 19/23] can now download the game --- babylonia-terminal-gui/src/manager.rs | 116 ++++++- babylonia-terminal-gui/src/ui/mod.rs | 4 +- babylonia-terminal-gui/src/ui/pages/game.rs | 305 ++++++++++++++++-- .../src/ui/pages/steps/download_components.rs | 3 +- 4 files changed, 391 insertions(+), 37 deletions(-) diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index bf9d919..78493d2 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -14,9 +14,12 @@ use wincompatlib::prelude::Proton; use crate::ui::{ self, - pages::steps::{ + pages::{ self, - download_components::{self, DownloadComponentsPageWidgets}, + steps::{ + self, + download_components::{self, DownloadComponentsPageWidgets}, + }, }, }; @@ -51,6 +54,7 @@ pub enum HandleGameProcessMsg { RunGame, } +#[derive(Debug)] pub struct HandleGameProcess; impl Worker for HandleGameProcess { @@ -81,6 +85,114 @@ impl Worker for HandleGameProcess { } } +#[derive(Debug)] +pub enum HandleGameInstallationMsg { + StartInstallation(Arc), + StartPatch, + StartUpdate(Arc), +} + +#[derive(Debug)] +pub struct HandleGameInstallation; + +impl Worker for HandleGameInstallation { + type Init = (); + + type Input = HandleGameInstallationMsg; + + type Output = pages::game::GamePageMsg; + + fn init(init: Self::Init, sender: relm4::ComponentSender) -> Self { + Self + } + + fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { + match message { + HandleGameInstallationMsg::StartInstallation(progress_bar) => { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + sender.output(pages::game::GamePageMsg::SetIsDownloading(true)); + + let game_dir = if let Some(dir) = GameConfig::get_config().await.game_dir { + dir + } else { + GameConfig::get_config_directory().await + }; + + if let Err(error) = GameManager::install_game(game_dir, progress_bar).await + { + sender.output(pages::game::GamePageMsg::ShowError(format!( + "Error while downloading the game : {}", + error + ))); + }; + + sender.output(pages::game::GamePageMsg::SetIsDownloading(false)); + }); + } + HandleGameInstallationMsg::StartPatch => { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + sender.output(pages::game::GamePageMsg::SetIsPatching(true)); + + let game_dir = if let Some(dir) = GameConfig::get_config().await.game_dir { + dir + } else { + GameConfig::get_config_directory().await + }; + + if let Err(error) = GameManager::patch_game(game_dir).await { + sender.output(pages::game::GamePageMsg::ShowError(format!( + "Error while patching the game : {}", + error + ))); + }; + + sender.output(pages::game::GamePageMsg::SetIsPatching(false)); + }); + } + HandleGameInstallationMsg::StartUpdate(progress_bar) => { + tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + sender.output(pages::game::GamePageMsg::SetIsDownloading(true)); + + if let Err(error) = GameManager::update_game().await { + sender.output(pages::game::GamePageMsg::ShowError(format!( + "Error while updating the game : {}", + error + ))); + }; + + let game_dir = if let Some(dir) = GameConfig::get_config().await.game_dir { + dir + } else { + GameConfig::get_config_directory().await + }; + + if let Err(error) = GameManager::install_game(game_dir, progress_bar).await + { + sender.output(pages::game::GamePageMsg::ShowError(format!( + "Error while updating the game : {}", + error + ))); + }; + + sender.output(pages::game::GamePageMsg::SetIsDownloading(true)); + }); + } + } + } +} + #[derive(Debug)] pub enum HandleComponentInstallationMsg { StartInstallation( diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index bd31372..041612c 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -4,6 +4,7 @@ use crate::{manager, IS_DEVEL}; use babylonia_terminal_sdk::game_state::GameState; use log::debug; +use pages::game::GamePageMsg; use relm4::{ self, component::AsyncConnector, @@ -51,7 +52,7 @@ impl MainWindow { .forward(sender.input_sender(), identity); let game_page = pages::game::GamePage::builder() - .launch(()) + .launch(game_state.clone()) .forward(sender.input_sender(), identity); let about_page = pages::about::AboutPage::builder().launch(()); @@ -269,6 +270,7 @@ impl SimpleAsyncComponent for MainWindow { } MainWindowMsg::UpdateGameState => { self.game_state = GameState::get_current_state().await.unwrap(); + self.game_page.sender().send(GamePageMsg::UpdateGameState); debug!( "is_environment_ready : {}", self.game_state.is_environment_ready() diff --git a/babylonia-terminal-gui/src/ui/pages/game.rs b/babylonia-terminal-gui/src/ui/pages/game.rs index 4de1f25..7fffdcc 100644 --- a/babylonia-terminal-gui/src/ui/pages/game.rs +++ b/babylonia-terminal-gui/src/ui/pages/game.rs @@ -1,29 +1,46 @@ -use std::convert::identity; +use std::{convert::identity, fmt::format}; -use libadwaita::prelude::PreferencesPageExt; +use arboard::Clipboard; +use babylonia_terminal_sdk::game_state::GameState; +use libadwaita::prelude::{MessageDialogExt, PreferencesPageExt}; +use log::error; use relm4::{ adw, gtk::{ self, - prelude::{ButtonExt, WidgetExt}, + prelude::{ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, }, prelude::{AsyncComponentParts, SimpleAsyncComponent}, Component, RelmWidgetExt, WorkerController, }; -use crate::{manager, ui::MainWindowMsg, APP_RESOURCE_PATH}; - -//use adw::prelude::*; -//use libadwaita as adw; +use crate::{ + manager, + ui::{MainWindowMsg, MAIN_WINDOW}, + APP_RESOURCE_PATH, +}; +#[derive(Debug)] pub struct GamePage { + game_state: GameState, game_handler: WorkerController, + installation_handler: WorkerController, is_game_running: bool, + is_downloading: bool, + is_patching: bool, + progress_bar_reporter: std::sync::Arc, + progress_bar_message: String, + fraction: f64, } #[derive(Debug)] pub enum GamePageMsg { SetIsGameRunning(bool), + SetIsDownloading(bool), + SetIsPatching(bool), + UpdateGameState, + UpdateProgressBar(u64, u64), + ShowError(String), } #[relm4::component(pub, async)] @@ -32,54 +49,186 @@ impl SimpleAsyncComponent for GamePage { type Output = MainWindowMsg; - type Init = (); + type Init = GameState; view! { - adw::PreferencesPage { - add = &adw::PreferencesGroup { - gtk::Picture { - set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), - set_vexpand: true, - set_width_request: 350, + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + set_width_request: 350, + }, + + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, }, - gtk::Label { - set_label: "Babylonia Terminal", - set_margin_top: 24, - add_css_class: "title-1", - }, - }, + add = &adw::PreferencesGroup { + set_margin_vertical: 48, - add = &adw::PreferencesGroup { - set_margin_vertical: 48, + gtk::Button { + set_css_classes: &["suggested-action", "pill"], - gtk::Button { - set_css_classes: &["suggested-action", "pill"], + set_label: "Install", + set_hexpand: false, + set_width_request: 200, - set_label: "Start game", - set_hexpand: false, - set_width_request: 200, + set_visible: model.game_state == GameState::GameNotInstalled, - #[watch] - set_sensitive: !model.is_game_running, - connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { - sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + #[watch] + set_sensitive: !model.is_downloading, + connect_clicked[sender = model.installation_handler.sender().clone(), progress_bar = model.progress_bar_reporter.clone()] => move |_| { + sender.send(manager::HandleGameInstallationMsg::StartInstallation(progress_bar.clone())).unwrap(); + }, + }, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Apply patch", + set_hexpand: false, + set_width_request: 200, + + set_visible: model.game_state == GameState::GameNotPatched, + + #[watch] + set_sensitive: !model.is_patching, + connect_clicked[sender = model.installation_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameInstallationMsg::StartPatch).unwrap(); + }, + }, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Start game", + set_hexpand: false, + set_width_request: 200, + + set_visible: model.game_state == GameState::GameInstalled, + + #[watch] + set_sensitive: !model.is_game_running, + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Update", + set_hexpand: false, + set_width_request: 200, + + set_visible: model.game_state == GameState::GameNeedUpdate, + + #[watch] + set_sensitive: !model.is_downloading, + connect_clicked[sender = model.installation_handler.sender().clone(), progress_bar = model.progress_bar_reporter.clone()] => move |_| { + sender.send(manager::HandleGameInstallationMsg::StartUpdate(progress_bar.clone())).unwrap(); + }, }, }, }, - }, + + gtk::ProgressBar { + #[watch] + set_fraction: model.fraction, + + #[watch] + set_visible: (model.game_state == GameState::GameNotInstalled || model.game_state == GameState::GameNeedUpdate) && model.is_downloading && model.fraction != 0.0, + + #[watch] + set_text: Some(&model.progress_bar_message), + set_show_text: true, + }, + + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + #[watch] + set_visible: (model.game_state == GameState::GameNotInstalled || model.game_state == GameState::GameNeedUpdate) && model.is_downloading && model.fraction == 0.0, + + gtk::Box { + set_orientation: gtk::Orientation::Horizontal, + set_halign: gtk::Align::Center, + set_margin_bottom: 24, + + gtk::Label { + set_label: "Checking game files", + + add_css_class: "title-2", + }, + + gtk::Spinner { + set_spinning: true, + set_margin_start: 24, + } + }, + + gtk::Label { + set_label: "This can take some time, please wait...", + + add_css_class: "title-4", + }, + }, + + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + + #[watch] + set_visible: model.game_state == GameState::GameNotPatched && model.is_patching, + + gtk::Box { + set_orientation: gtk::Orientation::Horizontal, + + gtk::Label { + set_label: "Patching game", + + add_css_class: "title-2", + }, + + gtk::Spinner { + set_spinning: true, + } + }, + + gtk::Label { + set_label: "This can take some time, please wait...", + + add_css_class: "title-4", + }, + } + } } async fn init( - _: Self::Init, + game_state: Self::Init, root: Self::Root, sender: relm4::AsyncComponentSender, ) -> relm4::prelude::AsyncComponentParts { let model = GamePage { + progress_bar_reporter: ProgressBarGameInstallationReporter::create(sender.clone()), + game_state, game_handler: manager::HandleGameProcess::builder() .detach_worker(()) .forward(sender.input_sender(), identity), + installation_handler: manager::HandleGameInstallation::builder() + .detach_worker(()) + .forward(sender.input_sender(), identity), is_game_running: false, + is_downloading: false, + is_patching: false, + fraction: 0.0, + progress_bar_message: String::new(), }; let widgets = view_output!(); @@ -90,6 +239,96 @@ impl SimpleAsyncComponent for GamePage { async fn update(&mut self, message: Self::Input, _: relm4::AsyncComponentSender) -> () { match message { GamePageMsg::SetIsGameRunning(value) => self.is_game_running = value, + GamePageMsg::SetIsDownloading(value) => self.is_downloading = value, + GamePageMsg::SetIsPatching(value) => self.is_patching = value, + GamePageMsg::UpdateGameState => { + self.game_state = GameState::get_current_state().await.unwrap() + } //TODO: remove unwrap() + GamePageMsg::UpdateProgressBar(current, max_progress) => { + self.fraction = if current == 0 { + 0.0 + } else { + current as f64 / max_progress as f64 + }; + + //1024^3 = 1073741824 + let current_gb = current as f64 / 1073741824 as f64; + let max_gb = max_progress as f64 / 1073741824 as f64; + + self.progress_bar_message = format!( + "Downloading : {:.2}% ({:.2} / {:.2}GiB)", + self.fraction * 100 as f64, + current_gb, + max_gb, + ); + } + GamePageMsg::ShowError(message) => { + let dialog = unsafe { + adw::MessageDialog::new( + MAIN_WINDOW.as_ref(), + Some("Something went wrong"), + Some(&message), + ) + }; + + dialog.add_response("close", "Close"); + dialog.add_response("copy", "Copy"); + + dialog.set_response_appearance("copy", adw::ResponseAppearance::Suggested); + + dialog.connect_response(Some("copy"), move |_, _| { + if let Err(err) = Clipboard::new().unwrap().set_text(&message.clone()) { + error!("Failed to copy the error to the clipboard : {}", err); + } + }); + + dialog.present(); + } } } } + +#[derive(Debug)] +struct ProgressBarGameInstallationReporterPrivate { + max_progress: Option, +} + +#[derive(Debug)] +pub struct ProgressBarGameInstallationReporter { + private: std::sync::Mutex>, + sender: relm4::AsyncComponentSender, +} + +impl ProgressBarGameInstallationReporter { + fn create(page: relm4::AsyncComponentSender) -> std::sync::Arc { + std::sync::Arc::new(Self { + private: std::sync::Mutex::new(None), + sender: page, + }) + } +} + +impl downloader::progress::Reporter for ProgressBarGameInstallationReporter { + fn setup(&self, max_progress: Option, message: &str) { + let private = ProgressBarGameInstallationReporterPrivate { max_progress }; + + let mut guard = self.private.lock().unwrap(); + *guard = Some(private); + } + + fn progress(&self, current: u64) { + if let Some(p) = self.private.lock().unwrap().as_mut() { + self.sender.input(GamePageMsg::UpdateProgressBar( + current, + p.max_progress.unwrap(), + )); + } + } + + fn set_message(&self, _: &str) {} + + fn done(&self) { + let mut guard = self.private.lock().unwrap(); + *guard = None; + } +} diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index 450eb24..860d621 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -251,7 +251,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { }, gtk::Box { - set_valign: gtk::Align::Center, + set_halign: gtk::Align::Center, set_orientation: gtk::Orientation::Horizontal, gtk::Label { @@ -265,6 +265,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { gtk::Spinner { set_spinning: true, + set_margin_start: 24, #[watch] set_visible: model.currently_installing == CurrentlyInstalling::Fonts || model.currently_installing == CurrentlyInstalling::Denpendecies, From c70feada75001af44325349d96454c5edcd5f109 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 17 Mar 2025 20:37:05 +0100 Subject: [PATCH 20/23] fix: game state was not updated --- babylonia-terminal-gui/src/manager.rs | 20 +++++++++++++++----- babylonia-terminal-gui/src/ui/pages/game.rs | 4 ++++ babylonia-terminal-sdk/src/game_manager.rs | 16 +++++++--------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/babylonia-terminal-gui/src/manager.rs b/babylonia-terminal-gui/src/manager.rs index 78493d2..8c8b363 100644 --- a/babylonia-terminal-gui/src/manager.rs +++ b/babylonia-terminal-gui/src/manager.rs @@ -39,14 +39,16 @@ pub async fn get_proton() -> Proton { .clone() } -pub async fn run_game() { +pub async fn run_game() -> anyhow::Result<()> { let proton = get_proton().await; - let game_dir = GameConfig::get_game_dir().await; + let game_dir = GameConfig::get_config().await.game_dir; if game_dir.is_none() { - error!("Failed to start game, the game directory was not found") + anyhow::bail!("Failed to start game, the game directory was not found"); } - GameManager::start_game(&proton, game_dir.unwrap(), None, false).await; + GameManager::start_game(&proton, game_dir.unwrap(), None, false).await?; + + Ok(()) } #[derive(Debug)] @@ -77,7 +79,12 @@ impl Worker for HandleGameProcess { .unwrap() .block_on(async { sender.output(ui::pages::game::GamePageMsg::SetIsGameRunning(true)); - run_game().await; + if let Err(error) = run_game().await { + sender.output(pages::game::GamePageMsg::ShowError(format!( + "Unable to start game : {}", + error + ))); + }; sender.output(ui::pages::game::GamePageMsg::SetIsGameRunning(false)); }); } @@ -131,6 +138,7 @@ impl Worker for HandleGameInstallation { }; sender.output(pages::game::GamePageMsg::SetIsDownloading(false)); + sender.output(pages::game::GamePageMsg::UpdateGameState); }); } HandleGameInstallationMsg::StartPatch => { @@ -155,6 +163,7 @@ impl Worker for HandleGameInstallation { }; sender.output(pages::game::GamePageMsg::SetIsPatching(false)); + sender.output(pages::game::GamePageMsg::UpdateGameState); }); } HandleGameInstallationMsg::StartUpdate(progress_bar) => { @@ -187,6 +196,7 @@ impl Worker for HandleGameInstallation { }; sender.output(pages::game::GamePageMsg::SetIsDownloading(true)); + sender.output(pages::game::GamePageMsg::UpdateGameState); }); } } diff --git a/babylonia-terminal-gui/src/ui/pages/game.rs b/babylonia-terminal-gui/src/ui/pages/game.rs index 7fffdcc..9c60aaf 100644 --- a/babylonia-terminal-gui/src/ui/pages/game.rs +++ b/babylonia-terminal-gui/src/ui/pages/game.rs @@ -80,6 +80,7 @@ impl SimpleAsyncComponent for GamePage { set_hexpand: false, set_width_request: 200, + #[watch] set_visible: model.game_state == GameState::GameNotInstalled, #[watch] @@ -96,6 +97,7 @@ impl SimpleAsyncComponent for GamePage { set_hexpand: false, set_width_request: 200, + #[watch] set_visible: model.game_state == GameState::GameNotPatched, #[watch] @@ -112,6 +114,7 @@ impl SimpleAsyncComponent for GamePage { set_hexpand: false, set_width_request: 200, + #[watch] set_visible: model.game_state == GameState::GameInstalled, #[watch] @@ -189,6 +192,7 @@ impl SimpleAsyncComponent for GamePage { gtk::Box { set_orientation: gtk::Orientation::Horizontal, + set_halign: gtk::Align::Center, gtk::Label { set_label: "Patching game", diff --git a/babylonia-terminal-sdk/src/game_manager.rs b/babylonia-terminal-sdk/src/game_manager.rs index 806bce2..818592a 100644 --- a/babylonia-terminal-sdk/src/game_manager.rs +++ b/babylonia-terminal-sdk/src/game_manager.rs @@ -153,8 +153,8 @@ impl GameManager { game_dir: PathBuf, options: Option, show_logs: bool, - ) { - let proton_version = proton.wine().version().unwrap(); + ) -> anyhow::Result<()> { + let proton_version = proton.wine().version()?; let binary_path = game_dir .join(get_game_name()) .join(get_game_name_with_executable()); @@ -162,16 +162,12 @@ impl GameManager { debug!("Wine version : {:?}", proton_version); let mut child = if let Some(custom_command) = options { - Self::run(proton, binary_path, Some(custom_command)) - .await - .unwrap() + Self::run(proton, binary_path, Some(custom_command)).await? } else { if let Some(custom_command) = GameConfig::get_launch_options().await.unwrap() { - Self::run(proton, binary_path, Some(custom_command)) - .await - .unwrap() + Self::run(proton, binary_path, Some(custom_command)).await? } else { - Self::run(proton, binary_path, None).await.unwrap() + Self::run(proton, binary_path, None).await? } }; @@ -274,6 +270,8 @@ impl GameManager { .write_all(to_write) .await .expect("Failed to write the output to the log file"); + + Ok(()) } async fn run( From cde2c99e2d8e2b027b75062eb8aa0c5c2146d9ab Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 7 Apr 2025 17:58:50 +0200 Subject: [PATCH 21/23] now able to change the launch option --- babylonia-terminal-gui/src/ui/pages/game.rs | 1 + .../src/ui/pages/settings.rs | 104 +++++++++++++++--- 2 files changed, 92 insertions(+), 13 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/pages/game.rs b/babylonia-terminal-gui/src/ui/pages/game.rs index 9c60aaf..48743f0 100644 --- a/babylonia-terminal-gui/src/ui/pages/game.rs +++ b/babylonia-terminal-gui/src/ui/pages/game.rs @@ -131,6 +131,7 @@ impl SimpleAsyncComponent for GamePage { set_hexpand: false, set_width_request: 200, + #[watch] set_visible: model.game_state == GameState::GameNeedUpdate, #[watch] diff --git a/babylonia-terminal-gui/src/ui/pages/settings.rs b/babylonia-terminal-gui/src/ui/pages/settings.rs index 6fd6535..46a8405 100644 --- a/babylonia-terminal-gui/src/ui/pages/settings.rs +++ b/babylonia-terminal-gui/src/ui/pages/settings.rs @@ -1,13 +1,36 @@ +use arboard::Clipboard; +use babylonia_terminal_sdk::game_config::GameConfig; +use log::error; use relm4::{ - gtk::prelude::{OrientableExt, WidgetExt}, + gtk::{ + prelude::{EditableExt, GtkWindowExt, OrientableExt, WidgetExt}, + InputHints, + }, prelude::{gtk, AsyncComponentParts, SimpleAsyncComponent}, }; -pub struct SettingsPage; +use libadwaita::{ + self as adw, + prelude::{ + EntryRowExt, MessageDialogExt, PreferencesGroupExt, PreferencesPageExt, PreferencesRowExt, + }, +}; + +use crate::ui::MAIN_WINDOW; + +#[derive(Debug)] +pub enum SettingsPageMsg { + UpdateLaunchOption(Option), + ShowError(String), +} + +pub struct SettingsPage { + launch_option: String, +} #[relm4::component(pub, async)] impl SimpleAsyncComponent for SettingsPage { - type Input = (); + type Input = SettingsPageMsg; type Output = (); @@ -17,17 +40,29 @@ impl SimpleAsyncComponent for SettingsPage { gtk::Box { set_orientation: gtk::Orientation::Vertical, - gtk::Label { - set_label: "This page is under construction!", - add_css_class: "title-1", - }, + adw::PreferencesPage { + set_title: "General settings", - gtk::Label { - set_margin_top: 24, + add = &adw::PreferencesGroup { + set_width_request: 500, + set_title: "Launch option", + set_description: Some("Pass launch options to tinker the behavior of the game"), - set_label: "Please wait patiently :)", - add_css_class: "title-4", - }, + adw::EntryRow { + set_title: "%command%", + set_text: &model.launch_option, + + connect_changed[sender] => move |entry| { + let command = entry.text().trim().to_string(); + if command.is_empty() { + sender.input(SettingsPageMsg::UpdateLaunchOption(None)) + } else { + sender.input(SettingsPageMsg::UpdateLaunchOption(Some(command))) + } + } + } + } + } } } @@ -36,9 +71,52 @@ impl SimpleAsyncComponent for SettingsPage { root: Self::Root, sender: relm4::AsyncComponentSender, ) -> relm4::prelude::AsyncComponentParts { - let model = SettingsPage {}; + let launch_option = match GameConfig::get_launch_options().await { + Err(e) => String::new(), + Ok(v) => match v { + None => String::new(), + Some(launch) => launch, + }, + }; + + let model = SettingsPage { launch_option }; let widgets = view_output!(); AsyncComponentParts { model, widgets } } + + async fn update(&mut self, message: Self::Input, sender: relm4::AsyncComponentSender) { + match message { + SettingsPageMsg::UpdateLaunchOption(new_launch_option) => { + if let Err(e) = GameConfig::set_launch_options(new_launch_option).await { + sender.input(SettingsPageMsg::ShowError(format!( + "Something went wrong when updated the launch options : {}", + e + ))); + } + } + SettingsPageMsg::ShowError(message) => { + let dialog = unsafe { + adw::MessageDialog::new( + MAIN_WINDOW.as_ref(), + Some("Something went wrong"), + Some(&message), + ) + }; + + dialog.add_response("close", "Close"); + dialog.add_response("copy", "Copy"); + + dialog.set_response_appearance("copy", adw::ResponseAppearance::Suggested); + + dialog.connect_response(Some("copy"), move |_, _| { + if let Err(err) = Clipboard::new().unwrap().set_text(&message.clone()) { + error!("Failed to copy the error to the clipboard : {}", err); + } + }); + + dialog.present(); + } + } + } } From 2d9fac062a8d799cdbd42120a548a572a4280898 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 7 Apr 2025 18:25:31 +0200 Subject: [PATCH 22/23] some correction --- .../ui/pages/steps/choose_game_directory.rs | 1 + .../src/ui/pages/steps/download_components.rs | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs b/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs index cbb531e..cdaf695 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/choose_game_directory.rs @@ -47,6 +47,7 @@ impl SimpleAsyncComponent for ChooseGameDirectoryPage { }, add = &adw::PreferencesGroup { + set_width_request: 500, set_valign: gtk::Align::Center, set_vexpand: true, diff --git a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs index 860d621..2adc9c3 100644 --- a/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs +++ b/babylonia-terminal-gui/src/ui/pages/steps/download_components.rs @@ -6,6 +6,7 @@ use babylonia_terminal_sdk::{ dxvk_component::{self, DXVKComponent}, proton_component::{self, ProtonComponent}, }, + game_config::GameConfig, game_state::GameState, utils::{ github_requester::{GithubRelease, GithubRequester}, @@ -60,6 +61,7 @@ pub struct DownloadComponentsPage { dxvk_versions: Vec, selected_proton_version: Option, selected_dxvk_version: Option, + game_config: GameConfig, //progress_bar progress_bar_reporter: std::sync::Arc, @@ -101,6 +103,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { }, add = &adw::PreferencesGroup { + set_width_request: 500, set_valign: gtk::Align::Center, set_vexpand: true, @@ -150,6 +153,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_visible: model.currently_installing != CurrentlyInstalling::None, add = &adw::PreferencesGroup { + set_width_request: 500, set_valign: gtk::Align::Center, set_vexpand: true, @@ -172,7 +176,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { }, #[watch] - set_icon_name: if model.currently_installing == CurrentlyInstalling::Proton { Some("process-working") } else { Some("emblem-ok-symbolic") }, + set_icon_name: if model.currently_installing != CurrentlyInstalling::Proton && model.game_config.is_wine_installed { Some("emblem-ok-symbolic") } else { None }, add_prefix = >k::Spinner { set_spinning: true, @@ -191,7 +195,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { }, #[watch] - set_icon_name: if model.currently_installing == CurrentlyInstalling::DXVK { Some("process-working") } else { Some("emblem-ok-symbolic") }, + set_icon_name: if model.currently_installing != CurrentlyInstalling::DXVK && model.game_config.is_dxvk_installed { Some("emblem-ok-symbolic") } else { None }, add_prefix = >k::Spinner { set_spinning: true, @@ -207,7 +211,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { set_subtitle: "Arial", #[watch] - set_icon_name: if model.currently_installing == CurrentlyInstalling::Fonts { Some("process-working") } else { Some("emblem-ok-symbolic") }, + set_icon_name: if model.currently_installing != CurrentlyInstalling::Fonts && model.game_config.is_font_installed { Some("emblem-ok-symbolic") } else { None }, add_prefix = >k::Spinner { set_spinning: true, @@ -219,11 +223,11 @@ impl SimpleAsyncComponent for DownloadComponentsPage { adw::ActionRow { #[watch] - set_title: "vcrun2022", - set_subtitle: "Denpendecies", + set_title: "Denpendecies", + set_subtitle: "vcrun2022", #[watch] - set_icon_name: if model.currently_installing == CurrentlyInstalling::Denpendecies { Some("process-working") } else { Some("emblem-ok-symbolic") }, + set_icon_name: if model.currently_installing != CurrentlyInstalling::Denpendecies && model.game_config.is_dependecies_installed { Some("emblem-ok-symbolic") } else { None }, add_prefix = >k::Spinner { set_spinning: true, @@ -301,6 +305,7 @@ impl SimpleAsyncComponent for DownloadComponentsPage { dxvk_versions: dxvk_releases, selected_proton_version: None, selected_dxvk_version: None, + game_config: GameConfig::get_config().await, progress_bar_reporter: DownloadComponentProgressBarReporter::create(sender.clone()), progress_bar_message: String::new(), @@ -358,6 +363,8 @@ impl SimpleAsyncComponent for DownloadComponentsPage { } } DownloadComponentsMsg::UpdateCurrentlyInstalling(currently_installing) => { + self.game_config = GameConfig::get_config().await; + self.currently_installing = currently_installing; } DownloadComponentsMsg::ShowError(message) => { From 9059ce0cf12bd8cf722888ea423eaff6f68f4069 Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Mon, 7 Apr 2025 18:40:10 +0200 Subject: [PATCH 23/23] some refactor --- babylonia-terminal-sdk/src/game_manager.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/babylonia-terminal-sdk/src/game_manager.rs b/babylonia-terminal-sdk/src/game_manager.rs index 818592a..296fe15 100644 --- a/babylonia-terminal-sdk/src/game_manager.rs +++ b/babylonia-terminal-sdk/src/game_manager.rs @@ -278,7 +278,7 @@ impl GameManager { proton: &Proton, binary_path: PathBuf, custom_command: Option, - ) -> Result { + ) -> anyhow::Result> { let mut command: Vec<&str> = vec![]; let proton_path = GameConfig::get_config_directory() @@ -298,10 +298,11 @@ impl GameManager { let tokens: Vec<&str> = launch_option.split_whitespace().collect(); // position of the %command% - let index = tokens - .iter() - .position(|&s| s == "%command%") - .expect("You forget to put %command% in your custom launch command"); + let index = if let Some(v) = tokens.iter().position(|&s| s == "%command%") { + v + } else { + anyhow::bail!("You forget to put %command% in your custom launch command"); + }; let start_command = tokens[0..index].to_vec(); let mut end_command = tokens[(index + 1)..tokens.len()].to_vec(); @@ -316,14 +317,14 @@ impl GameManager { debug!("Command preview -> {}", command.join(" ")); - Command::new(command[0]) + Ok(Command::new(command[0]) .args(&command[1..command.len()]) .envs(proton.get_envs()) .env("PROTON_LOG", "1") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) - .spawn() + .spawn()) } }