├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── Makefile ├── Readme.md ├── rustfmt.toml ├── src ├── cli.rs ├── consts.rs ├── generated.rs ├── input.rs ├── main.rs ├── model.rs ├── template_builder.rs └── util.rs ├── template ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── build.rs ├── icons │ ├── app-icon.png │ └── icon.png ├── rustfmt.toml ├── src │ ├── app_config.rs │ ├── app_data.rs │ ├── app_menu.rs │ ├── builder.rs │ ├── generated.rs │ ├── main.rs │ ├── script.js │ └── util.rs └── tauri.conf.json └── watch.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /build 3 | .idea 4 | .DS_Store 5 | .vscode/ 6 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "base64" 7 | version = "0.20.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" 10 | 11 | [[package]] 12 | name = "bitflags" 13 | version = "1.3.2" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 16 | 17 | [[package]] 18 | name = "cc" 19 | version = "1.0.78" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" 22 | 23 | [[package]] 24 | name = "clap" 25 | version = "4.1.1" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "4ec7a4128863c188deefe750ac1d1dfe66c236909f845af04beed823638dc1b2" 28 | dependencies = [ 29 | "bitflags", 30 | "clap_derive", 31 | "clap_lex", 32 | "is-terminal", 33 | "once_cell", 34 | "strsim", 35 | "termcolor", 36 | ] 37 | 38 | [[package]] 39 | name = "clap_derive" 40 | version = "4.1.0" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" 43 | dependencies = [ 44 | "heck", 45 | "proc-macro-error", 46 | "proc-macro2", 47 | "quote", 48 | "syn", 49 | ] 50 | 51 | [[package]] 52 | name = "clap_lex" 53 | version = "0.3.1" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" 56 | dependencies = [ 57 | "os_str_bytes", 58 | ] 59 | 60 | [[package]] 61 | name = "errno" 62 | version = "0.2.8" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 65 | dependencies = [ 66 | "errno-dragonfly", 67 | "libc", 68 | "winapi", 69 | ] 70 | 71 | [[package]] 72 | name = "errno-dragonfly" 73 | version = "0.1.2" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 76 | dependencies = [ 77 | "cc", 78 | "libc", 79 | ] 80 | 81 | [[package]] 82 | name = "heck" 83 | version = "0.4.0" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 86 | 87 | [[package]] 88 | name = "hermit-abi" 89 | version = "0.2.6" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 92 | dependencies = [ 93 | "libc", 94 | ] 95 | 96 | [[package]] 97 | name = "home" 98 | version = "0.5.4" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" 101 | dependencies = [ 102 | "winapi", 103 | ] 104 | 105 | [[package]] 106 | name = "io-lifetimes" 107 | version = "1.0.4" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" 110 | dependencies = [ 111 | "libc", 112 | "windows-sys", 113 | ] 114 | 115 | [[package]] 116 | name = "is-terminal" 117 | version = "0.4.2" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" 120 | dependencies = [ 121 | "hermit-abi", 122 | "io-lifetimes", 123 | "rustix", 124 | "windows-sys", 125 | ] 126 | 127 | [[package]] 128 | name = "libc" 129 | version = "0.2.139" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" 132 | 133 | [[package]] 134 | name = "linux-raw-sys" 135 | version = "0.1.4" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 138 | 139 | [[package]] 140 | name = "once_cell" 141 | version = "1.17.0" 142 | source = "registry+https://github.com/rust-lang/crates.io-index" 143 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 144 | 145 | [[package]] 146 | name = "os_str_bytes" 147 | version = "6.4.1" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" 150 | 151 | [[package]] 152 | name = "proc-macro-error" 153 | version = "1.0.4" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 156 | dependencies = [ 157 | "proc-macro-error-attr", 158 | "proc-macro2", 159 | "quote", 160 | "syn", 161 | "version_check", 162 | ] 163 | 164 | [[package]] 165 | name = "proc-macro-error-attr" 166 | version = "1.0.4" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 169 | dependencies = [ 170 | "proc-macro2", 171 | "quote", 172 | "version_check", 173 | ] 174 | 175 | [[package]] 176 | name = "proc-macro2" 177 | version = "1.0.54" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" 180 | dependencies = [ 181 | "unicode-ident", 182 | ] 183 | 184 | [[package]] 185 | name = "quote" 186 | version = "1.0.26" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" 189 | dependencies = [ 190 | "proc-macro2", 191 | ] 192 | 193 | [[package]] 194 | name = "rustix" 195 | version = "0.36.6" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" 198 | dependencies = [ 199 | "bitflags", 200 | "errno", 201 | "io-lifetimes", 202 | "libc", 203 | "linux-raw-sys", 204 | "windows-sys", 205 | ] 206 | 207 | [[package]] 208 | name = "strsim" 209 | version = "0.10.0" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 212 | 213 | [[package]] 214 | name = "syn" 215 | version = "1.0.107" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 218 | dependencies = [ 219 | "proc-macro2", 220 | "quote", 221 | "unicode-ident", 222 | ] 223 | 224 | [[package]] 225 | name = "termcolor" 226 | version = "1.1.3" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 229 | dependencies = [ 230 | "winapi-util", 231 | ] 232 | 233 | [[package]] 234 | name = "unicode-ident" 235 | version = "1.0.6" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 238 | 239 | [[package]] 240 | name = "version_check" 241 | version = "0.9.4" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 244 | 245 | [[package]] 246 | name = "web2app" 247 | version = "0.2.12" 248 | dependencies = [ 249 | "base64", 250 | "clap", 251 | "home", 252 | ] 253 | 254 | [[package]] 255 | name = "winapi" 256 | version = "0.3.9" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 259 | dependencies = [ 260 | "winapi-i686-pc-windows-gnu", 261 | "winapi-x86_64-pc-windows-gnu", 262 | ] 263 | 264 | [[package]] 265 | name = "winapi-i686-pc-windows-gnu" 266 | version = "0.4.0" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 269 | 270 | [[package]] 271 | name = "winapi-util" 272 | version = "0.1.5" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 275 | dependencies = [ 276 | "winapi", 277 | ] 278 | 279 | [[package]] 280 | name = "winapi-x86_64-pc-windows-gnu" 281 | version = "0.4.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 284 | 285 | [[package]] 286 | name = "windows-sys" 287 | version = "0.42.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 290 | dependencies = [ 291 | "windows_aarch64_gnullvm", 292 | "windows_aarch64_msvc", 293 | "windows_i686_gnu", 294 | "windows_i686_msvc", 295 | "windows_x86_64_gnu", 296 | "windows_x86_64_gnullvm", 297 | "windows_x86_64_msvc", 298 | ] 299 | 300 | [[package]] 301 | name = "windows_aarch64_gnullvm" 302 | version = "0.42.2" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 305 | 306 | [[package]] 307 | name = "windows_aarch64_msvc" 308 | version = "0.42.2" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 311 | 312 | [[package]] 313 | name = "windows_i686_gnu" 314 | version = "0.42.2" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 317 | 318 | [[package]] 319 | name = "windows_i686_msvc" 320 | version = "0.42.2" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 323 | 324 | [[package]] 325 | name = "windows_x86_64_gnu" 326 | version = "0.42.2" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 329 | 330 | [[package]] 331 | name = "windows_x86_64_gnullvm" 332 | version = "0.42.2" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 335 | 336 | [[package]] 337 | name = "windows_x86_64_msvc" 338 | version = "0.42.2" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 341 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "web2app" 3 | description = "Turn any web page into a desktop app (but, lightweight ~3MB)" 4 | version = "0.2.12" 5 | edition = "2021" 6 | license = "MIT" 7 | 8 | [dependencies] 9 | home = "0.5.4" 10 | base64 = "0.20.0" 11 | clap = { version = "4.1.1", features = ["derive"]} 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Do whatever you want. But just pray for me at least once. :) 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | run_template: 2 | @cd template; RUST_BACKTRACE=1 cargo tauri dev 3 | 4 | run: 5 | @cargo build && RUST_BACKTRACE=1 ./target/debug/web2app args -n Notion -u https://www.notion.so/ 6 | 7 | .PHONY: run_template run 8 | 9 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | ### Intro 2 | 3 | Convert any web page into a desktop app (but, lightweight ~3MB) 4 | 5 | - The bundle size will be around 3MB 6 | - Demo: [https://i.imgur.com/BLr03oF.mp4](https://i.imgur.com/BLr03oF.mp4) 7 | 8 | ### Pre-requisites 9 | 10 | #### macOS 11 | 12 | ```bash 13 | # cargo 14 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 15 | ``` 16 | 17 | #### Linux 18 | 19 | You should first install the Rust toolchain 20 | ```sh 21 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 22 | ``` 23 | 24 | Then you need to install some dependencies, which depends on your Linux distribution. 25 | 26 |
27 | Ubuntu (and derivates such as KDE Neon, PopOS etc.) 28 | 29 | ```sh 30 | sudo apt install libwebkit2gtk-4.0-dev -y 31 | ``` 32 | 33 |
34 | 35 |
36 | OpenSUSE 37 | 38 | ```sh 39 | sudo zypper in -y webkit2gtk3-soup2-devel 40 | ``` 41 | 42 |
43 | 44 | 45 |
46 | Other 47 | 48 | You need to look for another package that provides the development libraries for webkit with GTK4. 49 | There might also be other missing packages. 50 | 51 |
52 | 53 | 54 | #### Windows 55 | 56 | Windows Setup (x64) 57 | 58 | - Setup Tauri Pre-Requisities for windows: [https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-windows](https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-windows) 59 | 60 | ### Install 61 | 62 | ```bash 63 | cargo install web2app tauri-cli 64 | ``` 65 | 66 | ### Usages 67 | 68 | ```bash 69 | # Run with args 70 | 71 | web2app args -n Notion -u https://www.notion.so -i icon.png 72 | ``` 73 | 74 | ```bash 75 | # Run with interactive mode 76 | 77 | web2app interactive 78 | 79 | # 🍀 Enter Name (TestApp): 80 | # 🍀 Enter URL (https://trello.com): 81 | # 🍀 Enter Description (An example application.): 82 | # 🍀 Enter Version (0.1.0): 83 | # 🍀 Enter Author (John Doe): 84 | # 🍀 Enter Identifier (com.example.testapp): 85 | # 🍀 Enter Icon (icon_path.png): 86 | # 🍀 Enter User Agent (Mozilla/5.0): 87 | ``` 88 | 89 | ### Output 90 | 91 | - The output will be saved in `$HOME/web2app_apps/` directory. 92 | 93 | ### Roadmap 94 | 95 | - [x] Zoom In/Out 96 | - [x] Reload 97 | - [x] Standard Copy/Paste 98 | - [x] Custom User Agent 99 | - [x] Desktop Notification (working for some apps) 100 | - [x] Back and forward navigation 101 | - [ ] Automatically fetch icon from website 102 | - [ ] Dark Reader Extension (already there but, not fully working) 103 | - [ ] Retain window size and position after restart 104 | - [ ] Separate `web2app_apps` repo to host common built apps through Github Action 105 | - [ ] File download support 106 | 107 | ### Libraries 108 | 109 | - [Tauri](https://github.com/tauri-apps/tauri) 110 | - [home](https://github.com/brson/home) 111 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 100 -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use std::io::ErrorKind; 3 | use std::io::Result; 4 | use std::io::Error; 5 | 6 | use super::input; 7 | 8 | use super::model::Args; 9 | use super::model::Cli; 10 | use super::model::Commands; 11 | 12 | pub fn get_args() -> Result { 13 | let cli = Cli::parse(); 14 | 15 | match cli.command { 16 | Some(Commands::Args(arg_data)) => { 17 | return Ok(arg_data); 18 | } 19 | Some(Commands::Interactive) => { 20 | return Ok(get_interactive_args()); 21 | } 22 | None => { 23 | println!("No command given. Use --help for more information."); 24 | return Err(Error::new(ErrorKind::Other, "No command given.")); 25 | } 26 | } 27 | } 28 | 29 | fn get_interactive_args() -> Args { 30 | Args { 31 | name: input::string_must("Name"), 32 | url: input::string_must("URL"), 33 | description: input::string("Description", "An example application."), 34 | version: input::string("Version", "0.1.0"), 35 | author: input::string("Author", "hamza72x"), 36 | identifier: input::string("Identifier", "com.example.testapp"), 37 | icon: input::optional_string("Icon", "icon_path.png"), 38 | is_release_build: input::bool("Release build", true), 39 | user_agent: input::optional_string("User agent", "Mozilla/5.0"), 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/consts.rs: -------------------------------------------------------------------------------- 1 | pub const TAURI_ICON_ELEMENTS: &str = r#""icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico""#; 2 | -------------------------------------------------------------------------------- /src/input.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | use std::io::Write; 3 | 4 | pub fn string(title: &str, default_val: &str) -> String { 5 | let mut input = String::new(); 6 | 7 | print!("🍀 Enter {} ({}): ", title, default_val); 8 | io::stdout().flush().unwrap(); 9 | 10 | io::stdin() 11 | .read_line(&mut input) 12 | .expect(&("Error getting".to_owned() + title)); 13 | 14 | let input = input.trim().to_string(); 15 | 16 | if input.is_empty() { 17 | default_val.to_string() 18 | } else { 19 | input 20 | } 21 | } 22 | 23 | pub fn string_must(title: &str) -> String { 24 | let mut input = String::new(); 25 | 26 | print!("🍀 Enter {} (required): ", title); 27 | io::stdout().flush().unwrap(); 28 | 29 | io::stdin() 30 | .read_line(&mut input) 31 | .expect(&("Error getting".to_owned() + title)); 32 | 33 | let text = input.trim().to_string(); 34 | 35 | if text.is_empty() { 36 | string_must(title) 37 | } else { 38 | text 39 | } 40 | } 41 | 42 | pub fn bool(title: &str, default_val: bool) -> bool { 43 | let mut input = String::new(); 44 | 45 | print!("🍀 Enter {} (y/n): ", title); 46 | io::stdout().flush().unwrap(); 47 | 48 | io::stdin() 49 | .read_line(&mut input) 50 | .expect(&("Error getting".to_owned() + title)); 51 | 52 | let input = input.trim().to_string(); 53 | 54 | if input.is_empty() { 55 | default_val 56 | } else { 57 | input == "y" 58 | } 59 | } 60 | 61 | pub fn optional_string(title: &str, example: &str) -> Option { 62 | let mut input = String::new(); 63 | 64 | print!("🍀 Enter {} ({}): ", title, example); 65 | io::stdout().flush().unwrap(); 66 | 67 | io::stdin() 68 | .read_line(&mut input) 69 | .expect(&("Error getting".to_owned() + title)); 70 | 71 | if input.trim().is_empty() { 72 | None 73 | } else { 74 | Some(input.trim().to_string()) 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::fs; 2 | use std::io; 3 | use std::thread::sleep; 4 | use std::time::Duration; 5 | 6 | mod cli; 7 | mod generated; 8 | mod input; 9 | mod model; 10 | mod template_builder; 11 | mod util; 12 | mod consts; 13 | 14 | use model::Args; 15 | 16 | // milliseconds 17 | const SLEEP_TIME: u64 = 10; 18 | 19 | fn main() -> io::Result<()> { 20 | let mut args = cli::get_args().expect("failed to get cli args"); 21 | 22 | // post args processing 23 | args.update_default_identifier(); 24 | 25 | // print given input 26 | args.print(); 27 | sleep(Duration::from_millis(SLEEP_TIME)); 28 | 29 | // building 30 | build(&args).expect("failed to build"); 31 | sleep(Duration::from_millis(SLEEP_TIME)); 32 | 33 | // opening output directory in file explorer 34 | util::open_dir_in_explorer(&args.bundle_dir()); 35 | 36 | Ok(()) 37 | } 38 | 39 | // build the app 40 | fn build(args: &Args) -> io::Result<()> { 41 | // build directories 42 | print_and_wait("\n🎉 Building directories..."); 43 | 44 | // $HOME/web2app_apps/app_name 45 | fs::create_dir_all(&args.build_dir())?; 46 | 47 | // $HOME/web2app_apps/app_name/src 48 | util::re_create_dir(format!("{}/src", &args.build_dir()).as_str())?; 49 | 50 | // $HOME/web2app_apps/app_name/icons 51 | util::re_create_dir(format!("{}/icons", &args.build_dir()).as_str())?; 52 | 53 | // create files 54 | print_and_wait("\n🎉 Creating files..."); 55 | 56 | // array of FileBuildData 57 | print_and_wait("\n🎉 Building templates..."); 58 | 59 | let mut files = template_builder::build_template_files(args); 60 | 61 | // write files 62 | for file in files.iter_mut() { 63 | file.decode_and_write(); 64 | } 65 | 66 | // build icons 67 | print_and_wait("\n🎉 Building icons..."); 68 | 69 | if let Some(icon) = args.icon.as_ref() { 70 | // copy icon to web2apps/app_name/icons/app-icon.png 71 | util::copy_file(&icon, args.app_icon_path()).unwrap(); 72 | 73 | // run `cargo tauri icon` 74 | util::run_os_command_standard( 75 | format!("cargo tauri icon {}", args.app_icon_path()).as_str(), 76 | Some(&args.build_dir()), 77 | ) 78 | .expect("failed to run cargo tauri icon"); 79 | } 80 | 81 | // run cargo tauri build 82 | print_and_wait("\n🎉 Running cargo tauri build..."); 83 | 84 | let mut tauri_build = "cargo tauri build"; 85 | if !args.is_release_build { 86 | tauri_build = "cargo tauri build --debug"; 87 | } 88 | 89 | util::run_os_command_standard(tauri_build, Some(&args.build_dir())).unwrap(); 90 | 91 | Ok(()) 92 | } 93 | 94 | fn print_and_wait(text: &str) { 95 | println!("{}", text); 96 | sleep(Duration::from_millis(SLEEP_TIME)); 97 | } 98 | -------------------------------------------------------------------------------- /src/model.rs: -------------------------------------------------------------------------------- 1 | use clap::{Parser, Subcommand}; 2 | use std::collections::HashMap; 3 | use std::fs::File; 4 | use std::io::Write; 5 | use std::path::Path; 6 | use std::path::PathBuf; 7 | 8 | #[derive(Parser)] 9 | #[command(author, version, about, long_about = None)] 10 | pub struct Cli { 11 | #[command(subcommand)] 12 | pub command: Option, 13 | } 14 | 15 | #[derive(Subcommand)] 16 | pub enum Commands { 17 | #[command(about = "Builds the app with the given arguments.")] 18 | Args(Args), 19 | 20 | #[command(about = "Builds the app with interactive input.")] 21 | Interactive, 22 | } 23 | 24 | #[derive(Parser)] 25 | pub struct Args { 26 | #[arg(short, long, help = "The name of the app")] 27 | pub name: String, 28 | 29 | #[arg(short, long, help = "The URL of the app")] 30 | pub url: String, 31 | 32 | #[arg(short, long, help = "The description of the app", default_value_t = String::from("An example application."))] 33 | pub description: String, 34 | 35 | #[arg(short, long, help = "The version of the app", default_value_t = String::from("0.1.0"))] 36 | pub version: String, 37 | 38 | #[arg(short, long, help = "The author of the app", default_value_t = String::from("John Doe"))] 39 | pub author: String, 40 | 41 | #[arg(short = 't', long, help = "The identifier of the app", default_value_t = String::from("com.example.testapp"))] 42 | pub identifier: String, 43 | 44 | #[arg(short = 'i', long, help = "The icon of the app")] 45 | pub icon: Option, 46 | 47 | #[arg( 48 | short = 'r', 49 | long, 50 | help = "The release build of the app", 51 | default_value_t = true 52 | )] 53 | pub is_release_build: bool, 54 | 55 | #[arg(short = 'g', long, help = "Custom user agent")] 56 | pub user_agent: Option, 57 | } 58 | 59 | // methods 60 | impl Args { 61 | pub fn update_default_identifier(&mut self) { 62 | // if identifier is not given, generate from args.url 63 | if self.identifier == "com.example.testapp" { 64 | self.identifier = get_identifier_from_url(&self.url); 65 | } 66 | } 67 | 68 | // build_dir is the path to the build directory 69 | // e.g: "$HOME/web2app_apps/app_name" 70 | pub fn build_dir(&self) -> String { 71 | let home_dir = home::home_dir().unwrap().display().to_string(); 72 | 73 | let path = Path::new(&home_dir); 74 | let path = path.join("web2app_apps"); 75 | let path = path.join(self.name.to_lowercase()); 76 | 77 | path.as_path().display().to_string() 78 | } 79 | 80 | // icon_path is the path to the icon file in the build directory 81 | // e.g: for the file "icon.png" the path would be "$HOME/web2app_apps/app_name/icons/app-icon.png" 82 | pub fn app_icon_path(&self) -> String { 83 | let build_dir = self.build_dir(); 84 | let path = Path::new(&build_dir); 85 | let path = path.join("icons").join("app-icon.png"); 86 | 87 | path.to_str().unwrap().to_string() 88 | } 89 | 90 | // bundle_dir is the path to the bundle directory 91 | // e.g: "$HOME/web2app_apps/app_name/target/debug/bundle" 92 | pub fn bundle_dir(&self) -> String { 93 | let build_dir = self.build_dir(); 94 | let path = Path::new(&build_dir); 95 | 96 | let mut build_type = "debug"; 97 | if self.is_release_build { 98 | build_type = "release"; 99 | } 100 | 101 | let path = path.join("target").join(build_type).join("bundle"); 102 | path.to_str().unwrap().to_string() 103 | } 104 | 105 | // dest_tmpl_file is the file in the build directory 106 | // e.g: for the file "src/main.rs" the path would be "$HOME/web2app_apps/app_name/src/main.rs" 107 | // e.g: for the file "Cargo.toml" the path would be "$HOME/web2app_apps/app_name/Cargo.toml" 108 | pub fn dest_tmpl_file(&self, path: &str) -> File { 109 | File::create(self.dest_tmpl_path_buf(path)).unwrap() 110 | } 111 | 112 | pub fn dest_tmpl_path_buf(&self, path: &str) -> PathBuf { 113 | PathBuf::from(format!("{}/{}", self.build_dir(), path)) 114 | } 115 | 116 | pub fn print(&self) { 117 | println!("name: {}", self.name); 118 | println!("url: {}", self.url); 119 | println!("description: {}", self.description); 120 | println!("version: {}", self.version); 121 | println!("author: {}", self.author); 122 | println!("identifier: {}", self.identifier); 123 | println!( 124 | "icon: {}", 125 | self.icon.as_ref().unwrap_or(&String::from("None")) 126 | ); 127 | println!( 128 | "User Agent: {}", 129 | self.user_agent.as_ref().unwrap_or(&String::from("Default")) 130 | ); 131 | println!(""); 132 | println!("🚀 build_dir: {}", self.build_dir()); 133 | } 134 | } 135 | 136 | pub struct FileBuildData<'a> { 137 | pub file: File, 138 | pub data_b64: &'a str, 139 | // map if search and replace text 140 | pub search_replace_texts: Option>, 141 | } 142 | 143 | impl FileBuildData<'_> { 144 | pub fn decode_and_write(&mut self) { 145 | let data = base64::decode(&self.data_b64).unwrap(); 146 | let mut data = String::from_utf8(data).unwrap(); 147 | if let Some(search_replace_texts) = &self.search_replace_texts { 148 | for (key, value) in search_replace_texts { 149 | data = data.replace(key.as_str(), value); 150 | } 151 | } 152 | self.file.write_all(data.as_bytes()).unwrap(); 153 | } 154 | } 155 | 156 | fn get_identifier_from_url(url: &String) -> String { 157 | // remove http(s):// 158 | let url = url.replace("https://", ""); 159 | let url = url.replace("http://", ""); 160 | 161 | // replace all non alphanumeric characters with a dot 162 | let identifier = url 163 | .chars() 164 | .map(|c| { 165 | if c.is_ascii_alphanumeric() || c == '.' { 166 | c 167 | } else { 168 | '.' 169 | } 170 | }) 171 | .collect::(); 172 | 173 | let identifier = identifier + ".web2app"; 174 | 175 | // replace double dots with a single dot 176 | return identifier.replace("..", "."); 177 | } 178 | -------------------------------------------------------------------------------- /src/template_builder.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use super::consts; 4 | use super::generated; 5 | use super::model::Args; 6 | use super::model::FileBuildData; 7 | 8 | pub fn build_template_files(args: &Args) -> [FileBuildData; 11] { 9 | let files = [ 10 | // template/src/app_config.rs 11 | FileBuildData { 12 | file: args.dest_tmpl_file("src/app_config.rs"), 13 | data_b64: generated::FILE_APP_CONFIG_RS, 14 | search_replace_texts: None, 15 | }, 16 | // template/src/app_menu.rs 17 | FileBuildData { 18 | file: args.dest_tmpl_file("src/app_menu.rs"), 19 | data_b64: generated::FILE_APP_MENU_RS, 20 | search_replace_texts: None, 21 | }, 22 | // template/src/app_data.rs 23 | FileBuildData { 24 | file: args.dest_tmpl_file("src/app_data.rs"), 25 | data_b64: generated::FILE_APP_DATA_RS, 26 | search_replace_texts: { 27 | let mut map = std::collections::HashMap::new(); 28 | if let Some(user_agent) = &args.user_agent { 29 | map.insert( 30 | String::from("pub const USER_AGENT: Option<&str> = None;"), 31 | format!("pub const USER_AGENT: Option<&str> = Some(\"{}\");", user_agent), 32 | ); 33 | } 34 | map.insert( 35 | String::from("pub const APP_NAME: &str = \"app_name\";"), 36 | format!("pub const APP_NAME: &str = \"{}\";", &args.name), 37 | ); 38 | map.insert( 39 | String::from("pub const URL: &str = \"https://google.com\";"), 40 | format!("pub const URL: &str = \"{}\";", &args.url), 41 | ); 42 | Some(map) 43 | }, 44 | }, 45 | // template/src/builder.rs 46 | FileBuildData { 47 | file: args.dest_tmpl_file("src/builder.rs"), 48 | data_b64: generated::FILE_BUILDER_RS, 49 | search_replace_texts: None, 50 | }, 51 | // template/src/generated.rs 52 | FileBuildData { 53 | file: args.dest_tmpl_file("src/generated.rs"), 54 | data_b64: generated::FILE_GENERATED_RS, 55 | search_replace_texts: None, 56 | }, 57 | // template/src/main.rs 58 | FileBuildData { 59 | file: args.dest_tmpl_file("src/main.rs"), 60 | data_b64: generated::FILE_MAIN_RS, 61 | search_replace_texts: None, 62 | }, 63 | // template/src/util.rs 64 | FileBuildData { 65 | file: args.dest_tmpl_file("src/util.rs"), 66 | data_b64: generated::FILE_UTIL_RS, 67 | search_replace_texts: None, 68 | }, 69 | // template/build.rs 70 | FileBuildData { 71 | file: args.dest_tmpl_file("build.rs"), 72 | data_b64: generated::FILE_BUILD_RS, 73 | search_replace_texts: None, 74 | }, 75 | // template/Cargo.toml 76 | FileBuildData { 77 | file: args.dest_tmpl_file("Cargo.toml"), 78 | data_b64: generated::FILE_CARGO_TOML, 79 | search_replace_texts: { 80 | let mut map = HashMap::new(); 81 | map.insert( 82 | String::from("name = \"app_name_lowercased\""), 83 | format!("name = \"{}\"", &args.name.to_lowercase()), 84 | ); 85 | map.insert( 86 | String::from("description = \"test_description\""), 87 | format!("description = \"{}\"", &args.description), 88 | ); 89 | map.insert( 90 | String::from("version = \"0.1.0\""), 91 | format!("version = \"{}\"", &args.version), 92 | ); 93 | Some(map) 94 | }, 95 | }, 96 | // template/Cargo.lock 97 | FileBuildData { 98 | file: args.dest_tmpl_file("Cargo.lock"), 99 | data_b64: generated::FILE_CARGO_LOCK, 100 | search_replace_texts: { 101 | let mut map = std::collections::HashMap::new(); 102 | map.insert( 103 | String::from("name = \"app_name_lowercased\""), 104 | format!("name = \"{}\"", &args.name.to_lowercase()), 105 | ); 106 | Some(map) 107 | }, 108 | }, 109 | // template/tauri.conf.json 110 | FileBuildData { 111 | file: args.dest_tmpl_file("tauri.conf.json"), 112 | data_b64: generated::FILE_TAURI_CONF_JSON, 113 | search_replace_texts: { 114 | let mut map = std::collections::HashMap::new(); 115 | map.insert( 116 | String::from("\"productName\": \"app_name\""), 117 | format!("\"productName\": \"{}\"", &args.name), 118 | ); 119 | map.insert( 120 | String::from("\"identifier\": \"com.example.test\""), 121 | format!("\"identifier\": \"{}\"", &args.identifier), 122 | ); 123 | map.insert( 124 | String::from("\"version\": \"0.1.0\""), 125 | format!("\"version\": \"{}\"", &args.version), 126 | ); 127 | if args.icon.is_some() { 128 | map.insert( 129 | String::from("\"icon\": []"), 130 | format!("\"icon\": [{}]", consts::TAURI_ICON_ELEMENTS), 131 | ); 132 | } 133 | Some(map) 134 | }, 135 | }, 136 | ]; 137 | 138 | return files; 139 | } 140 | -------------------------------------------------------------------------------- /src/util.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::fs; 3 | use std::io; 4 | use std::path; 5 | use std::process; 6 | use std::vec::Vec; 7 | 8 | pub fn open_dir_in_explorer(dir: &String) { 9 | let cli_data: HashMap<&str, &str> = [ 10 | ("windows", "explorer"), 11 | ("linux", "xdg-open"), 12 | ("macos", "open"), 13 | ] 14 | .iter() 15 | .cloned() 16 | .collect(); 17 | 18 | process::Command::new(cli_data[std::env::consts::OS]) 19 | .arg(dir) 20 | .spawn() 21 | .unwrap(); 22 | } 23 | 24 | pub fn run_os_command_standard(args: &str, command_dir: Option<&str>) -> io::Result<()> { 25 | let args = args.split_whitespace().collect::>(); 26 | 27 | if args.is_empty() { 28 | return Err(io::Error::new(io::ErrorKind::Other, "No command provided")); 29 | } 30 | 31 | let mut command = process::Command::new(&args[0]); 32 | 33 | if command_dir.is_some() { 34 | command.current_dir(command_dir.unwrap()); 35 | } 36 | 37 | for arg in args.iter().skip(1) { 38 | command.arg(arg); 39 | } 40 | 41 | command.status()?; 42 | 43 | Ok(()) 44 | } 45 | 46 | pub fn re_create_dir(name: &str) -> io::Result<()> { 47 | let dir = path::Path::new(&name); 48 | 49 | // first delete the directory if it exists 50 | if dir.exists() { 51 | fs::remove_dir_all(&dir)?; 52 | } 53 | 54 | fs::create_dir_all(dir) 55 | } 56 | 57 | pub fn copy_file(source: &String, dest: String) -> io::Result<()> { 58 | fs::copy(source, dest)?; 59 | Ok(()) 60 | } 61 | -------------------------------------------------------------------------------- /template/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | -------------------------------------------------------------------------------- /template/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "0.7.20" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "alloc-no-stdlib" 22 | version = "2.0.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 25 | 26 | [[package]] 27 | name = "alloc-stdlib" 28 | version = "0.2.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 31 | dependencies = [ 32 | "alloc-no-stdlib", 33 | ] 34 | 35 | [[package]] 36 | name = "anyhow" 37 | version = "1.0.69" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" 40 | 41 | [[package]] 42 | name = "app_name_lowercased" 43 | version = "0.1.0" 44 | dependencies = [ 45 | "cocoa", 46 | "home", 47 | "objc", 48 | "reqwest", 49 | "serde", 50 | "serde_json", 51 | "tao", 52 | "tauri", 53 | "tauri-build", 54 | "webkit2gtk", 55 | "wry", 56 | ] 57 | 58 | [[package]] 59 | name = "atk" 60 | version = "0.15.1" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" 63 | dependencies = [ 64 | "atk-sys", 65 | "bitflags", 66 | "glib", 67 | "libc", 68 | ] 69 | 70 | [[package]] 71 | name = "atk-sys" 72 | version = "0.15.1" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" 75 | dependencies = [ 76 | "glib-sys", 77 | "gobject-sys", 78 | "libc", 79 | "system-deps 6.0.3", 80 | ] 81 | 82 | [[package]] 83 | name = "autocfg" 84 | version = "1.1.0" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 87 | 88 | [[package]] 89 | name = "base64" 90 | version = "0.13.1" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 93 | 94 | [[package]] 95 | name = "base64" 96 | version = "0.21.0" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 99 | 100 | [[package]] 101 | name = "bitflags" 102 | version = "1.3.2" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 105 | 106 | [[package]] 107 | name = "block" 108 | version = "0.1.6" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 111 | 112 | [[package]] 113 | name = "block-buffer" 114 | version = "0.10.4" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 117 | dependencies = [ 118 | "generic-array", 119 | ] 120 | 121 | [[package]] 122 | name = "brotli" 123 | version = "3.3.4" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" 126 | dependencies = [ 127 | "alloc-no-stdlib", 128 | "alloc-stdlib", 129 | "brotli-decompressor", 130 | ] 131 | 132 | [[package]] 133 | name = "brotli-decompressor" 134 | version = "2.3.4" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" 137 | dependencies = [ 138 | "alloc-no-stdlib", 139 | "alloc-stdlib", 140 | ] 141 | 142 | [[package]] 143 | name = "bstr" 144 | version = "1.4.0" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" 147 | dependencies = [ 148 | "memchr", 149 | "serde", 150 | ] 151 | 152 | [[package]] 153 | name = "bumpalo" 154 | version = "3.12.0" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 157 | 158 | [[package]] 159 | name = "bytemuck" 160 | version = "1.13.1" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" 163 | 164 | [[package]] 165 | name = "byteorder" 166 | version = "1.4.3" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 169 | 170 | [[package]] 171 | name = "bytes" 172 | version = "1.4.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 175 | 176 | [[package]] 177 | name = "cairo-rs" 178 | version = "0.15.12" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" 181 | dependencies = [ 182 | "bitflags", 183 | "cairo-sys-rs", 184 | "glib", 185 | "libc", 186 | "thiserror", 187 | ] 188 | 189 | [[package]] 190 | name = "cairo-sys-rs" 191 | version = "0.15.1" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" 194 | dependencies = [ 195 | "glib-sys", 196 | "libc", 197 | "system-deps 6.0.3", 198 | ] 199 | 200 | [[package]] 201 | name = "cargo_toml" 202 | version = "0.13.3" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" 205 | dependencies = [ 206 | "serde", 207 | "toml", 208 | ] 209 | 210 | [[package]] 211 | name = "cc" 212 | version = "1.0.79" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 215 | 216 | [[package]] 217 | name = "cesu8" 218 | version = "1.1.0" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 221 | 222 | [[package]] 223 | name = "cfb" 224 | version = "0.6.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" 227 | dependencies = [ 228 | "byteorder", 229 | "uuid 0.8.2", 230 | ] 231 | 232 | [[package]] 233 | name = "cfg-expr" 234 | version = "0.9.1" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" 237 | dependencies = [ 238 | "smallvec", 239 | ] 240 | 241 | [[package]] 242 | name = "cfg-expr" 243 | version = "0.11.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "b0357a6402b295ca3a86bc148e84df46c02e41f41fef186bda662557ef6328aa" 246 | dependencies = [ 247 | "smallvec", 248 | ] 249 | 250 | [[package]] 251 | name = "cfg-if" 252 | version = "1.0.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 255 | 256 | [[package]] 257 | name = "cocoa" 258 | version = "0.24.1" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" 261 | dependencies = [ 262 | "bitflags", 263 | "block", 264 | "cocoa-foundation", 265 | "core-foundation", 266 | "core-graphics", 267 | "foreign-types", 268 | "libc", 269 | "objc", 270 | ] 271 | 272 | [[package]] 273 | name = "cocoa-foundation" 274 | version = "0.1.0" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" 277 | dependencies = [ 278 | "bitflags", 279 | "block", 280 | "core-foundation", 281 | "core-graphics-types", 282 | "foreign-types", 283 | "libc", 284 | "objc", 285 | ] 286 | 287 | [[package]] 288 | name = "color_quant" 289 | version = "1.1.0" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 292 | 293 | [[package]] 294 | name = "combine" 295 | version = "4.6.6" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 298 | dependencies = [ 299 | "bytes", 300 | "memchr", 301 | ] 302 | 303 | [[package]] 304 | name = "convert_case" 305 | version = "0.4.0" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 308 | 309 | [[package]] 310 | name = "core-foundation" 311 | version = "0.9.3" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 314 | dependencies = [ 315 | "core-foundation-sys", 316 | "libc", 317 | ] 318 | 319 | [[package]] 320 | name = "core-foundation-sys" 321 | version = "0.8.3" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 324 | 325 | [[package]] 326 | name = "core-graphics" 327 | version = "0.22.3" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" 330 | dependencies = [ 331 | "bitflags", 332 | "core-foundation", 333 | "core-graphics-types", 334 | "foreign-types", 335 | "libc", 336 | ] 337 | 338 | [[package]] 339 | name = "core-graphics-types" 340 | version = "0.1.1" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" 343 | dependencies = [ 344 | "bitflags", 345 | "core-foundation", 346 | "foreign-types", 347 | "libc", 348 | ] 349 | 350 | [[package]] 351 | name = "cpufeatures" 352 | version = "0.2.5" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 355 | dependencies = [ 356 | "libc", 357 | ] 358 | 359 | [[package]] 360 | name = "crc32fast" 361 | version = "1.3.2" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 364 | dependencies = [ 365 | "cfg-if", 366 | ] 367 | 368 | [[package]] 369 | name = "crossbeam-channel" 370 | version = "0.5.7" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" 373 | dependencies = [ 374 | "cfg-if", 375 | "crossbeam-utils", 376 | ] 377 | 378 | [[package]] 379 | name = "crossbeam-utils" 380 | version = "0.8.15" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" 383 | dependencies = [ 384 | "cfg-if", 385 | ] 386 | 387 | [[package]] 388 | name = "crypto-common" 389 | version = "0.1.6" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 392 | dependencies = [ 393 | "generic-array", 394 | "typenum", 395 | ] 396 | 397 | [[package]] 398 | name = "cssparser" 399 | version = "0.27.2" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 402 | dependencies = [ 403 | "cssparser-macros", 404 | "dtoa-short", 405 | "itoa 0.4.8", 406 | "matches", 407 | "phf 0.8.0", 408 | "proc-macro2", 409 | "quote", 410 | "smallvec", 411 | "syn", 412 | ] 413 | 414 | [[package]] 415 | name = "cssparser-macros" 416 | version = "0.6.0" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" 419 | dependencies = [ 420 | "quote", 421 | "syn", 422 | ] 423 | 424 | [[package]] 425 | name = "ctor" 426 | version = "0.1.26" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 429 | dependencies = [ 430 | "quote", 431 | "syn", 432 | ] 433 | 434 | [[package]] 435 | name = "darling" 436 | version = "0.13.4" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" 439 | dependencies = [ 440 | "darling_core", 441 | "darling_macro", 442 | ] 443 | 444 | [[package]] 445 | name = "darling_core" 446 | version = "0.13.4" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" 449 | dependencies = [ 450 | "fnv", 451 | "ident_case", 452 | "proc-macro2", 453 | "quote", 454 | "strsim", 455 | "syn", 456 | ] 457 | 458 | [[package]] 459 | name = "darling_macro" 460 | version = "0.13.4" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" 463 | dependencies = [ 464 | "darling_core", 465 | "quote", 466 | "syn", 467 | ] 468 | 469 | [[package]] 470 | name = "dbus" 471 | version = "0.9.7" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" 474 | dependencies = [ 475 | "libc", 476 | "libdbus-sys", 477 | "winapi", 478 | ] 479 | 480 | [[package]] 481 | name = "derive_more" 482 | version = "0.99.17" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 485 | dependencies = [ 486 | "convert_case", 487 | "proc-macro2", 488 | "quote", 489 | "rustc_version", 490 | "syn", 491 | ] 492 | 493 | [[package]] 494 | name = "digest" 495 | version = "0.10.6" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 498 | dependencies = [ 499 | "block-buffer", 500 | "crypto-common", 501 | ] 502 | 503 | [[package]] 504 | name = "dirs-next" 505 | version = "2.0.0" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" 508 | dependencies = [ 509 | "cfg-if", 510 | "dirs-sys-next", 511 | ] 512 | 513 | [[package]] 514 | name = "dirs-sys-next" 515 | version = "0.1.2" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 518 | dependencies = [ 519 | "libc", 520 | "redox_users", 521 | "winapi", 522 | ] 523 | 524 | [[package]] 525 | name = "dispatch" 526 | version = "0.2.0" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 529 | 530 | [[package]] 531 | name = "dtoa" 532 | version = "0.4.8" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" 535 | 536 | [[package]] 537 | name = "dtoa-short" 538 | version = "0.3.3" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" 541 | dependencies = [ 542 | "dtoa", 543 | ] 544 | 545 | [[package]] 546 | name = "dunce" 547 | version = "1.0.3" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" 550 | 551 | [[package]] 552 | name = "embed_plist" 553 | version = "1.2.2" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" 556 | 557 | [[package]] 558 | name = "encoding_rs" 559 | version = "0.8.32" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 562 | dependencies = [ 563 | "cfg-if", 564 | ] 565 | 566 | [[package]] 567 | name = "errno" 568 | version = "0.2.8" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 571 | dependencies = [ 572 | "errno-dragonfly", 573 | "libc", 574 | "winapi", 575 | ] 576 | 577 | [[package]] 578 | name = "errno-dragonfly" 579 | version = "0.1.2" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 582 | dependencies = [ 583 | "cc", 584 | "libc", 585 | ] 586 | 587 | [[package]] 588 | name = "fastrand" 589 | version = "1.9.0" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 592 | dependencies = [ 593 | "instant", 594 | ] 595 | 596 | [[package]] 597 | name = "field-offset" 598 | version = "0.3.5" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535" 601 | dependencies = [ 602 | "memoffset", 603 | "rustc_version", 604 | ] 605 | 606 | [[package]] 607 | name = "filetime" 608 | version = "0.2.20" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" 611 | dependencies = [ 612 | "cfg-if", 613 | "libc", 614 | "redox_syscall", 615 | "windows-sys 0.45.0", 616 | ] 617 | 618 | [[package]] 619 | name = "flate2" 620 | version = "1.0.25" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" 623 | dependencies = [ 624 | "crc32fast", 625 | "miniz_oxide", 626 | ] 627 | 628 | [[package]] 629 | name = "fnv" 630 | version = "1.0.7" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 633 | 634 | [[package]] 635 | name = "foreign-types" 636 | version = "0.3.2" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 639 | dependencies = [ 640 | "foreign-types-shared", 641 | ] 642 | 643 | [[package]] 644 | name = "foreign-types-shared" 645 | version = "0.1.1" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 648 | 649 | [[package]] 650 | name = "form_urlencoded" 651 | version = "1.1.0" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 654 | dependencies = [ 655 | "percent-encoding", 656 | ] 657 | 658 | [[package]] 659 | name = "futf" 660 | version = "0.1.5" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 663 | dependencies = [ 664 | "mac", 665 | "new_debug_unreachable", 666 | ] 667 | 668 | [[package]] 669 | name = "futures-channel" 670 | version = "0.3.26" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" 673 | dependencies = [ 674 | "futures-core", 675 | ] 676 | 677 | [[package]] 678 | name = "futures-core" 679 | version = "0.3.26" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" 682 | 683 | [[package]] 684 | name = "futures-executor" 685 | version = "0.3.26" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" 688 | dependencies = [ 689 | "futures-core", 690 | "futures-task", 691 | "futures-util", 692 | ] 693 | 694 | [[package]] 695 | name = "futures-io" 696 | version = "0.3.26" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" 699 | 700 | [[package]] 701 | name = "futures-macro" 702 | version = "0.3.26" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" 705 | dependencies = [ 706 | "proc-macro2", 707 | "quote", 708 | "syn", 709 | ] 710 | 711 | [[package]] 712 | name = "futures-sink" 713 | version = "0.3.28" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 716 | 717 | [[package]] 718 | name = "futures-task" 719 | version = "0.3.26" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" 722 | 723 | [[package]] 724 | name = "futures-util" 725 | version = "0.3.26" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" 728 | dependencies = [ 729 | "futures-core", 730 | "futures-io", 731 | "futures-macro", 732 | "futures-task", 733 | "memchr", 734 | "pin-project-lite", 735 | "pin-utils", 736 | "slab", 737 | ] 738 | 739 | [[package]] 740 | name = "fxhash" 741 | version = "0.2.1" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 744 | dependencies = [ 745 | "byteorder", 746 | ] 747 | 748 | [[package]] 749 | name = "gdk" 750 | version = "0.15.4" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" 753 | dependencies = [ 754 | "bitflags", 755 | "cairo-rs", 756 | "gdk-pixbuf", 757 | "gdk-sys", 758 | "gio", 759 | "glib", 760 | "libc", 761 | "pango", 762 | ] 763 | 764 | [[package]] 765 | name = "gdk-pixbuf" 766 | version = "0.15.11" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" 769 | dependencies = [ 770 | "bitflags", 771 | "gdk-pixbuf-sys", 772 | "gio", 773 | "glib", 774 | "libc", 775 | ] 776 | 777 | [[package]] 778 | name = "gdk-pixbuf-sys" 779 | version = "0.15.10" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" 782 | dependencies = [ 783 | "gio-sys", 784 | "glib-sys", 785 | "gobject-sys", 786 | "libc", 787 | "system-deps 6.0.3", 788 | ] 789 | 790 | [[package]] 791 | name = "gdk-sys" 792 | version = "0.15.1" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" 795 | dependencies = [ 796 | "cairo-sys-rs", 797 | "gdk-pixbuf-sys", 798 | "gio-sys", 799 | "glib-sys", 800 | "gobject-sys", 801 | "libc", 802 | "pango-sys", 803 | "pkg-config", 804 | "system-deps 6.0.3", 805 | ] 806 | 807 | [[package]] 808 | name = "gdkx11-sys" 809 | version = "0.15.1" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" 812 | dependencies = [ 813 | "gdk-sys", 814 | "glib-sys", 815 | "libc", 816 | "system-deps 6.0.3", 817 | "x11", 818 | ] 819 | 820 | [[package]] 821 | name = "generator" 822 | version = "0.7.3" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "33a20a288a94683f5f4da0adecdbe095c94a77c295e514cc6484e9394dd8376e" 825 | dependencies = [ 826 | "cc", 827 | "libc", 828 | "log", 829 | "rustversion", 830 | "windows 0.44.0", 831 | ] 832 | 833 | [[package]] 834 | name = "generic-array" 835 | version = "0.14.6" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 838 | dependencies = [ 839 | "typenum", 840 | "version_check", 841 | ] 842 | 843 | [[package]] 844 | name = "getrandom" 845 | version = "0.1.16" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 848 | dependencies = [ 849 | "cfg-if", 850 | "libc", 851 | "wasi 0.9.0+wasi-snapshot-preview1", 852 | ] 853 | 854 | [[package]] 855 | name = "getrandom" 856 | version = "0.2.8" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 859 | dependencies = [ 860 | "cfg-if", 861 | "libc", 862 | "wasi 0.11.0+wasi-snapshot-preview1", 863 | ] 864 | 865 | [[package]] 866 | name = "gio" 867 | version = "0.15.12" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" 870 | dependencies = [ 871 | "bitflags", 872 | "futures-channel", 873 | "futures-core", 874 | "futures-io", 875 | "gio-sys", 876 | "glib", 877 | "libc", 878 | "once_cell", 879 | "thiserror", 880 | ] 881 | 882 | [[package]] 883 | name = "gio-sys" 884 | version = "0.15.10" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" 887 | dependencies = [ 888 | "glib-sys", 889 | "gobject-sys", 890 | "libc", 891 | "system-deps 6.0.3", 892 | "winapi", 893 | ] 894 | 895 | [[package]] 896 | name = "glib" 897 | version = "0.15.12" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" 900 | dependencies = [ 901 | "bitflags", 902 | "futures-channel", 903 | "futures-core", 904 | "futures-executor", 905 | "futures-task", 906 | "glib-macros", 907 | "glib-sys", 908 | "gobject-sys", 909 | "libc", 910 | "once_cell", 911 | "smallvec", 912 | "thiserror", 913 | ] 914 | 915 | [[package]] 916 | name = "glib-macros" 917 | version = "0.15.11" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" 920 | dependencies = [ 921 | "anyhow", 922 | "heck 0.4.1", 923 | "proc-macro-crate", 924 | "proc-macro-error", 925 | "proc-macro2", 926 | "quote", 927 | "syn", 928 | ] 929 | 930 | [[package]] 931 | name = "glib-sys" 932 | version = "0.15.10" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" 935 | dependencies = [ 936 | "libc", 937 | "system-deps 6.0.3", 938 | ] 939 | 940 | [[package]] 941 | name = "glob" 942 | version = "0.3.1" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 945 | 946 | [[package]] 947 | name = "globset" 948 | version = "0.4.10" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" 951 | dependencies = [ 952 | "aho-corasick", 953 | "bstr", 954 | "fnv", 955 | "log", 956 | "regex", 957 | ] 958 | 959 | [[package]] 960 | name = "gobject-sys" 961 | version = "0.15.10" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" 964 | dependencies = [ 965 | "glib-sys", 966 | "libc", 967 | "system-deps 6.0.3", 968 | ] 969 | 970 | [[package]] 971 | name = "gtk" 972 | version = "0.15.5" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" 975 | dependencies = [ 976 | "atk", 977 | "bitflags", 978 | "cairo-rs", 979 | "field-offset", 980 | "futures-channel", 981 | "gdk", 982 | "gdk-pixbuf", 983 | "gio", 984 | "glib", 985 | "gtk-sys", 986 | "gtk3-macros", 987 | "libc", 988 | "once_cell", 989 | "pango", 990 | "pkg-config", 991 | ] 992 | 993 | [[package]] 994 | name = "gtk-sys" 995 | version = "0.15.3" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" 998 | dependencies = [ 999 | "atk-sys", 1000 | "cairo-sys-rs", 1001 | "gdk-pixbuf-sys", 1002 | "gdk-sys", 1003 | "gio-sys", 1004 | "glib-sys", 1005 | "gobject-sys", 1006 | "libc", 1007 | "pango-sys", 1008 | "system-deps 6.0.3", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "gtk3-macros" 1013 | version = "0.15.4" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" 1016 | dependencies = [ 1017 | "anyhow", 1018 | "proc-macro-crate", 1019 | "proc-macro-error", 1020 | "proc-macro2", 1021 | "quote", 1022 | "syn", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "h2" 1027 | version = "0.3.16" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" 1030 | dependencies = [ 1031 | "bytes", 1032 | "fnv", 1033 | "futures-core", 1034 | "futures-sink", 1035 | "futures-util", 1036 | "http", 1037 | "indexmap", 1038 | "slab", 1039 | "tokio", 1040 | "tokio-util", 1041 | "tracing", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "hashbrown" 1046 | version = "0.12.3" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1049 | 1050 | [[package]] 1051 | name = "heck" 1052 | version = "0.3.3" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1055 | dependencies = [ 1056 | "unicode-segmentation", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "heck" 1061 | version = "0.4.1" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1064 | 1065 | [[package]] 1066 | name = "hermit-abi" 1067 | version = "0.2.6" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 1070 | dependencies = [ 1071 | "libc", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "hermit-abi" 1076 | version = "0.3.1" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" 1079 | 1080 | [[package]] 1081 | name = "home" 1082 | version = "0.5.4" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" 1085 | dependencies = [ 1086 | "winapi", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "html5ever" 1091 | version = "0.25.2" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" 1094 | dependencies = [ 1095 | "log", 1096 | "mac", 1097 | "markup5ever", 1098 | "proc-macro2", 1099 | "quote", 1100 | "syn", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "http" 1105 | version = "0.2.9" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 1108 | dependencies = [ 1109 | "bytes", 1110 | "fnv", 1111 | "itoa 1.0.6", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "http-body" 1116 | version = "0.4.5" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1119 | dependencies = [ 1120 | "bytes", 1121 | "http", 1122 | "pin-project-lite", 1123 | ] 1124 | 1125 | [[package]] 1126 | name = "http-range" 1127 | version = "0.1.5" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" 1130 | 1131 | [[package]] 1132 | name = "httparse" 1133 | version = "1.8.0" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1136 | 1137 | [[package]] 1138 | name = "httpdate" 1139 | version = "1.0.2" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1142 | 1143 | [[package]] 1144 | name = "hyper" 1145 | version = "0.14.25" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" 1148 | dependencies = [ 1149 | "bytes", 1150 | "futures-channel", 1151 | "futures-core", 1152 | "futures-util", 1153 | "h2", 1154 | "http", 1155 | "http-body", 1156 | "httparse", 1157 | "httpdate", 1158 | "itoa 1.0.6", 1159 | "pin-project-lite", 1160 | "socket2", 1161 | "tokio", 1162 | "tower-service", 1163 | "tracing", 1164 | "want", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "hyper-tls" 1169 | version = "0.5.0" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1172 | dependencies = [ 1173 | "bytes", 1174 | "hyper", 1175 | "native-tls", 1176 | "tokio", 1177 | "tokio-native-tls", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "ico" 1182 | version = "0.2.0" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" 1185 | dependencies = [ 1186 | "byteorder", 1187 | "png", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "ident_case" 1192 | version = "1.0.1" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1195 | 1196 | [[package]] 1197 | name = "idna" 1198 | version = "0.3.0" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 1201 | dependencies = [ 1202 | "unicode-bidi", 1203 | "unicode-normalization", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "ignore" 1208 | version = "0.4.18" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" 1211 | dependencies = [ 1212 | "crossbeam-utils", 1213 | "globset", 1214 | "lazy_static", 1215 | "log", 1216 | "memchr", 1217 | "regex", 1218 | "same-file", 1219 | "thread_local", 1220 | "walkdir", 1221 | "winapi-util", 1222 | ] 1223 | 1224 | [[package]] 1225 | name = "image" 1226 | version = "0.24.5" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945" 1229 | dependencies = [ 1230 | "bytemuck", 1231 | "byteorder", 1232 | "color_quant", 1233 | "num-rational", 1234 | "num-traits", 1235 | ] 1236 | 1237 | [[package]] 1238 | name = "indexmap" 1239 | version = "1.9.2" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 1242 | dependencies = [ 1243 | "autocfg", 1244 | "hashbrown", 1245 | ] 1246 | 1247 | [[package]] 1248 | name = "infer" 1249 | version = "0.7.0" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" 1252 | dependencies = [ 1253 | "cfb", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "instant" 1258 | version = "0.1.12" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1261 | dependencies = [ 1262 | "cfg-if", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "io-lifetimes" 1267 | version = "1.0.9" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" 1270 | dependencies = [ 1271 | "hermit-abi 0.3.1", 1272 | "libc", 1273 | "windows-sys 0.45.0", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "ipnet" 1278 | version = "2.7.2" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" 1281 | 1282 | [[package]] 1283 | name = "itoa" 1284 | version = "0.4.8" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1287 | 1288 | [[package]] 1289 | name = "itoa" 1290 | version = "1.0.6" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" 1293 | 1294 | [[package]] 1295 | name = "javascriptcore-rs" 1296 | version = "0.16.0" 1297 | source = "registry+https://github.com/rust-lang/crates.io-index" 1298 | checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" 1299 | dependencies = [ 1300 | "bitflags", 1301 | "glib", 1302 | "javascriptcore-rs-sys", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "javascriptcore-rs-sys" 1307 | version = "0.4.0" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" 1310 | dependencies = [ 1311 | "glib-sys", 1312 | "gobject-sys", 1313 | "libc", 1314 | "system-deps 5.0.0", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "jni" 1319 | version = "0.20.0" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" 1322 | dependencies = [ 1323 | "cesu8", 1324 | "combine", 1325 | "jni-sys", 1326 | "log", 1327 | "thiserror", 1328 | "walkdir", 1329 | ] 1330 | 1331 | [[package]] 1332 | name = "jni-sys" 1333 | version = "0.3.0" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1336 | 1337 | [[package]] 1338 | name = "js-sys" 1339 | version = "0.3.61" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 1342 | dependencies = [ 1343 | "wasm-bindgen", 1344 | ] 1345 | 1346 | [[package]] 1347 | name = "json-patch" 1348 | version = "0.2.7" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" 1351 | dependencies = [ 1352 | "serde", 1353 | "serde_json", 1354 | "treediff", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "kuchiki" 1359 | version = "0.8.1" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" 1362 | dependencies = [ 1363 | "cssparser", 1364 | "html5ever", 1365 | "matches", 1366 | "selectors", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "lazy_static" 1371 | version = "1.4.0" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1374 | 1375 | [[package]] 1376 | name = "libc" 1377 | version = "0.2.140" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" 1380 | 1381 | [[package]] 1382 | name = "libdbus-sys" 1383 | version = "0.2.4" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "9f8d7ae751e1cb825c840ae5e682f59b098cdfd213c350ac268b61449a5f58a0" 1386 | dependencies = [ 1387 | "pkg-config", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "line-wrap" 1392 | version = "0.1.1" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" 1395 | dependencies = [ 1396 | "safemem", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "linux-raw-sys" 1401 | version = "0.1.4" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 1404 | 1405 | [[package]] 1406 | name = "lock_api" 1407 | version = "0.4.9" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1410 | dependencies = [ 1411 | "autocfg", 1412 | "scopeguard", 1413 | ] 1414 | 1415 | [[package]] 1416 | name = "log" 1417 | version = "0.4.17" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1420 | dependencies = [ 1421 | "cfg-if", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "loom" 1426 | version = "0.5.6" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1429 | dependencies = [ 1430 | "cfg-if", 1431 | "generator", 1432 | "scoped-tls", 1433 | "serde", 1434 | "serde_json", 1435 | "tracing", 1436 | "tracing-subscriber", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "mac" 1441 | version = "0.1.1" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1444 | 1445 | [[package]] 1446 | name = "mac-notification-sys" 1447 | version = "0.5.6" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "3e72d50edb17756489e79d52eb146927bec8eba9dd48faadf9ef08bca3791ad5" 1450 | dependencies = [ 1451 | "cc", 1452 | "dirs-next", 1453 | "objc-foundation", 1454 | "objc_id", 1455 | "time", 1456 | ] 1457 | 1458 | [[package]] 1459 | name = "malloc_buf" 1460 | version = "0.0.6" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 1463 | dependencies = [ 1464 | "libc", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "markup5ever" 1469 | version = "0.10.1" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" 1472 | dependencies = [ 1473 | "log", 1474 | "phf 0.8.0", 1475 | "phf_codegen", 1476 | "string_cache", 1477 | "string_cache_codegen", 1478 | "tendril", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "matchers" 1483 | version = "0.1.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1486 | dependencies = [ 1487 | "regex-automata", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "matches" 1492 | version = "0.1.10" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 1495 | 1496 | [[package]] 1497 | name = "memchr" 1498 | version = "2.5.0" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1501 | 1502 | [[package]] 1503 | name = "memoffset" 1504 | version = "0.8.0" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" 1507 | dependencies = [ 1508 | "autocfg", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "mime" 1513 | version = "0.3.17" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1516 | 1517 | [[package]] 1518 | name = "miniz_oxide" 1519 | version = "0.6.2" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 1522 | dependencies = [ 1523 | "adler", 1524 | ] 1525 | 1526 | [[package]] 1527 | name = "mio" 1528 | version = "0.8.6" 1529 | source = "registry+https://github.com/rust-lang/crates.io-index" 1530 | checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" 1531 | dependencies = [ 1532 | "libc", 1533 | "log", 1534 | "wasi 0.11.0+wasi-snapshot-preview1", 1535 | "windows-sys 0.45.0", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "native-tls" 1540 | version = "0.2.11" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1543 | dependencies = [ 1544 | "lazy_static", 1545 | "libc", 1546 | "log", 1547 | "openssl", 1548 | "openssl-probe", 1549 | "openssl-sys", 1550 | "schannel", 1551 | "security-framework", 1552 | "security-framework-sys", 1553 | "tempfile", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "ndk" 1558 | version = "0.6.0" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" 1561 | dependencies = [ 1562 | "bitflags", 1563 | "jni-sys", 1564 | "ndk-sys", 1565 | "num_enum", 1566 | "thiserror", 1567 | ] 1568 | 1569 | [[package]] 1570 | name = "ndk-context" 1571 | version = "0.1.1" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 1574 | 1575 | [[package]] 1576 | name = "ndk-sys" 1577 | version = "0.3.0" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" 1580 | dependencies = [ 1581 | "jni-sys", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "new_debug_unreachable" 1586 | version = "1.0.4" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" 1589 | 1590 | [[package]] 1591 | name = "nodrop" 1592 | version = "0.1.14" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1595 | 1596 | [[package]] 1597 | name = "notify-rust" 1598 | version = "4.8.0" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" 1601 | dependencies = [ 1602 | "dbus", 1603 | "log", 1604 | "mac-notification-sys", 1605 | "tauri-winrt-notification", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "nu-ansi-term" 1610 | version = "0.46.0" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1613 | dependencies = [ 1614 | "overload", 1615 | "winapi", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "num-integer" 1620 | version = "0.1.45" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1623 | dependencies = [ 1624 | "autocfg", 1625 | "num-traits", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "num-rational" 1630 | version = "0.4.1" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" 1633 | dependencies = [ 1634 | "autocfg", 1635 | "num-integer", 1636 | "num-traits", 1637 | ] 1638 | 1639 | [[package]] 1640 | name = "num-traits" 1641 | version = "0.2.15" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1644 | dependencies = [ 1645 | "autocfg", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "num_cpus" 1650 | version = "1.15.0" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 1653 | dependencies = [ 1654 | "hermit-abi 0.2.6", 1655 | "libc", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "num_enum" 1660 | version = "0.5.11" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" 1663 | dependencies = [ 1664 | "num_enum_derive", 1665 | ] 1666 | 1667 | [[package]] 1668 | name = "num_enum_derive" 1669 | version = "0.5.11" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" 1672 | dependencies = [ 1673 | "proc-macro-crate", 1674 | "proc-macro2", 1675 | "quote", 1676 | "syn", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "objc" 1681 | version = "0.2.7" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 1684 | dependencies = [ 1685 | "malloc_buf", 1686 | "objc_exception", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "objc-foundation" 1691 | version = "0.1.1" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" 1694 | dependencies = [ 1695 | "block", 1696 | "objc", 1697 | "objc_id", 1698 | ] 1699 | 1700 | [[package]] 1701 | name = "objc_exception" 1702 | version = "0.1.2" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" 1705 | dependencies = [ 1706 | "cc", 1707 | ] 1708 | 1709 | [[package]] 1710 | name = "objc_id" 1711 | version = "0.1.1" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" 1714 | dependencies = [ 1715 | "objc", 1716 | ] 1717 | 1718 | [[package]] 1719 | name = "once_cell" 1720 | version = "1.17.1" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 1723 | 1724 | [[package]] 1725 | name = "open" 1726 | version = "3.2.0" 1727 | source = "registry+https://github.com/rust-lang/crates.io-index" 1728 | checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" 1729 | dependencies = [ 1730 | "pathdiff", 1731 | "windows-sys 0.42.0", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "openssl" 1736 | version = "0.10.48" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" 1739 | dependencies = [ 1740 | "bitflags", 1741 | "cfg-if", 1742 | "foreign-types", 1743 | "libc", 1744 | "once_cell", 1745 | "openssl-macros", 1746 | "openssl-sys", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "openssl-macros" 1751 | version = "0.1.0" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 1754 | dependencies = [ 1755 | "proc-macro2", 1756 | "quote", 1757 | "syn", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "openssl-probe" 1762 | version = "0.1.5" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1765 | 1766 | [[package]] 1767 | name = "openssl-sys" 1768 | version = "0.9.83" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" 1771 | dependencies = [ 1772 | "autocfg", 1773 | "cc", 1774 | "libc", 1775 | "pkg-config", 1776 | "vcpkg", 1777 | ] 1778 | 1779 | [[package]] 1780 | name = "overload" 1781 | version = "0.1.1" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1784 | 1785 | [[package]] 1786 | name = "pango" 1787 | version = "0.15.10" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" 1790 | dependencies = [ 1791 | "bitflags", 1792 | "glib", 1793 | "libc", 1794 | "once_cell", 1795 | "pango-sys", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "pango-sys" 1800 | version = "0.15.10" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" 1803 | dependencies = [ 1804 | "glib-sys", 1805 | "gobject-sys", 1806 | "libc", 1807 | "system-deps 6.0.3", 1808 | ] 1809 | 1810 | [[package]] 1811 | name = "parking_lot" 1812 | version = "0.12.1" 1813 | source = "registry+https://github.com/rust-lang/crates.io-index" 1814 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1815 | dependencies = [ 1816 | "lock_api", 1817 | "parking_lot_core", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "parking_lot_core" 1822 | version = "0.9.7" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" 1825 | dependencies = [ 1826 | "cfg-if", 1827 | "libc", 1828 | "redox_syscall", 1829 | "smallvec", 1830 | "windows-sys 0.45.0", 1831 | ] 1832 | 1833 | [[package]] 1834 | name = "paste" 1835 | version = "1.0.12" 1836 | source = "registry+https://github.com/rust-lang/crates.io-index" 1837 | checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" 1838 | 1839 | [[package]] 1840 | name = "pathdiff" 1841 | version = "0.2.1" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 1844 | 1845 | [[package]] 1846 | name = "percent-encoding" 1847 | version = "2.2.0" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1850 | 1851 | [[package]] 1852 | name = "phf" 1853 | version = "0.8.0" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 1856 | dependencies = [ 1857 | "phf_macros 0.8.0", 1858 | "phf_shared 0.8.0", 1859 | "proc-macro-hack", 1860 | ] 1861 | 1862 | [[package]] 1863 | name = "phf" 1864 | version = "0.10.1" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1867 | dependencies = [ 1868 | "phf_macros 0.10.0", 1869 | "phf_shared 0.10.0", 1870 | "proc-macro-hack", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "phf_codegen" 1875 | version = "0.8.0" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" 1878 | dependencies = [ 1879 | "phf_generator 0.8.0", 1880 | "phf_shared 0.8.0", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "phf_generator" 1885 | version = "0.8.0" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" 1888 | dependencies = [ 1889 | "phf_shared 0.8.0", 1890 | "rand 0.7.3", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "phf_generator" 1895 | version = "0.10.0" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1898 | dependencies = [ 1899 | "phf_shared 0.10.0", 1900 | "rand 0.8.5", 1901 | ] 1902 | 1903 | [[package]] 1904 | name = "phf_macros" 1905 | version = "0.8.0" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 1908 | dependencies = [ 1909 | "phf_generator 0.8.0", 1910 | "phf_shared 0.8.0", 1911 | "proc-macro-hack", 1912 | "proc-macro2", 1913 | "quote", 1914 | "syn", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "phf_macros" 1919 | version = "0.10.0" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 1922 | dependencies = [ 1923 | "phf_generator 0.10.0", 1924 | "phf_shared 0.10.0", 1925 | "proc-macro-hack", 1926 | "proc-macro2", 1927 | "quote", 1928 | "syn", 1929 | ] 1930 | 1931 | [[package]] 1932 | name = "phf_shared" 1933 | version = "0.8.0" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" 1936 | dependencies = [ 1937 | "siphasher", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "phf_shared" 1942 | version = "0.10.0" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1945 | dependencies = [ 1946 | "siphasher", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "pin-project-lite" 1951 | version = "0.2.9" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1954 | 1955 | [[package]] 1956 | name = "pin-utils" 1957 | version = "0.1.0" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1960 | 1961 | [[package]] 1962 | name = "pkg-config" 1963 | version = "0.3.26" 1964 | source = "registry+https://github.com/rust-lang/crates.io-index" 1965 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 1966 | 1967 | [[package]] 1968 | name = "plist" 1969 | version = "1.4.3" 1970 | source = "registry+https://github.com/rust-lang/crates.io-index" 1971 | checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" 1972 | dependencies = [ 1973 | "base64 0.21.0", 1974 | "indexmap", 1975 | "line-wrap", 1976 | "quick-xml 0.28.1", 1977 | "serde", 1978 | "time", 1979 | ] 1980 | 1981 | [[package]] 1982 | name = "png" 1983 | version = "0.17.7" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" 1986 | dependencies = [ 1987 | "bitflags", 1988 | "crc32fast", 1989 | "flate2", 1990 | "miniz_oxide", 1991 | ] 1992 | 1993 | [[package]] 1994 | name = "ppv-lite86" 1995 | version = "0.2.17" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1998 | 1999 | [[package]] 2000 | name = "precomputed-hash" 2001 | version = "0.1.1" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2004 | 2005 | [[package]] 2006 | name = "proc-macro-crate" 2007 | version = "1.3.1" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 2010 | dependencies = [ 2011 | "once_cell", 2012 | "toml_edit", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "proc-macro-error" 2017 | version = "1.0.4" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2020 | dependencies = [ 2021 | "proc-macro-error-attr", 2022 | "proc-macro2", 2023 | "quote", 2024 | "syn", 2025 | "version_check", 2026 | ] 2027 | 2028 | [[package]] 2029 | name = "proc-macro-error-attr" 2030 | version = "1.0.4" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2033 | dependencies = [ 2034 | "proc-macro2", 2035 | "quote", 2036 | "version_check", 2037 | ] 2038 | 2039 | [[package]] 2040 | name = "proc-macro-hack" 2041 | version = "0.5.20+deprecated" 2042 | source = "registry+https://github.com/rust-lang/crates.io-index" 2043 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 2044 | 2045 | [[package]] 2046 | name = "proc-macro2" 2047 | version = "1.0.51" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" 2050 | dependencies = [ 2051 | "unicode-ident", 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "quick-xml" 2056 | version = "0.23.1" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" 2059 | dependencies = [ 2060 | "memchr", 2061 | ] 2062 | 2063 | [[package]] 2064 | name = "quick-xml" 2065 | version = "0.28.1" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" 2068 | dependencies = [ 2069 | "memchr", 2070 | ] 2071 | 2072 | [[package]] 2073 | name = "quote" 2074 | version = "1.0.23" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 2077 | dependencies = [ 2078 | "proc-macro2", 2079 | ] 2080 | 2081 | [[package]] 2082 | name = "rand" 2083 | version = "0.7.3" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 2086 | dependencies = [ 2087 | "getrandom 0.1.16", 2088 | "libc", 2089 | "rand_chacha 0.2.2", 2090 | "rand_core 0.5.1", 2091 | "rand_hc", 2092 | "rand_pcg", 2093 | ] 2094 | 2095 | [[package]] 2096 | name = "rand" 2097 | version = "0.8.5" 2098 | source = "registry+https://github.com/rust-lang/crates.io-index" 2099 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2100 | dependencies = [ 2101 | "libc", 2102 | "rand_chacha 0.3.1", 2103 | "rand_core 0.6.4", 2104 | ] 2105 | 2106 | [[package]] 2107 | name = "rand_chacha" 2108 | version = "0.2.2" 2109 | source = "registry+https://github.com/rust-lang/crates.io-index" 2110 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 2111 | dependencies = [ 2112 | "ppv-lite86", 2113 | "rand_core 0.5.1", 2114 | ] 2115 | 2116 | [[package]] 2117 | name = "rand_chacha" 2118 | version = "0.3.1" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2121 | dependencies = [ 2122 | "ppv-lite86", 2123 | "rand_core 0.6.4", 2124 | ] 2125 | 2126 | [[package]] 2127 | name = "rand_core" 2128 | version = "0.5.1" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 2131 | dependencies = [ 2132 | "getrandom 0.1.16", 2133 | ] 2134 | 2135 | [[package]] 2136 | name = "rand_core" 2137 | version = "0.6.4" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2140 | dependencies = [ 2141 | "getrandom 0.2.8", 2142 | ] 2143 | 2144 | [[package]] 2145 | name = "rand_hc" 2146 | version = "0.2.0" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 2149 | dependencies = [ 2150 | "rand_core 0.5.1", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "rand_pcg" 2155 | version = "0.2.1" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" 2158 | dependencies = [ 2159 | "rand_core 0.5.1", 2160 | ] 2161 | 2162 | [[package]] 2163 | name = "raw-window-handle" 2164 | version = "0.5.1" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "4f851a03551ceefd30132e447f07f96cb7011d6b658374f3aed847333adb5559" 2167 | 2168 | [[package]] 2169 | name = "redox_syscall" 2170 | version = "0.2.16" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2173 | dependencies = [ 2174 | "bitflags", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "redox_users" 2179 | version = "0.4.3" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2182 | dependencies = [ 2183 | "getrandom 0.2.8", 2184 | "redox_syscall", 2185 | "thiserror", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "regex" 2190 | version = "1.7.1" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" 2193 | dependencies = [ 2194 | "aho-corasick", 2195 | "memchr", 2196 | "regex-syntax", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "regex-automata" 2201 | version = "0.1.10" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2204 | dependencies = [ 2205 | "regex-syntax", 2206 | ] 2207 | 2208 | [[package]] 2209 | name = "regex-syntax" 2210 | version = "0.6.28" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" 2213 | 2214 | [[package]] 2215 | name = "reqwest" 2216 | version = "0.11.16" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" 2219 | dependencies = [ 2220 | "base64 0.21.0", 2221 | "bytes", 2222 | "encoding_rs", 2223 | "futures-core", 2224 | "futures-util", 2225 | "h2", 2226 | "http", 2227 | "http-body", 2228 | "hyper", 2229 | "hyper-tls", 2230 | "ipnet", 2231 | "js-sys", 2232 | "log", 2233 | "mime", 2234 | "native-tls", 2235 | "once_cell", 2236 | "percent-encoding", 2237 | "pin-project-lite", 2238 | "serde", 2239 | "serde_json", 2240 | "serde_urlencoded", 2241 | "tokio", 2242 | "tokio-native-tls", 2243 | "tower-service", 2244 | "url", 2245 | "wasm-bindgen", 2246 | "wasm-bindgen-futures", 2247 | "web-sys", 2248 | "winreg", 2249 | ] 2250 | 2251 | [[package]] 2252 | name = "rfd" 2253 | version = "0.10.0" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" 2256 | dependencies = [ 2257 | "block", 2258 | "dispatch", 2259 | "glib-sys", 2260 | "gobject-sys", 2261 | "gtk-sys", 2262 | "js-sys", 2263 | "lazy_static", 2264 | "log", 2265 | "objc", 2266 | "objc-foundation", 2267 | "objc_id", 2268 | "raw-window-handle", 2269 | "wasm-bindgen", 2270 | "wasm-bindgen-futures", 2271 | "web-sys", 2272 | "windows 0.37.0", 2273 | ] 2274 | 2275 | [[package]] 2276 | name = "rustc_version" 2277 | version = "0.4.0" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 2280 | dependencies = [ 2281 | "semver", 2282 | ] 2283 | 2284 | [[package]] 2285 | name = "rustix" 2286 | version = "0.36.11" 2287 | source = "registry+https://github.com/rust-lang/crates.io-index" 2288 | checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e" 2289 | dependencies = [ 2290 | "bitflags", 2291 | "errno", 2292 | "io-lifetimes", 2293 | "libc", 2294 | "linux-raw-sys", 2295 | "windows-sys 0.45.0", 2296 | ] 2297 | 2298 | [[package]] 2299 | name = "rustversion" 2300 | version = "1.0.12" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" 2303 | 2304 | [[package]] 2305 | name = "ryu" 2306 | version = "1.0.13" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" 2309 | 2310 | [[package]] 2311 | name = "safemem" 2312 | version = "0.3.3" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2315 | 2316 | [[package]] 2317 | name = "same-file" 2318 | version = "1.0.6" 2319 | source = "registry+https://github.com/rust-lang/crates.io-index" 2320 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2321 | dependencies = [ 2322 | "winapi-util", 2323 | ] 2324 | 2325 | [[package]] 2326 | name = "schannel" 2327 | version = "0.1.21" 2328 | source = "registry+https://github.com/rust-lang/crates.io-index" 2329 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 2330 | dependencies = [ 2331 | "windows-sys 0.42.0", 2332 | ] 2333 | 2334 | [[package]] 2335 | name = "scoped-tls" 2336 | version = "1.0.1" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2339 | 2340 | [[package]] 2341 | name = "scopeguard" 2342 | version = "1.1.0" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2345 | 2346 | [[package]] 2347 | name = "security-framework" 2348 | version = "2.8.2" 2349 | source = "registry+https://github.com/rust-lang/crates.io-index" 2350 | checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" 2351 | dependencies = [ 2352 | "bitflags", 2353 | "core-foundation", 2354 | "core-foundation-sys", 2355 | "libc", 2356 | "security-framework-sys", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "security-framework-sys" 2361 | version = "2.8.0" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 2364 | dependencies = [ 2365 | "core-foundation-sys", 2366 | "libc", 2367 | ] 2368 | 2369 | [[package]] 2370 | name = "selectors" 2371 | version = "0.22.0" 2372 | source = "registry+https://github.com/rust-lang/crates.io-index" 2373 | checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 2374 | dependencies = [ 2375 | "bitflags", 2376 | "cssparser", 2377 | "derive_more", 2378 | "fxhash", 2379 | "log", 2380 | "matches", 2381 | "phf 0.8.0", 2382 | "phf_codegen", 2383 | "precomputed-hash", 2384 | "servo_arc", 2385 | "smallvec", 2386 | "thin-slice", 2387 | ] 2388 | 2389 | [[package]] 2390 | name = "semver" 2391 | version = "1.0.16" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" 2394 | dependencies = [ 2395 | "serde", 2396 | ] 2397 | 2398 | [[package]] 2399 | name = "serde" 2400 | version = "1.0.154" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "8cdd151213925e7f1ab45a9bbfb129316bd00799784b174b7cc7bcd16961c49e" 2403 | dependencies = [ 2404 | "serde_derive", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "serde_derive" 2409 | version = "1.0.154" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "4fc80d722935453bcafdc2c9a73cd6fac4dc1938f0346035d84bf99fa9e33217" 2412 | dependencies = [ 2413 | "proc-macro2", 2414 | "quote", 2415 | "syn", 2416 | ] 2417 | 2418 | [[package]] 2419 | name = "serde_json" 2420 | version = "1.0.94" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" 2423 | dependencies = [ 2424 | "itoa 1.0.6", 2425 | "ryu", 2426 | "serde", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "serde_repr" 2431 | version = "0.1.11" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc" 2434 | dependencies = [ 2435 | "proc-macro2", 2436 | "quote", 2437 | "syn", 2438 | ] 2439 | 2440 | [[package]] 2441 | name = "serde_urlencoded" 2442 | version = "0.7.1" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2445 | dependencies = [ 2446 | "form_urlencoded", 2447 | "itoa 1.0.6", 2448 | "ryu", 2449 | "serde", 2450 | ] 2451 | 2452 | [[package]] 2453 | name = "serde_with" 2454 | version = "1.14.0" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" 2457 | dependencies = [ 2458 | "serde", 2459 | "serde_with_macros", 2460 | ] 2461 | 2462 | [[package]] 2463 | name = "serde_with_macros" 2464 | version = "1.5.2" 2465 | source = "registry+https://github.com/rust-lang/crates.io-index" 2466 | checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" 2467 | dependencies = [ 2468 | "darling", 2469 | "proc-macro2", 2470 | "quote", 2471 | "syn", 2472 | ] 2473 | 2474 | [[package]] 2475 | name = "serialize-to-javascript" 2476 | version = "0.1.1" 2477 | source = "registry+https://github.com/rust-lang/crates.io-index" 2478 | checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 2479 | dependencies = [ 2480 | "serde", 2481 | "serde_json", 2482 | "serialize-to-javascript-impl", 2483 | ] 2484 | 2485 | [[package]] 2486 | name = "serialize-to-javascript-impl" 2487 | version = "0.1.1" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 2490 | dependencies = [ 2491 | "proc-macro2", 2492 | "quote", 2493 | "syn", 2494 | ] 2495 | 2496 | [[package]] 2497 | name = "servo_arc" 2498 | version = "0.1.1" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 2501 | dependencies = [ 2502 | "nodrop", 2503 | "stable_deref_trait", 2504 | ] 2505 | 2506 | [[package]] 2507 | name = "sha2" 2508 | version = "0.10.6" 2509 | source = "registry+https://github.com/rust-lang/crates.io-index" 2510 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 2511 | dependencies = [ 2512 | "cfg-if", 2513 | "cpufeatures", 2514 | "digest", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "sharded-slab" 2519 | version = "0.1.4" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2522 | dependencies = [ 2523 | "lazy_static", 2524 | ] 2525 | 2526 | [[package]] 2527 | name = "siphasher" 2528 | version = "0.3.10" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 2531 | 2532 | [[package]] 2533 | name = "slab" 2534 | version = "0.4.8" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 2537 | dependencies = [ 2538 | "autocfg", 2539 | ] 2540 | 2541 | [[package]] 2542 | name = "smallvec" 2543 | version = "1.10.0" 2544 | source = "registry+https://github.com/rust-lang/crates.io-index" 2545 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 2546 | 2547 | [[package]] 2548 | name = "socket2" 2549 | version = "0.4.9" 2550 | source = "registry+https://github.com/rust-lang/crates.io-index" 2551 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 2552 | dependencies = [ 2553 | "libc", 2554 | "winapi", 2555 | ] 2556 | 2557 | [[package]] 2558 | name = "soup2" 2559 | version = "0.2.1" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" 2562 | dependencies = [ 2563 | "bitflags", 2564 | "gio", 2565 | "glib", 2566 | "libc", 2567 | "once_cell", 2568 | "soup2-sys", 2569 | ] 2570 | 2571 | [[package]] 2572 | name = "soup2-sys" 2573 | version = "0.2.0" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" 2576 | dependencies = [ 2577 | "bitflags", 2578 | "gio-sys", 2579 | "glib-sys", 2580 | "gobject-sys", 2581 | "libc", 2582 | "system-deps 5.0.0", 2583 | ] 2584 | 2585 | [[package]] 2586 | name = "stable_deref_trait" 2587 | version = "1.2.0" 2588 | source = "registry+https://github.com/rust-lang/crates.io-index" 2589 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2590 | 2591 | [[package]] 2592 | name = "state" 2593 | version = "0.5.3" 2594 | source = "registry+https://github.com/rust-lang/crates.io-index" 2595 | checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" 2596 | dependencies = [ 2597 | "loom", 2598 | ] 2599 | 2600 | [[package]] 2601 | name = "string_cache" 2602 | version = "0.8.7" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 2605 | dependencies = [ 2606 | "new_debug_unreachable", 2607 | "once_cell", 2608 | "parking_lot", 2609 | "phf_shared 0.10.0", 2610 | "precomputed-hash", 2611 | "serde", 2612 | ] 2613 | 2614 | [[package]] 2615 | name = "string_cache_codegen" 2616 | version = "0.5.2" 2617 | source = "registry+https://github.com/rust-lang/crates.io-index" 2618 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2619 | dependencies = [ 2620 | "phf_generator 0.10.0", 2621 | "phf_shared 0.10.0", 2622 | "proc-macro2", 2623 | "quote", 2624 | ] 2625 | 2626 | [[package]] 2627 | name = "strsim" 2628 | version = "0.10.0" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2631 | 2632 | [[package]] 2633 | name = "strum" 2634 | version = "0.22.0" 2635 | source = "registry+https://github.com/rust-lang/crates.io-index" 2636 | checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" 2637 | dependencies = [ 2638 | "strum_macros", 2639 | ] 2640 | 2641 | [[package]] 2642 | name = "strum_macros" 2643 | version = "0.22.0" 2644 | source = "registry+https://github.com/rust-lang/crates.io-index" 2645 | checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb" 2646 | dependencies = [ 2647 | "heck 0.3.3", 2648 | "proc-macro2", 2649 | "quote", 2650 | "syn", 2651 | ] 2652 | 2653 | [[package]] 2654 | name = "syn" 2655 | version = "1.0.109" 2656 | source = "registry+https://github.com/rust-lang/crates.io-index" 2657 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2658 | dependencies = [ 2659 | "proc-macro2", 2660 | "quote", 2661 | "unicode-ident", 2662 | ] 2663 | 2664 | [[package]] 2665 | name = "system-deps" 2666 | version = "5.0.0" 2667 | source = "registry+https://github.com/rust-lang/crates.io-index" 2668 | checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" 2669 | dependencies = [ 2670 | "cfg-expr 0.9.1", 2671 | "heck 0.3.3", 2672 | "pkg-config", 2673 | "toml", 2674 | "version-compare 0.0.11", 2675 | ] 2676 | 2677 | [[package]] 2678 | name = "system-deps" 2679 | version = "6.0.3" 2680 | source = "registry+https://github.com/rust-lang/crates.io-index" 2681 | checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" 2682 | dependencies = [ 2683 | "cfg-expr 0.11.0", 2684 | "heck 0.4.1", 2685 | "pkg-config", 2686 | "toml", 2687 | "version-compare 0.1.1", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "tao" 2692 | version = "0.15.8" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6" 2695 | dependencies = [ 2696 | "bitflags", 2697 | "cairo-rs", 2698 | "cc", 2699 | "cocoa", 2700 | "core-foundation", 2701 | "core-graphics", 2702 | "crossbeam-channel", 2703 | "dispatch", 2704 | "gdk", 2705 | "gdk-pixbuf", 2706 | "gdk-sys", 2707 | "gdkx11-sys", 2708 | "gio", 2709 | "glib", 2710 | "glib-sys", 2711 | "gtk", 2712 | "image", 2713 | "instant", 2714 | "jni", 2715 | "lazy_static", 2716 | "libc", 2717 | "log", 2718 | "ndk", 2719 | "ndk-context", 2720 | "ndk-sys", 2721 | "objc", 2722 | "once_cell", 2723 | "parking_lot", 2724 | "paste", 2725 | "png", 2726 | "raw-window-handle", 2727 | "scopeguard", 2728 | "serde", 2729 | "unicode-segmentation", 2730 | "uuid 1.3.0", 2731 | "windows 0.39.0", 2732 | "windows-implement", 2733 | "x11-dl", 2734 | ] 2735 | 2736 | [[package]] 2737 | name = "tar" 2738 | version = "0.4.38" 2739 | source = "registry+https://github.com/rust-lang/crates.io-index" 2740 | checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" 2741 | dependencies = [ 2742 | "filetime", 2743 | "libc", 2744 | "xattr", 2745 | ] 2746 | 2747 | [[package]] 2748 | name = "tauri" 2749 | version = "1.2.4" 2750 | source = "registry+https://github.com/rust-lang/crates.io-index" 2751 | checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449" 2752 | dependencies = [ 2753 | "anyhow", 2754 | "cocoa", 2755 | "dirs-next", 2756 | "embed_plist", 2757 | "encoding_rs", 2758 | "flate2", 2759 | "futures-util", 2760 | "glib", 2761 | "glob", 2762 | "gtk", 2763 | "heck 0.4.1", 2764 | "http", 2765 | "ignore", 2766 | "notify-rust", 2767 | "objc", 2768 | "once_cell", 2769 | "open", 2770 | "percent-encoding", 2771 | "rand 0.8.5", 2772 | "raw-window-handle", 2773 | "regex", 2774 | "rfd", 2775 | "semver", 2776 | "serde", 2777 | "serde_json", 2778 | "serde_repr", 2779 | "serialize-to-javascript", 2780 | "state", 2781 | "tar", 2782 | "tauri-macros", 2783 | "tauri-runtime", 2784 | "tauri-runtime-wry", 2785 | "tauri-utils", 2786 | "tempfile", 2787 | "thiserror", 2788 | "tokio", 2789 | "url", 2790 | "uuid 1.3.0", 2791 | "webkit2gtk", 2792 | "webview2-com", 2793 | "windows 0.39.0", 2794 | ] 2795 | 2796 | [[package]] 2797 | name = "tauri-build" 2798 | version = "1.2.1" 2799 | source = "registry+https://github.com/rust-lang/crates.io-index" 2800 | checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4" 2801 | dependencies = [ 2802 | "anyhow", 2803 | "cargo_toml", 2804 | "heck 0.4.1", 2805 | "json-patch", 2806 | "semver", 2807 | "serde_json", 2808 | "tauri-utils", 2809 | "winres", 2810 | ] 2811 | 2812 | [[package]] 2813 | name = "tauri-codegen" 2814 | version = "1.2.1" 2815 | source = "registry+https://github.com/rust-lang/crates.io-index" 2816 | checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251" 2817 | dependencies = [ 2818 | "base64 0.13.1", 2819 | "brotli", 2820 | "ico", 2821 | "json-patch", 2822 | "plist", 2823 | "png", 2824 | "proc-macro2", 2825 | "quote", 2826 | "regex", 2827 | "semver", 2828 | "serde", 2829 | "serde_json", 2830 | "sha2", 2831 | "tauri-utils", 2832 | "thiserror", 2833 | "time", 2834 | "uuid 1.3.0", 2835 | "walkdir", 2836 | ] 2837 | 2838 | [[package]] 2839 | name = "tauri-macros" 2840 | version = "1.2.1" 2841 | source = "registry+https://github.com/rust-lang/crates.io-index" 2842 | checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075" 2843 | dependencies = [ 2844 | "heck 0.4.1", 2845 | "proc-macro2", 2846 | "quote", 2847 | "syn", 2848 | "tauri-codegen", 2849 | "tauri-utils", 2850 | ] 2851 | 2852 | [[package]] 2853 | name = "tauri-runtime" 2854 | version = "0.12.1" 2855 | source = "registry+https://github.com/rust-lang/crates.io-index" 2856 | checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b" 2857 | dependencies = [ 2858 | "gtk", 2859 | "http", 2860 | "http-range", 2861 | "rand 0.8.5", 2862 | "raw-window-handle", 2863 | "serde", 2864 | "serde_json", 2865 | "tauri-utils", 2866 | "thiserror", 2867 | "uuid 1.3.0", 2868 | "webview2-com", 2869 | "windows 0.39.0", 2870 | ] 2871 | 2872 | [[package]] 2873 | name = "tauri-runtime-wry" 2874 | version = "0.12.2" 2875 | source = "registry+https://github.com/rust-lang/crates.io-index" 2876 | checksum = "36b1c5764a41a13176a4599b5b7bd0881bea7d94dfe45e1e755f789b98317e30" 2877 | dependencies = [ 2878 | "cocoa", 2879 | "gtk", 2880 | "percent-encoding", 2881 | "rand 0.8.5", 2882 | "raw-window-handle", 2883 | "tauri-runtime", 2884 | "tauri-utils", 2885 | "uuid 1.3.0", 2886 | "webkit2gtk", 2887 | "webview2-com", 2888 | "windows 0.39.0", 2889 | "wry", 2890 | ] 2891 | 2892 | [[package]] 2893 | name = "tauri-utils" 2894 | version = "1.2.1" 2895 | source = "registry+https://github.com/rust-lang/crates.io-index" 2896 | checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1" 2897 | dependencies = [ 2898 | "brotli", 2899 | "ctor", 2900 | "glob", 2901 | "heck 0.4.1", 2902 | "html5ever", 2903 | "infer", 2904 | "json-patch", 2905 | "kuchiki", 2906 | "memchr", 2907 | "phf 0.10.1", 2908 | "proc-macro2", 2909 | "quote", 2910 | "semver", 2911 | "serde", 2912 | "serde_json", 2913 | "serde_with", 2914 | "thiserror", 2915 | "url", 2916 | "walkdir", 2917 | "windows 0.39.0", 2918 | ] 2919 | 2920 | [[package]] 2921 | name = "tauri-winrt-notification" 2922 | version = "0.1.0" 2923 | source = "registry+https://github.com/rust-lang/crates.io-index" 2924 | checksum = "c58de036c4d2e20717024de2a3c4bf56c301f07b21bc8ef9b57189fce06f1f3b" 2925 | dependencies = [ 2926 | "quick-xml 0.23.1", 2927 | "strum", 2928 | "windows 0.39.0", 2929 | ] 2930 | 2931 | [[package]] 2932 | name = "tempfile" 2933 | version = "3.4.0" 2934 | source = "registry+https://github.com/rust-lang/crates.io-index" 2935 | checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" 2936 | dependencies = [ 2937 | "cfg-if", 2938 | "fastrand", 2939 | "redox_syscall", 2940 | "rustix", 2941 | "windows-sys 0.42.0", 2942 | ] 2943 | 2944 | [[package]] 2945 | name = "tendril" 2946 | version = "0.4.3" 2947 | source = "registry+https://github.com/rust-lang/crates.io-index" 2948 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2949 | dependencies = [ 2950 | "futf", 2951 | "mac", 2952 | "utf-8", 2953 | ] 2954 | 2955 | [[package]] 2956 | name = "thin-slice" 2957 | version = "0.1.1" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 2960 | 2961 | [[package]] 2962 | name = "thiserror" 2963 | version = "1.0.39" 2964 | source = "registry+https://github.com/rust-lang/crates.io-index" 2965 | checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" 2966 | dependencies = [ 2967 | "thiserror-impl", 2968 | ] 2969 | 2970 | [[package]] 2971 | name = "thiserror-impl" 2972 | version = "1.0.39" 2973 | source = "registry+https://github.com/rust-lang/crates.io-index" 2974 | checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" 2975 | dependencies = [ 2976 | "proc-macro2", 2977 | "quote", 2978 | "syn", 2979 | ] 2980 | 2981 | [[package]] 2982 | name = "thread_local" 2983 | version = "1.1.7" 2984 | source = "registry+https://github.com/rust-lang/crates.io-index" 2985 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 2986 | dependencies = [ 2987 | "cfg-if", 2988 | "once_cell", 2989 | ] 2990 | 2991 | [[package]] 2992 | name = "time" 2993 | version = "0.3.20" 2994 | source = "registry+https://github.com/rust-lang/crates.io-index" 2995 | checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" 2996 | dependencies = [ 2997 | "itoa 1.0.6", 2998 | "serde", 2999 | "time-core", 3000 | "time-macros", 3001 | ] 3002 | 3003 | [[package]] 3004 | name = "time-core" 3005 | version = "0.1.0" 3006 | source = "registry+https://github.com/rust-lang/crates.io-index" 3007 | checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" 3008 | 3009 | [[package]] 3010 | name = "time-macros" 3011 | version = "0.2.8" 3012 | source = "registry+https://github.com/rust-lang/crates.io-index" 3013 | checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" 3014 | dependencies = [ 3015 | "time-core", 3016 | ] 3017 | 3018 | [[package]] 3019 | name = "tinyvec" 3020 | version = "1.6.0" 3021 | source = "registry+https://github.com/rust-lang/crates.io-index" 3022 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3023 | dependencies = [ 3024 | "tinyvec_macros", 3025 | ] 3026 | 3027 | [[package]] 3028 | name = "tinyvec_macros" 3029 | version = "0.1.1" 3030 | source = "registry+https://github.com/rust-lang/crates.io-index" 3031 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3032 | 3033 | [[package]] 3034 | name = "tokio" 3035 | version = "1.26.0" 3036 | source = "registry+https://github.com/rust-lang/crates.io-index" 3037 | checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" 3038 | dependencies = [ 3039 | "autocfg", 3040 | "bytes", 3041 | "libc", 3042 | "memchr", 3043 | "mio", 3044 | "num_cpus", 3045 | "pin-project-lite", 3046 | "socket2", 3047 | "windows-sys 0.45.0", 3048 | ] 3049 | 3050 | [[package]] 3051 | name = "tokio-native-tls" 3052 | version = "0.3.1" 3053 | source = "registry+https://github.com/rust-lang/crates.io-index" 3054 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 3055 | dependencies = [ 3056 | "native-tls", 3057 | "tokio", 3058 | ] 3059 | 3060 | [[package]] 3061 | name = "tokio-util" 3062 | version = "0.7.7" 3063 | source = "registry+https://github.com/rust-lang/crates.io-index" 3064 | checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" 3065 | dependencies = [ 3066 | "bytes", 3067 | "futures-core", 3068 | "futures-sink", 3069 | "pin-project-lite", 3070 | "tokio", 3071 | "tracing", 3072 | ] 3073 | 3074 | [[package]] 3075 | name = "toml" 3076 | version = "0.5.11" 3077 | source = "registry+https://github.com/rust-lang/crates.io-index" 3078 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 3079 | dependencies = [ 3080 | "serde", 3081 | ] 3082 | 3083 | [[package]] 3084 | name = "toml_datetime" 3085 | version = "0.6.1" 3086 | source = "registry+https://github.com/rust-lang/crates.io-index" 3087 | checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" 3088 | 3089 | [[package]] 3090 | name = "toml_edit" 3091 | version = "0.19.4" 3092 | source = "registry+https://github.com/rust-lang/crates.io-index" 3093 | checksum = "9a1eb0622d28f4b9c90adc4ea4b2b46b47663fde9ac5fafcb14a1369d5508825" 3094 | dependencies = [ 3095 | "indexmap", 3096 | "toml_datetime", 3097 | "winnow", 3098 | ] 3099 | 3100 | [[package]] 3101 | name = "tower-service" 3102 | version = "0.3.2" 3103 | source = "registry+https://github.com/rust-lang/crates.io-index" 3104 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3105 | 3106 | [[package]] 3107 | name = "tracing" 3108 | version = "0.1.37" 3109 | source = "registry+https://github.com/rust-lang/crates.io-index" 3110 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3111 | dependencies = [ 3112 | "cfg-if", 3113 | "pin-project-lite", 3114 | "tracing-attributes", 3115 | "tracing-core", 3116 | ] 3117 | 3118 | [[package]] 3119 | name = "tracing-attributes" 3120 | version = "0.1.23" 3121 | source = "registry+https://github.com/rust-lang/crates.io-index" 3122 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 3123 | dependencies = [ 3124 | "proc-macro2", 3125 | "quote", 3126 | "syn", 3127 | ] 3128 | 3129 | [[package]] 3130 | name = "tracing-core" 3131 | version = "0.1.30" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 3134 | dependencies = [ 3135 | "once_cell", 3136 | "valuable", 3137 | ] 3138 | 3139 | [[package]] 3140 | name = "tracing-log" 3141 | version = "0.1.3" 3142 | source = "registry+https://github.com/rust-lang/crates.io-index" 3143 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3144 | dependencies = [ 3145 | "lazy_static", 3146 | "log", 3147 | "tracing-core", 3148 | ] 3149 | 3150 | [[package]] 3151 | name = "tracing-subscriber" 3152 | version = "0.3.16" 3153 | source = "registry+https://github.com/rust-lang/crates.io-index" 3154 | checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" 3155 | dependencies = [ 3156 | "matchers", 3157 | "nu-ansi-term", 3158 | "once_cell", 3159 | "regex", 3160 | "sharded-slab", 3161 | "smallvec", 3162 | "thread_local", 3163 | "tracing", 3164 | "tracing-core", 3165 | "tracing-log", 3166 | ] 3167 | 3168 | [[package]] 3169 | name = "treediff" 3170 | version = "3.0.2" 3171 | source = "registry+https://github.com/rust-lang/crates.io-index" 3172 | checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" 3173 | dependencies = [ 3174 | "serde_json", 3175 | ] 3176 | 3177 | [[package]] 3178 | name = "try-lock" 3179 | version = "0.2.4" 3180 | source = "registry+https://github.com/rust-lang/crates.io-index" 3181 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 3182 | 3183 | [[package]] 3184 | name = "typenum" 3185 | version = "1.16.0" 3186 | source = "registry+https://github.com/rust-lang/crates.io-index" 3187 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 3188 | 3189 | [[package]] 3190 | name = "unicode-bidi" 3191 | version = "0.3.11" 3192 | source = "registry+https://github.com/rust-lang/crates.io-index" 3193 | checksum = "524b68aca1d05e03fdf03fcdce2c6c94b6daf6d16861ddaa7e4f2b6638a9052c" 3194 | 3195 | [[package]] 3196 | name = "unicode-ident" 3197 | version = "1.0.8" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 3200 | 3201 | [[package]] 3202 | name = "unicode-normalization" 3203 | version = "0.1.22" 3204 | source = "registry+https://github.com/rust-lang/crates.io-index" 3205 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3206 | dependencies = [ 3207 | "tinyvec", 3208 | ] 3209 | 3210 | [[package]] 3211 | name = "unicode-segmentation" 3212 | version = "1.10.1" 3213 | source = "registry+https://github.com/rust-lang/crates.io-index" 3214 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 3215 | 3216 | [[package]] 3217 | name = "url" 3218 | version = "2.3.1" 3219 | source = "registry+https://github.com/rust-lang/crates.io-index" 3220 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 3221 | dependencies = [ 3222 | "form_urlencoded", 3223 | "idna", 3224 | "percent-encoding", 3225 | "serde", 3226 | ] 3227 | 3228 | [[package]] 3229 | name = "utf-8" 3230 | version = "0.7.6" 3231 | source = "registry+https://github.com/rust-lang/crates.io-index" 3232 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3233 | 3234 | [[package]] 3235 | name = "uuid" 3236 | version = "0.8.2" 3237 | source = "registry+https://github.com/rust-lang/crates.io-index" 3238 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 3239 | 3240 | [[package]] 3241 | name = "uuid" 3242 | version = "1.3.0" 3243 | source = "registry+https://github.com/rust-lang/crates.io-index" 3244 | checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" 3245 | dependencies = [ 3246 | "getrandom 0.2.8", 3247 | ] 3248 | 3249 | [[package]] 3250 | name = "valuable" 3251 | version = "0.1.0" 3252 | source = "registry+https://github.com/rust-lang/crates.io-index" 3253 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3254 | 3255 | [[package]] 3256 | name = "vcpkg" 3257 | version = "0.2.15" 3258 | source = "registry+https://github.com/rust-lang/crates.io-index" 3259 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3260 | 3261 | [[package]] 3262 | name = "version-compare" 3263 | version = "0.0.11" 3264 | source = "registry+https://github.com/rust-lang/crates.io-index" 3265 | checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" 3266 | 3267 | [[package]] 3268 | name = "version-compare" 3269 | version = "0.1.1" 3270 | source = "registry+https://github.com/rust-lang/crates.io-index" 3271 | checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" 3272 | 3273 | [[package]] 3274 | name = "version_check" 3275 | version = "0.9.4" 3276 | source = "registry+https://github.com/rust-lang/crates.io-index" 3277 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3278 | 3279 | [[package]] 3280 | name = "walkdir" 3281 | version = "2.3.2" 3282 | source = "registry+https://github.com/rust-lang/crates.io-index" 3283 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 3284 | dependencies = [ 3285 | "same-file", 3286 | "winapi", 3287 | "winapi-util", 3288 | ] 3289 | 3290 | [[package]] 3291 | name = "want" 3292 | version = "0.3.0" 3293 | source = "registry+https://github.com/rust-lang/crates.io-index" 3294 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3295 | dependencies = [ 3296 | "log", 3297 | "try-lock", 3298 | ] 3299 | 3300 | [[package]] 3301 | name = "wasi" 3302 | version = "0.9.0+wasi-snapshot-preview1" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 3305 | 3306 | [[package]] 3307 | name = "wasi" 3308 | version = "0.11.0+wasi-snapshot-preview1" 3309 | source = "registry+https://github.com/rust-lang/crates.io-index" 3310 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3311 | 3312 | [[package]] 3313 | name = "wasm-bindgen" 3314 | version = "0.2.84" 3315 | source = "registry+https://github.com/rust-lang/crates.io-index" 3316 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 3317 | dependencies = [ 3318 | "cfg-if", 3319 | "wasm-bindgen-macro", 3320 | ] 3321 | 3322 | [[package]] 3323 | name = "wasm-bindgen-backend" 3324 | version = "0.2.84" 3325 | source = "registry+https://github.com/rust-lang/crates.io-index" 3326 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 3327 | dependencies = [ 3328 | "bumpalo", 3329 | "log", 3330 | "once_cell", 3331 | "proc-macro2", 3332 | "quote", 3333 | "syn", 3334 | "wasm-bindgen-shared", 3335 | ] 3336 | 3337 | [[package]] 3338 | name = "wasm-bindgen-futures" 3339 | version = "0.4.34" 3340 | source = "registry+https://github.com/rust-lang/crates.io-index" 3341 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 3342 | dependencies = [ 3343 | "cfg-if", 3344 | "js-sys", 3345 | "wasm-bindgen", 3346 | "web-sys", 3347 | ] 3348 | 3349 | [[package]] 3350 | name = "wasm-bindgen-macro" 3351 | version = "0.2.84" 3352 | source = "registry+https://github.com/rust-lang/crates.io-index" 3353 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 3354 | dependencies = [ 3355 | "quote", 3356 | "wasm-bindgen-macro-support", 3357 | ] 3358 | 3359 | [[package]] 3360 | name = "wasm-bindgen-macro-support" 3361 | version = "0.2.84" 3362 | source = "registry+https://github.com/rust-lang/crates.io-index" 3363 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 3364 | dependencies = [ 3365 | "proc-macro2", 3366 | "quote", 3367 | "syn", 3368 | "wasm-bindgen-backend", 3369 | "wasm-bindgen-shared", 3370 | ] 3371 | 3372 | [[package]] 3373 | name = "wasm-bindgen-shared" 3374 | version = "0.2.84" 3375 | source = "registry+https://github.com/rust-lang/crates.io-index" 3376 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 3377 | 3378 | [[package]] 3379 | name = "web-sys" 3380 | version = "0.3.61" 3381 | source = "registry+https://github.com/rust-lang/crates.io-index" 3382 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 3383 | dependencies = [ 3384 | "js-sys", 3385 | "wasm-bindgen", 3386 | ] 3387 | 3388 | [[package]] 3389 | name = "webkit2gtk" 3390 | version = "0.18.2" 3391 | source = "registry+https://github.com/rust-lang/crates.io-index" 3392 | checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" 3393 | dependencies = [ 3394 | "bitflags", 3395 | "cairo-rs", 3396 | "gdk", 3397 | "gdk-sys", 3398 | "gio", 3399 | "gio-sys", 3400 | "glib", 3401 | "glib-sys", 3402 | "gobject-sys", 3403 | "gtk", 3404 | "gtk-sys", 3405 | "javascriptcore-rs", 3406 | "libc", 3407 | "once_cell", 3408 | "soup2", 3409 | "webkit2gtk-sys", 3410 | ] 3411 | 3412 | [[package]] 3413 | name = "webkit2gtk-sys" 3414 | version = "0.18.0" 3415 | source = "registry+https://github.com/rust-lang/crates.io-index" 3416 | checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" 3417 | dependencies = [ 3418 | "atk-sys", 3419 | "bitflags", 3420 | "cairo-sys-rs", 3421 | "gdk-pixbuf-sys", 3422 | "gdk-sys", 3423 | "gio-sys", 3424 | "glib-sys", 3425 | "gobject-sys", 3426 | "gtk-sys", 3427 | "javascriptcore-rs-sys", 3428 | "libc", 3429 | "pango-sys", 3430 | "pkg-config", 3431 | "soup2-sys", 3432 | "system-deps 6.0.3", 3433 | ] 3434 | 3435 | [[package]] 3436 | name = "webview2-com" 3437 | version = "0.19.1" 3438 | source = "registry+https://github.com/rust-lang/crates.io-index" 3439 | checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" 3440 | dependencies = [ 3441 | "webview2-com-macros", 3442 | "webview2-com-sys", 3443 | "windows 0.39.0", 3444 | "windows-implement", 3445 | ] 3446 | 3447 | [[package]] 3448 | name = "webview2-com-macros" 3449 | version = "0.6.0" 3450 | source = "registry+https://github.com/rust-lang/crates.io-index" 3451 | checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" 3452 | dependencies = [ 3453 | "proc-macro2", 3454 | "quote", 3455 | "syn", 3456 | ] 3457 | 3458 | [[package]] 3459 | name = "webview2-com-sys" 3460 | version = "0.19.0" 3461 | source = "registry+https://github.com/rust-lang/crates.io-index" 3462 | checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" 3463 | dependencies = [ 3464 | "regex", 3465 | "serde", 3466 | "serde_json", 3467 | "thiserror", 3468 | "windows 0.39.0", 3469 | "windows-bindgen", 3470 | "windows-metadata", 3471 | ] 3472 | 3473 | [[package]] 3474 | name = "winapi" 3475 | version = "0.3.9" 3476 | source = "registry+https://github.com/rust-lang/crates.io-index" 3477 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3478 | dependencies = [ 3479 | "winapi-i686-pc-windows-gnu", 3480 | "winapi-x86_64-pc-windows-gnu", 3481 | ] 3482 | 3483 | [[package]] 3484 | name = "winapi-i686-pc-windows-gnu" 3485 | version = "0.4.0" 3486 | source = "registry+https://github.com/rust-lang/crates.io-index" 3487 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3488 | 3489 | [[package]] 3490 | name = "winapi-util" 3491 | version = "0.1.5" 3492 | source = "registry+https://github.com/rust-lang/crates.io-index" 3493 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3494 | dependencies = [ 3495 | "winapi", 3496 | ] 3497 | 3498 | [[package]] 3499 | name = "winapi-x86_64-pc-windows-gnu" 3500 | version = "0.4.0" 3501 | source = "registry+https://github.com/rust-lang/crates.io-index" 3502 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3503 | 3504 | [[package]] 3505 | name = "windows" 3506 | version = "0.37.0" 3507 | source = "registry+https://github.com/rust-lang/crates.io-index" 3508 | checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" 3509 | dependencies = [ 3510 | "windows_aarch64_msvc 0.37.0", 3511 | "windows_i686_gnu 0.37.0", 3512 | "windows_i686_msvc 0.37.0", 3513 | "windows_x86_64_gnu 0.37.0", 3514 | "windows_x86_64_msvc 0.37.0", 3515 | ] 3516 | 3517 | [[package]] 3518 | name = "windows" 3519 | version = "0.39.0" 3520 | source = "registry+https://github.com/rust-lang/crates.io-index" 3521 | checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" 3522 | dependencies = [ 3523 | "windows-implement", 3524 | "windows_aarch64_msvc 0.39.0", 3525 | "windows_i686_gnu 0.39.0", 3526 | "windows_i686_msvc 0.39.0", 3527 | "windows_x86_64_gnu 0.39.0", 3528 | "windows_x86_64_msvc 0.39.0", 3529 | ] 3530 | 3531 | [[package]] 3532 | name = "windows" 3533 | version = "0.44.0" 3534 | source = "registry+https://github.com/rust-lang/crates.io-index" 3535 | checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" 3536 | dependencies = [ 3537 | "windows-targets", 3538 | ] 3539 | 3540 | [[package]] 3541 | name = "windows-bindgen" 3542 | version = "0.39.0" 3543 | source = "registry+https://github.com/rust-lang/crates.io-index" 3544 | checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" 3545 | dependencies = [ 3546 | "windows-metadata", 3547 | "windows-tokens", 3548 | ] 3549 | 3550 | [[package]] 3551 | name = "windows-implement" 3552 | version = "0.39.0" 3553 | source = "registry+https://github.com/rust-lang/crates.io-index" 3554 | checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" 3555 | dependencies = [ 3556 | "syn", 3557 | "windows-tokens", 3558 | ] 3559 | 3560 | [[package]] 3561 | name = "windows-metadata" 3562 | version = "0.39.0" 3563 | source = "registry+https://github.com/rust-lang/crates.io-index" 3564 | checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" 3565 | 3566 | [[package]] 3567 | name = "windows-sys" 3568 | version = "0.42.0" 3569 | source = "registry+https://github.com/rust-lang/crates.io-index" 3570 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 3571 | dependencies = [ 3572 | "windows_aarch64_gnullvm", 3573 | "windows_aarch64_msvc 0.42.1", 3574 | "windows_i686_gnu 0.42.1", 3575 | "windows_i686_msvc 0.42.1", 3576 | "windows_x86_64_gnu 0.42.1", 3577 | "windows_x86_64_gnullvm", 3578 | "windows_x86_64_msvc 0.42.1", 3579 | ] 3580 | 3581 | [[package]] 3582 | name = "windows-sys" 3583 | version = "0.45.0" 3584 | source = "registry+https://github.com/rust-lang/crates.io-index" 3585 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3586 | dependencies = [ 3587 | "windows-targets", 3588 | ] 3589 | 3590 | [[package]] 3591 | name = "windows-targets" 3592 | version = "0.42.1" 3593 | source = "registry+https://github.com/rust-lang/crates.io-index" 3594 | checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" 3595 | dependencies = [ 3596 | "windows_aarch64_gnullvm", 3597 | "windows_aarch64_msvc 0.42.1", 3598 | "windows_i686_gnu 0.42.1", 3599 | "windows_i686_msvc 0.42.1", 3600 | "windows_x86_64_gnu 0.42.1", 3601 | "windows_x86_64_gnullvm", 3602 | "windows_x86_64_msvc 0.42.1", 3603 | ] 3604 | 3605 | [[package]] 3606 | name = "windows-tokens" 3607 | version = "0.39.0" 3608 | source = "registry+https://github.com/rust-lang/crates.io-index" 3609 | checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" 3610 | 3611 | [[package]] 3612 | name = "windows_aarch64_gnullvm" 3613 | version = "0.42.1" 3614 | source = "registry+https://github.com/rust-lang/crates.io-index" 3615 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 3616 | 3617 | [[package]] 3618 | name = "windows_aarch64_msvc" 3619 | version = "0.37.0" 3620 | source = "registry+https://github.com/rust-lang/crates.io-index" 3621 | checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" 3622 | 3623 | [[package]] 3624 | name = "windows_aarch64_msvc" 3625 | version = "0.39.0" 3626 | source = "registry+https://github.com/rust-lang/crates.io-index" 3627 | checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" 3628 | 3629 | [[package]] 3630 | name = "windows_aarch64_msvc" 3631 | version = "0.42.1" 3632 | source = "registry+https://github.com/rust-lang/crates.io-index" 3633 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 3634 | 3635 | [[package]] 3636 | name = "windows_i686_gnu" 3637 | version = "0.37.0" 3638 | source = "registry+https://github.com/rust-lang/crates.io-index" 3639 | checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" 3640 | 3641 | [[package]] 3642 | name = "windows_i686_gnu" 3643 | version = "0.39.0" 3644 | source = "registry+https://github.com/rust-lang/crates.io-index" 3645 | checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" 3646 | 3647 | [[package]] 3648 | name = "windows_i686_gnu" 3649 | version = "0.42.1" 3650 | source = "registry+https://github.com/rust-lang/crates.io-index" 3651 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 3652 | 3653 | [[package]] 3654 | name = "windows_i686_msvc" 3655 | version = "0.37.0" 3656 | source = "registry+https://github.com/rust-lang/crates.io-index" 3657 | checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" 3658 | 3659 | [[package]] 3660 | name = "windows_i686_msvc" 3661 | version = "0.39.0" 3662 | source = "registry+https://github.com/rust-lang/crates.io-index" 3663 | checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" 3664 | 3665 | [[package]] 3666 | name = "windows_i686_msvc" 3667 | version = "0.42.1" 3668 | source = "registry+https://github.com/rust-lang/crates.io-index" 3669 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 3670 | 3671 | [[package]] 3672 | name = "windows_x86_64_gnu" 3673 | version = "0.37.0" 3674 | source = "registry+https://github.com/rust-lang/crates.io-index" 3675 | checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" 3676 | 3677 | [[package]] 3678 | name = "windows_x86_64_gnu" 3679 | version = "0.39.0" 3680 | source = "registry+https://github.com/rust-lang/crates.io-index" 3681 | checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" 3682 | 3683 | [[package]] 3684 | name = "windows_x86_64_gnu" 3685 | version = "0.42.1" 3686 | source = "registry+https://github.com/rust-lang/crates.io-index" 3687 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 3688 | 3689 | [[package]] 3690 | name = "windows_x86_64_gnullvm" 3691 | version = "0.42.1" 3692 | source = "registry+https://github.com/rust-lang/crates.io-index" 3693 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 3694 | 3695 | [[package]] 3696 | name = "windows_x86_64_msvc" 3697 | version = "0.37.0" 3698 | source = "registry+https://github.com/rust-lang/crates.io-index" 3699 | checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" 3700 | 3701 | [[package]] 3702 | name = "windows_x86_64_msvc" 3703 | version = "0.39.0" 3704 | source = "registry+https://github.com/rust-lang/crates.io-index" 3705 | checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" 3706 | 3707 | [[package]] 3708 | name = "windows_x86_64_msvc" 3709 | version = "0.42.1" 3710 | source = "registry+https://github.com/rust-lang/crates.io-index" 3711 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 3712 | 3713 | [[package]] 3714 | name = "winnow" 3715 | version = "0.3.5" 3716 | source = "registry+https://github.com/rust-lang/crates.io-index" 3717 | checksum = "ee7b2c67f962bf5042bfd8b6a916178df33a26eec343ae064cb8e069f638fa6f" 3718 | dependencies = [ 3719 | "memchr", 3720 | ] 3721 | 3722 | [[package]] 3723 | name = "winreg" 3724 | version = "0.10.1" 3725 | source = "registry+https://github.com/rust-lang/crates.io-index" 3726 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 3727 | dependencies = [ 3728 | "winapi", 3729 | ] 3730 | 3731 | [[package]] 3732 | name = "winres" 3733 | version = "0.1.12" 3734 | source = "registry+https://github.com/rust-lang/crates.io-index" 3735 | checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" 3736 | dependencies = [ 3737 | "toml", 3738 | ] 3739 | 3740 | [[package]] 3741 | name = "wry" 3742 | version = "0.23.4" 3743 | source = "registry+https://github.com/rust-lang/crates.io-index" 3744 | checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98" 3745 | dependencies = [ 3746 | "base64 0.13.1", 3747 | "block", 3748 | "cocoa", 3749 | "core-graphics", 3750 | "crossbeam-channel", 3751 | "dunce", 3752 | "gdk", 3753 | "gio", 3754 | "glib", 3755 | "gtk", 3756 | "html5ever", 3757 | "http", 3758 | "kuchiki", 3759 | "libc", 3760 | "log", 3761 | "objc", 3762 | "objc_id", 3763 | "once_cell", 3764 | "serde", 3765 | "serde_json", 3766 | "sha2", 3767 | "soup2", 3768 | "tao", 3769 | "thiserror", 3770 | "url", 3771 | "webkit2gtk", 3772 | "webkit2gtk-sys", 3773 | "webview2-com", 3774 | "windows 0.39.0", 3775 | "windows-implement", 3776 | ] 3777 | 3778 | [[package]] 3779 | name = "x11" 3780 | version = "2.21.0" 3781 | source = "registry+https://github.com/rust-lang/crates.io-index" 3782 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 3783 | dependencies = [ 3784 | "libc", 3785 | "pkg-config", 3786 | ] 3787 | 3788 | [[package]] 3789 | name = "x11-dl" 3790 | version = "2.21.0" 3791 | source = "registry+https://github.com/rust-lang/crates.io-index" 3792 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 3793 | dependencies = [ 3794 | "libc", 3795 | "once_cell", 3796 | "pkg-config", 3797 | ] 3798 | 3799 | [[package]] 3800 | name = "xattr" 3801 | version = "0.2.3" 3802 | source = "registry+https://github.com/rust-lang/crates.io-index" 3803 | checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" 3804 | dependencies = [ 3805 | "libc", 3806 | ] 3807 | -------------------------------------------------------------------------------- /template/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "app_name_lowercased" 3 | description = "test_description" 4 | version = "0.1.0" 5 | edition = "2021" 6 | path = "src/main.rs" 7 | 8 | [dependencies] 9 | wry = "0.23.3" 10 | tao = "0.15.6" 11 | home = "0.5.4" 12 | serde_json = "1.0.94" 13 | serde = "1.0.154" 14 | tauri = { version = "1.2", features = ["notification-all", "shell-open"] } 15 | reqwest = { version = "0.11", features = ["blocking", "json"] } 16 | 17 | [target.'cfg(target_os = "macos")'.dependencies] 18 | objc = "0.2.7" 19 | cocoa = "0.24.1" 20 | 21 | [target.'cfg(target_os = "linux")'.dependencies] 22 | webkit2gtk = "0.18.0" 23 | 24 | [build-dependencies] 25 | tauri-build = { version = "1.2", features = [] } 26 | 27 | [profile.release] 28 | strip = true 29 | panic = "abort" 30 | codegen-units = 1 31 | lto = "thin" 32 | opt-level = "s" 33 | 34 | 35 | [features] 36 | # by default Tauri runs in production mode 37 | # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL 38 | default = ["custom-protocol"] 39 | # this feature is used used for production builds where `devPath` points to the filesystem 40 | # DO NOT remove this 41 | custom-protocol = ["tauri/custom-protocol"] 42 | -------------------------------------------------------------------------------- /template/build.rs: -------------------------------------------------------------------------------- 1 | fn main() {} 2 | -------------------------------------------------------------------------------- /template/icons/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hamza72x/web2app/9fa884fe0bbe2b1d66d12c01521f103297f947cc/template/icons/app-icon.png -------------------------------------------------------------------------------- /template/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hamza72x/web2app/9fa884fe0bbe2b1d66d12c01521f103297f947cc/template/icons/icon.png -------------------------------------------------------------------------------- /template/rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 80 -------------------------------------------------------------------------------- /template/src/app_config.rs: -------------------------------------------------------------------------------- 1 | use super::app_data; 2 | use serde::{Deserialize, Serialize}; 3 | 4 | // $HOME/.config/web2app_apps/app_name/config.json 5 | #[derive(Serialize, Deserialize, Debug)] 6 | pub struct AppConfig { 7 | #[serde(default)] 8 | pub zoom_factor: f64, 9 | 10 | #[serde(default)] 11 | pub dark_reader_enabled: bool, 12 | 13 | #[serde(default)] 14 | pub is_notification_enabled: bool, 15 | } 16 | 17 | impl Default for AppConfig { 18 | fn default() -> Self { 19 | return Self { 20 | zoom_factor: 1.0, 21 | dark_reader_enabled: false, 22 | is_notification_enabled: true, 23 | }; 24 | } 25 | } 26 | 27 | impl AppConfig { 28 | fn config_dir() -> std::path::PathBuf { 29 | return home::home_dir() 30 | .unwrap() 31 | .join(".config") 32 | .join(app_data::APPS_DIR) 33 | .join(app_data::APP_NAME); 34 | } 35 | 36 | fn config_path() -> std::path::PathBuf { 37 | return Self::config_dir().join("config.json"); 38 | } 39 | 40 | fn create_config_dir() { 41 | let config_dir = Self::config_dir(); 42 | 43 | if !config_dir.exists() { 44 | std::fs::create_dir_all(config_dir).unwrap(); 45 | } 46 | } 47 | 48 | pub fn load() -> Self { 49 | let config_path = Self::config_path(); 50 | 51 | if !config_path.exists() { 52 | Self::create_config_dir(); 53 | return Self::default(); 54 | } 55 | 56 | let config_file = std::fs::File::open(config_path).unwrap(); 57 | 58 | return serde_json::from_reader(config_file).unwrap(); 59 | } 60 | 61 | pub fn save(&self) { 62 | let config_path = Self::config_path(); 63 | 64 | let config_file = std::fs::File::create(config_path).unwrap(); 65 | serde_json::to_writer_pretty(config_file, self).unwrap(); 66 | } 67 | 68 | pub fn dark_reader_text(&self) -> &'static str { 69 | if self.dark_reader_enabled { 70 | return "Disable DarkReader"; 71 | } else { 72 | return "Enable DarkReader"; 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /template/src/app_data.rs: -------------------------------------------------------------------------------- 1 | pub const MAIN_WINDOW: &str = "main"; 2 | pub const APPS_DIR: &str = "web2app_apps"; 3 | 4 | // following const may/may not be replaced by web2app cli 5 | pub const USER_AGENT: Option<&str> = None; 6 | pub const APP_NAME: &str = "app_name"; 7 | pub const URL: &str = "https://google.com"; 8 | -------------------------------------------------------------------------------- /template/src/app_menu.rs: -------------------------------------------------------------------------------- 1 | use super::app_config::AppConfig; 2 | use super::util; 3 | 4 | use tauri::{CustomMenuItem, Menu, MenuItem, Submenu, Window}; 5 | 6 | const SCALE_FACTOR: f64 = 1.1; 7 | 8 | const JS_ENABLE_DARK_READER: &str = r#" 9 | (function() { 10 | if (typeof DarkReader === 'undefined') { 11 | console.log('DarkReader is not loaded'); 12 | return; 13 | } 14 | DarkReader.setFetchMethod(window.fetch); 15 | DarkReader.enable(); 16 | })(); 17 | "#; 18 | 19 | const JS_DISABLE_DARK_READER: &str = r#" 20 | (function() { 21 | if (typeof DarkReader === 'undefined') { 22 | console.log('DarkReader is not loaded'); 23 | return; 24 | } 25 | DarkReader.disable(); 26 | })(); 27 | "#; 28 | 29 | // build_menu creates a tauri::Menu 30 | pub fn build_menu() -> Menu { 31 | return Menu::new() 32 | .add_submenu(get_file_submenu()) 33 | .add_submenu(get_edit_submenu()) 34 | .add_submenu(get_window_submenu()) 35 | .add_submenu(get_tools_submenu()); 36 | } 37 | 38 | pub fn handle_menu_click(window: &Window, menu_id: &str) { 39 | let mut app_config = AppConfig::load(); 40 | 41 | match menu_id { 42 | "zoom_in" => { 43 | if app_config.zoom_factor < 2.0 { 44 | app_config.zoom_factor *= SCALE_FACTOR; 45 | util::zoom_webview(window, app_config.zoom_factor); 46 | app_config.save(); 47 | } 48 | } 49 | "zoom_out" => { 50 | if app_config.zoom_factor > 0.1 { 51 | app_config.zoom_factor /= SCALE_FACTOR; 52 | util::zoom_webview(window, app_config.zoom_factor); 53 | app_config.save(); 54 | } 55 | } 56 | "reload" => { 57 | window.eval("location.reload();").unwrap(); 58 | } 59 | "dark_reader" => { 60 | app_config.dark_reader_enabled = !app_config.dark_reader_enabled; 61 | 62 | if app_config.dark_reader_enabled { 63 | window.eval(JS_ENABLE_DARK_READER).unwrap(); 64 | } else { 65 | window.eval(JS_DISABLE_DARK_READER).unwrap(); 66 | } 67 | 68 | app_config.save(); 69 | 70 | let menu_handle = window.menu_handle(); 71 | 72 | std::thread::spawn(move || { 73 | menu_handle 74 | .get_item("dark_reader") 75 | .set_title(app_config.dark_reader_text()) 76 | .expect("failed to set dark reader menu text"); 77 | }); 78 | } 79 | "back" => { 80 | window.eval("window.history.back();").unwrap(); 81 | } 82 | "forward" => { 83 | window.eval("window.history.forward();").unwrap(); 84 | } 85 | _ => { 86 | println!("unhandled menu click: {}", menu_id); 87 | } 88 | } 89 | } 90 | 91 | // File 92 | fn get_file_submenu() -> Submenu { 93 | return Submenu::new("File", Menu::new().add_native_item(MenuItem::Quit)); 94 | } 95 | 96 | // Edit 97 | fn get_edit_submenu() -> Submenu { 98 | return Submenu::new( 99 | "Edit", 100 | Menu::new() 101 | .add_native_item(MenuItem::Copy) 102 | .add_native_item(MenuItem::Cut) 103 | .add_native_item(MenuItem::Paste) 104 | .add_native_item(MenuItem::SelectAll) 105 | .add_native_item(MenuItem::Undo) 106 | .add_native_item(MenuItem::Redo), 107 | ); 108 | } 109 | 110 | // Window 111 | fn get_window_submenu() -> Submenu { 112 | let reload = CustomMenuItem::new("reload".to_string(), "Reload") 113 | .accelerator("CmdOrCtrl+R"); 114 | let zoom_in = CustomMenuItem::new("zoom_in".to_string(), "Zoom In") 115 | .accelerator("CmdOrCtrl+Plus"); 116 | let zoom_out = CustomMenuItem::new("zoom_out".to_string(), "Zoom Out") 117 | .accelerator("CmdOrCtrl+-"); 118 | let back = CustomMenuItem::new("back".to_string(), "Back".to_string()) 119 | .accelerator("CmdOrCtrl+["); 120 | let forward = 121 | CustomMenuItem::new("forward".to_string(), "Forward".to_string()) 122 | .accelerator("CmdOrCtrl+]"); 123 | 124 | return Submenu::new( 125 | "Window", 126 | Menu::new() 127 | .add_native_item(MenuItem::Minimize) 128 | .add_item(zoom_in) 129 | .add_item(zoom_out) 130 | .add_item(back) 131 | .add_item(forward) 132 | .add_item(reload), 133 | ); 134 | } 135 | 136 | // Tools 137 | fn get_tools_submenu() -> Submenu { 138 | let dark_reader = CustomMenuItem::new( 139 | "dark_reader".to_string(), 140 | "Enable Dark Reader".to_string(), 141 | ) 142 | .accelerator("CmdOrCtrl+Shift+I"); 143 | 144 | return Submenu::new("Tools", Menu::new().add_item(dark_reader)); 145 | } 146 | -------------------------------------------------------------------------------- /template/src/builder.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | use super::app_config::AppConfig; 4 | use super::app_data; 5 | use super::app_menu; 6 | use super::generated; 7 | use super::util; 8 | 9 | use tauri::AppHandle; 10 | use tauri::Manager; 11 | use tauri::WindowBuilder; 12 | use tauri::WindowUrl; 13 | 14 | // handlers, js -> rust 15 | 16 | // open new window handler 17 | #[tauri::command] 18 | fn open_new_window(app_handle: AppHandle, url: String) { 19 | println!("[rust handler] open new window: {}", url); 20 | create_a_window( 21 | &app_handle, 22 | &util::alphanumeric(url.as_str(), '_'), 23 | url.as_str(), 24 | ); 25 | } 26 | 27 | // download file handler 28 | #[tauri::command] 29 | fn download_file(url: String) { 30 | println!("[rust handler] download file: {}", url); 31 | util::download_file(url.as_str(), "downloaded_file.txt"); 32 | } 33 | 34 | // open_browser handler 35 | #[tauri::command] 36 | fn open_browser(url: String) { 37 | println!("[rust handler] open browser: {}", url); 38 | util::open_browser(url.as_str()); 39 | } 40 | 41 | pub fn build_tauri_app() { 42 | let mut builder = tauri::Builder::default(); 43 | 44 | // menu 45 | builder = builder.menu(app_menu::build_menu()); 46 | builder = builder.on_menu_event(|event| { 47 | app_menu::handle_menu_click(event.window(), event.menu_item_id()); 48 | }); 49 | 50 | // setup, create window 51 | builder = builder.setup(|app| { 52 | create_a_window( 53 | &app.app_handle(), 54 | app_data::MAIN_WINDOW, 55 | app_data::URL, 56 | ); 57 | Ok(()) 58 | }); 59 | 60 | // run 61 | builder 62 | .invoke_handler(tauri::generate_handler![ 63 | open_new_window, 64 | download_file, 65 | open_browser, 66 | ]) 67 | .run(tauri::generate_context!()) 68 | .expect("error while running tauri application"); 69 | } 70 | 71 | fn create_a_window(app: &AppHandle, label: &str, url: &str) { 72 | let app_config = AppConfig::load(); 73 | let window_url = WindowUrl::App(PathBuf::from(url)); 74 | let mut builder = WindowBuilder::new(app, label, window_url); 75 | 76 | builder = builder.initialization_script(generated::INIT_SCRIPT); 77 | 78 | if let Some(user_agent) = app_data::USER_AGENT { 79 | builder = builder.user_agent(user_agent); 80 | } 81 | 82 | let window = builder.build().expect("error while creating main window"); 83 | 84 | // zoom 85 | util::zoom_webview(&window, app_config.zoom_factor); 86 | 87 | // title 88 | window 89 | .set_title(app_data::APP_NAME) 90 | .expect("error while setting window title"); 91 | } 92 | -------------------------------------------------------------------------------- /template/src/generated.rs: -------------------------------------------------------------------------------- 1 | // This file is generated by watch.sh 2 | // Do not edit it directly 3 | 4 | pub const INIT_SCRIPT: &str = r#" 5 | // load darkreader.js 6 | (function () { 7 | console.log('[web2app] script.js loaded'); 8 | 9 | window.onload = function () { 10 | console.log("Window is loaded"); 11 | console.log("Loading DarkReader"); 12 | var script = document.createElement("script"); 13 | script.src = 14 | "https://cdn.jsdelivr.net/npm/darkreader@4.9.58/darkreader.min.js"; 15 | script.onload = function () { 16 | console.log("DarkReader is loaded"); 17 | }; 18 | document.head.appendChild(script); 19 | }; 20 | })(); 21 | 22 | function uid() { 23 | return window.crypto.getRandomValues(new Uint32Array(1))[0]; 24 | } 25 | 26 | function transformCallback(callback, once = false) { 27 | const identifier = uid(); 28 | const prop = `_${identifier}`; 29 | Object.defineProperty(window, prop, { 30 | value: (result) => { 31 | if (once) { 32 | Reflect.deleteProperty(window, prop); 33 | } 34 | return callback === null || callback === void 0 35 | ? void 0 36 | : callback(result); 37 | }, 38 | writable: false, 39 | configurable: true, 40 | }); 41 | return identifier; 42 | } 43 | 44 | async function invoke(cmd, args = {}) { 45 | return new Promise((resolve, reject) => { 46 | const callback = transformCallback((e) => { 47 | resolve(e); 48 | Reflect.deleteProperty(window, `_${error}`); 49 | }, true); 50 | const error = transformCallback((e) => { 51 | reject(e); 52 | Reflect.deleteProperty(window, `_${callback}`); 53 | }, true); 54 | window.__TAURI_IPC__(Object.assign({ cmd, callback, error }, args)); 55 | }); 56 | } 57 | 58 | window.__TAURI_IPC__ = (message) => 59 | window.ipc.postMessage(JSON.stringify(message)); 60 | 61 | Notification = class Notification { 62 | static permission = "default"; 63 | 64 | constructor(title, options = {}) { 65 | invoke("tauri", { 66 | __tauriModule: "Notification", 67 | message: { 68 | cmd: "notification", 69 | options: { 70 | title: title, 71 | ...options, 72 | }, 73 | }, 74 | }); 75 | } 76 | 77 | static async requestPermission() { 78 | const response = invoke("tauri", { 79 | __tauriModule: "Notification", 80 | message: { 81 | cmd: "requestNotificationPermission", 82 | }, 83 | }); 84 | Notification.permission = response; 85 | return response; 86 | } 87 | }; 88 | 89 | setTimeout(async () => { 90 | const response = await invoke("tauri", { 91 | __tauriModule: "Notification", 92 | message: { 93 | cmd: "isNotificationPermissionGranted", 94 | }, 95 | }); 96 | if (response) { 97 | Notification.permission = "granted"; 98 | } else { 99 | Notification.permission = "denied"; 100 | } 101 | }, 1000); 102 | 103 | // listen all clicks 104 | document.addEventListener("click", (e) => { 105 | console.log("the target", e.target.tagName); 106 | if (e.target.tagName === "A") { 107 | // check if another domain 108 | const url = new URL(e.target.href); 109 | if (url.hostname !== window.location.hostname) { 110 | console.log("opening in default browser", e.target.href); 111 | invoke("open_browser", { url: e.target.href }); 112 | return; 113 | } 114 | // if it's _blank, open in new window 115 | e.preventDefault(); 116 | if (e.target.target === "_blank") { 117 | console.log("opening in new window", e.target.href); 118 | invoke("open_new_window", { url: e.target.href }); 119 | } 120 | } 121 | }); 122 | "#; 123 | -------------------------------------------------------------------------------- /template/src/main.rs: -------------------------------------------------------------------------------- 1 | // Prevents additional console window on Windows in release 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | #[cfg(target_os = "macos")] 5 | #[macro_use] 6 | extern crate objc; 7 | 8 | mod app_config; 9 | mod app_data; 10 | mod app_menu; 11 | mod builder; 12 | mod generated; 13 | mod util; 14 | 15 | fn main() { 16 | builder::build_tauri_app(); 17 | } 18 | -------------------------------------------------------------------------------- /template/src/script.js: -------------------------------------------------------------------------------- 1 | // load darkreader.js 2 | (function () { 3 | console.log('[web2app] script.js loaded'); 4 | 5 | window.onload = function () { 6 | console.log("Window is loaded"); 7 | console.log("Loading DarkReader"); 8 | var script = document.createElement("script"); 9 | script.src = 10 | "https://cdn.jsdelivr.net/npm/darkreader@4.9.58/darkreader.min.js"; 11 | script.onload = function () { 12 | console.log("DarkReader is loaded"); 13 | }; 14 | document.head.appendChild(script); 15 | }; 16 | })(); 17 | 18 | function uid() { 19 | return window.crypto.getRandomValues(new Uint32Array(1))[0]; 20 | } 21 | 22 | function transformCallback(callback, once = false) { 23 | const identifier = uid(); 24 | const prop = `_${identifier}`; 25 | Object.defineProperty(window, prop, { 26 | value: (result) => { 27 | if (once) { 28 | Reflect.deleteProperty(window, prop); 29 | } 30 | return callback === null || callback === void 0 31 | ? void 0 32 | : callback(result); 33 | }, 34 | writable: false, 35 | configurable: true, 36 | }); 37 | return identifier; 38 | } 39 | 40 | async function invoke(cmd, args = {}) { 41 | return new Promise((resolve, reject) => { 42 | const callback = transformCallback((e) => { 43 | resolve(e); 44 | Reflect.deleteProperty(window, `_${error}`); 45 | }, true); 46 | const error = transformCallback((e) => { 47 | reject(e); 48 | Reflect.deleteProperty(window, `_${callback}`); 49 | }, true); 50 | window.__TAURI_IPC__(Object.assign({ cmd, callback, error }, args)); 51 | }); 52 | } 53 | 54 | window.__TAURI_IPC__ = (message) => 55 | window.ipc.postMessage(JSON.stringify(message)); 56 | 57 | Notification = class Notification { 58 | static permission = "default"; 59 | 60 | constructor(title, options = {}) { 61 | invoke("tauri", { 62 | __tauriModule: "Notification", 63 | message: { 64 | cmd: "notification", 65 | options: { 66 | title: title, 67 | ...options, 68 | }, 69 | }, 70 | }); 71 | } 72 | 73 | static async requestPermission() { 74 | const response = invoke("tauri", { 75 | __tauriModule: "Notification", 76 | message: { 77 | cmd: "requestNotificationPermission", 78 | }, 79 | }); 80 | Notification.permission = response; 81 | return response; 82 | } 83 | }; 84 | 85 | setTimeout(async () => { 86 | const response = await invoke("tauri", { 87 | __tauriModule: "Notification", 88 | message: { 89 | cmd: "isNotificationPermissionGranted", 90 | }, 91 | }); 92 | if (response) { 93 | Notification.permission = "granted"; 94 | } else { 95 | Notification.permission = "denied"; 96 | } 97 | }, 1000); 98 | 99 | // listen all clicks 100 | document.addEventListener("click", (e) => { 101 | console.log("the target", e.target.tagName); 102 | if (e.target.tagName === "A") { 103 | // check if another domain 104 | const url = new URL(e.target.href); 105 | if (url.hostname !== window.location.hostname) { 106 | console.log("opening in default browser", e.target.href); 107 | invoke("open_browser", { url: e.target.href }); 108 | return; 109 | } 110 | // if it's _blank, open in new window 111 | e.preventDefault(); 112 | if (e.target.target === "_blank") { 113 | console.log("opening in new window", e.target.href); 114 | invoke("open_new_window", { url: e.target.href }); 115 | } 116 | } 117 | }); 118 | -------------------------------------------------------------------------------- /template/src/util.rs: -------------------------------------------------------------------------------- 1 | use std::fs::File; 2 | use std::io; 3 | use tauri::Window; 4 | 5 | pub fn zoom_webview(window: &Window, factor: f64) { 6 | window 7 | .with_webview(move |webview| { 8 | #[cfg(target_os = "linux")] 9 | { 10 | // see https://docs.rs/webkit2gtk/0.18.2/webkit2gtk/struct.WebView.html 11 | // and https://docs.rs/webkit2gtk/0.18.2/webkit2gtk/trait.WebViewExt.html 12 | use webkit2gtk::traits::WebViewExt; 13 | webview.inner().set_zoom_level(factor); 14 | } 15 | 16 | #[cfg(windows)] 17 | unsafe { 18 | // see https://docs.rs/webview2-com/0.19.1/webview2_com/Microsoft/Web/WebView2/Win32/struct.ICoreWebView2Controller.html 19 | webview.controller().SetZoomFactor(factor).unwrap(); 20 | } 21 | #[cfg(target_os = "macos")] 22 | unsafe { 23 | let () = msg_send![webview.inner(), setPageZoom: factor]; 24 | // let () = msg_send![webview.controller(), removeAllUserScripts]; 25 | // let bg_color: cocoa::base::id = msg_send![class!(NSColor), colorWithDeviceRed:0.5 green:0.2 blue:0.4 alpha:1.]; 26 | // let () = msg_send![webview.ns_window(), setBackgroundColor: bg_color]; 27 | } 28 | }) 29 | .expect("error while setting webview"); 30 | } 31 | 32 | // alphanumeric filters a string to only contain alphanumeric characters 33 | // and replaces all other characters with the given character 34 | pub fn alphanumeric(s: &str, replace: char) -> String { 35 | s.chars() 36 | .map(|c| if c.is_alphanumeric() { c } else { replace }) 37 | .collect() 38 | } 39 | 40 | pub fn download_file(url: &str, path: &str) { 41 | let resp = reqwest::blocking::get(url).expect("request failed"); 42 | let body = resp.text().expect("body invalid"); 43 | let mut out = File::create(path).expect("failed to create file"); 44 | io::copy(&mut body.as_bytes(), &mut out).expect("failed to copy content"); 45 | } 46 | 47 | pub fn open_browser(url: &str) { 48 | #[cfg(target_os = "linux")] 49 | { 50 | let _ = std::process::Command::new("xdg-open") 51 | .arg(url) 52 | .spawn() 53 | .expect("failed to open browser"); 54 | } 55 | 56 | #[cfg(target_os = "windows")] 57 | { 58 | let _ = std::process::Command::new("cmd") 59 | .arg("/C") 60 | .arg("start") 61 | .arg(url) 62 | .spawn() 63 | .expect("failed to open browser"); 64 | } 65 | 66 | #[cfg(target_os = "macos")] 67 | { 68 | let _ = std::process::Command::new("open") 69 | .arg(url) 70 | .spawn() 71 | .expect("failed to open browser"); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /template/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "", 4 | "beforeBuildCommand": "", 5 | "devPath": "./src", 6 | "distDir": "./src", 7 | "withGlobalTauri": true 8 | }, 9 | "package": { 10 | "productName": "app_name", 11 | "version": "0.1.0" 12 | }, 13 | "tauri": { 14 | "allowlist": { 15 | "all": false, 16 | "shell": { 17 | "all": false, 18 | "open": true 19 | }, 20 | "notification": { 21 | "all": true 22 | } 23 | }, 24 | "bundle": { 25 | "active": true, 26 | "category": "DeveloperTool", 27 | "copyright": "", 28 | "deb": { 29 | "depends": [] 30 | }, 31 | "externalBin": [], 32 | "icon": [], 33 | "identifier": "com.example.test", 34 | "longDescription": "", 35 | "macOS": { 36 | "entitlements": null, 37 | "exceptionDomain": "", 38 | "frameworks": [], 39 | "providerShortName": null, 40 | "signingIdentity": null 41 | }, 42 | "resources": [], 43 | "shortDescription": "", 44 | "targets": "all", 45 | "windows": { 46 | "certificateThumbprint": null, 47 | "digestAlgorithm": "sha256", 48 | "timestampUrl": "" 49 | } 50 | }, 51 | "security": { 52 | "csp": null 53 | }, 54 | "updater": { 55 | "active": false 56 | }, 57 | "windows": [ 58 | ] 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /watch.sh: -------------------------------------------------------------------------------- 1 | #!/opt/homebrew/bin/bash 2 | 3 | # this watch.sh requires bash 4.0 or higher 4 | # `brew install bash` on macos 5 | bash_version=$(bash --version | head -n 1 | awk '{print $4}') 6 | 7 | echo "" 8 | echo "bash version is $bash_version -----------------------" 9 | echo "watch.sh requires bash 4.0 or higher ----------------" 10 | echo "" 11 | 12 | build_mod() { 13 | template_mod="src/generated.rs" 14 | 15 | echo '// Auto generated by $$ make build_template' >$template_mod 16 | echo "// Don't edit this file by HAND, edit the ../template directory instead." >>$template_mod 17 | echo "// Then keep running watch.sh" >>$template_mod 18 | echo "" >>$template_mod 19 | 20 | os=$(uname -s) 21 | opts="" 22 | 23 | if [ "$os" = "Linux" ]; then 24 | opts="-w0" 25 | fi 26 | 27 | # dir: template/src 28 | echo "pub const FILE_APP_CONFIG_RS: &str = \"$(cat template/src/app_config.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 29 | echo "pub const FILE_APP_DATA_RS: &str = \"$(cat template/src/app_data.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 30 | echo "pub const FILE_APP_MENU_RS: &str = \"$(cat template/src/app_menu.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 31 | 32 | echo "pub const FILE_BUILDER_RS: &str = \"$(cat template/src/builder.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 33 | echo "pub const FILE_GENERATED_RS: &str = \"$(cat template/src/generated.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 34 | 35 | echo "pub const FILE_MAIN_RS: &str = \"$(cat template/src/main.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 36 | echo "pub const FILE_UTIL_RS: &str = \"$(cat template/src/util.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 37 | 38 | # dir: template 39 | echo "pub const FILE_BUILD_RS: &str = \"$(cat template/build.rs | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 40 | echo "pub const FILE_CARGO_TOML: &str = \"$(cat template/Cargo.toml | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 41 | echo "pub const FILE_CARGO_LOCK: &str = \"$(cat template/Cargo.lock | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 42 | echo "pub const FILE_TAURI_CONF_JSON: &str = \"$(cat template/tauri.conf.json | base64 $opts)\";" >>$template_mod && echo "" >>$template_mod 43 | } 44 | 45 | build_template_gen() { 46 | 47 | script_js="template/src/script.js" 48 | out="template/src/generated.rs" 49 | 50 | echo "// This file is generated by watch.sh" >"$out" 51 | echo "// Do not edit it directly" >>"$out" 52 | echo "" >>"$out" 53 | echo "pub const INIT_SCRIPT: &str = r#\"" >>"$out" 54 | echo "$(cat "$script_js")" >>"$out" 55 | echo "\"#;" >>"$out" 56 | } 57 | 58 | autogen() { 59 | build_template_gen 60 | build_mod 61 | } 62 | 63 | watch_files() { 64 | # array of allowed files to watch 65 | files=( 66 | "template/src/app_config.rs" 67 | "template/src/app_data.rs" 68 | "template/src/app_menu.rs" 69 | "template/src/builder.rs" 70 | "template/src/generated.rs" 71 | "template/src/main.rs" 72 | "template/src/util.rs" 73 | "template/src/script.js" 74 | "template/build.rs" 75 | "template/Cargo.toml" 76 | "template/Cargo.lock" 77 | "template/tauri.conf.json" 78 | "template/icons/app-icon.png" 79 | ) 80 | 81 | # map of states of files (map key is the sha256 of $file and state value is the string of : ls -l $file) 82 | declare -A states 83 | 84 | # init states 85 | for file in "${files[@]}"; do 86 | echo "watching $file" 87 | 88 | if [ ! -f "$file" ]; then 89 | echo "file $file does not exist skipping" 90 | continue 91 | fi 92 | 93 | key="$(sha256sum $file)" 94 | value="$(ls -l $file)" 95 | states[$key]="$value" 96 | done 97 | 98 | # watch loop 99 | while true; do 100 | for file in "${files[@]}"; do 101 | value="$(ls -l $file)" 102 | key="$(sha256sum $file)" 103 | 104 | if [ ! -f "$file" ]; then 105 | echo "file $file does not exist skipping" 106 | continue 107 | fi 108 | 109 | if [ "${states[$key]}" != "$value" ]; then 110 | echo "file $file changed" 111 | states[$key]="$value" 112 | autogen 113 | fi 114 | done 115 | sleep 1 116 | done 117 | } 118 | 119 | autogen 120 | watch_files 121 | --------------------------------------------------------------------------------