├── .github └── workflows │ ├── package.yml │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md └── src ├── lib.rs └── main.rs /.github/workflows/package.yml: -------------------------------------------------------------------------------- 1 | name: Package 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | runs_on: 7 | required: true 8 | type: string 9 | target: 10 | required: true 11 | type: string 12 | extension: 13 | default: "" 14 | type: string 15 | 16 | jobs: 17 | build: 18 | name: Build static binaries 19 | runs-on: ${{ inputs.runs_on }} 20 | 21 | steps: 22 | - name: Change apt mirror and install dependencies 23 | if: ${{ inputs.runs_on == 'ubuntu-latest' }} 24 | run: | 25 | sudo sed -i 's/azure.archive.ubuntu.com/archive.ubuntu.com/' /etc/apt/sources.list 26 | sudo apt-get update 27 | sudo apt-get install musl-tools libudev-dev 28 | 29 | - uses: actions/checkout@v2 30 | 31 | - uses: actions-rs/toolchain@v1 32 | with: 33 | toolchain: stable 34 | target: ${{ inputs.target }} 35 | 36 | - uses: Swatinem/rust-cache@v1 37 | 38 | - uses: actions-rs/cargo@v1 39 | with: 40 | command: build 41 | args: --release --all --target ${{ inputs.target }} 42 | 43 | - uses: papeloto/action-zip@v1 44 | with: 45 | files: target/${{ inputs.target }}/release/wokwi-server${{ inputs.extension }} 46 | recursive: true 47 | dest: wokwi-server-${{ inputs.target }}.zip 48 | 49 | - uses: svenstaro/upload-release-action@v2 50 | with: 51 | repo_token: ${{ secrets.GITHUB_TOKEN }} 52 | file: wokwi-server-${{ inputs.target }}.zip 53 | tag: ${{ github.ref }} -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | # Linux 9 | 10 | x86_64-unknown-linux-gnu: 11 | uses: ./.github/workflows/package.yml 12 | with: 13 | runs_on: ubuntu-latest 14 | target: x86_64-unknown-linux-gnu 15 | 16 | x86_64-unknown-linux-musl: 17 | uses: ./.github/workflows/package.yml 18 | with: 19 | runs_on: ubuntu-latest 20 | target: x86_64-unknown-linux-musl 21 | 22 | # macOS 23 | 24 | aarch64-apple-darwin: 25 | uses: ./.github/workflows/package.yml 26 | with: 27 | runs_on: macos-latest 28 | target: aarch64-apple-darwin 29 | 30 | x86_64-apple-darwin: 31 | uses: ./.github/workflows/package.yml 32 | with: 33 | runs_on: macos-latest 34 | target: x86_64-apple-darwin 35 | 36 | # Windows 37 | 38 | x86_64-pc-windows-gnu: 39 | uses: ./.github/workflows/package.yml 40 | with: 41 | runs_on: windows-latest 42 | target: x86_64-pc-windows-gnu 43 | extension: .exe 44 | 45 | x86_64-pc-windows-msvc: 46 | uses: ./.github/workflows/package.yml 47 | with: 48 | runs_on: windows-latest 49 | target: x86_64-pc-windows-msvc 50 | extension: .exe -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .vscode 3 | -------------------------------------------------------------------------------- /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 = "CoreFoundation-sys" 7 | version = "0.1.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d0e9889e6db118d49d88d84728d0e964d973a5680befb5f85f55141beea5c20b" 10 | dependencies = [ 11 | "libc", 12 | "mach 0.1.2", 13 | ] 14 | 15 | [[package]] 16 | name = "IOKit-sys" 17 | version = "0.1.5" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "99696c398cbaf669d2368076bdb3d627fb0ce51a26899d7c61228c5c0af3bf4a" 20 | dependencies = [ 21 | "CoreFoundation-sys", 22 | "libc", 23 | "mach 0.1.2", 24 | ] 25 | 26 | [[package]] 27 | name = "addr2line" 28 | version = "0.17.0" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" 31 | dependencies = [ 32 | "cpp_demangle", 33 | "fallible-iterator", 34 | "gimli", 35 | "object 0.27.1", 36 | "rustc-demangle", 37 | "smallvec 1.10.0", 38 | ] 39 | 40 | [[package]] 41 | name = "adler" 42 | version = "1.0.2" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 45 | 46 | [[package]] 47 | name = "ahash" 48 | version = "0.7.6" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 51 | dependencies = [ 52 | "getrandom", 53 | "once_cell", 54 | "version_check", 55 | ] 56 | 57 | [[package]] 58 | name = "aho-corasick" 59 | version = "0.7.19" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" 62 | dependencies = [ 63 | "memchr", 64 | ] 65 | 66 | [[package]] 67 | name = "anyhow" 68 | version = "1.0.65" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" 71 | 72 | [[package]] 73 | name = "array-init" 74 | version = "0.0.4" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" 77 | dependencies = [ 78 | "nodrop", 79 | ] 80 | 81 | [[package]] 82 | name = "async-stream" 83 | version = "0.3.3" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" 86 | dependencies = [ 87 | "async-stream-impl", 88 | "futures-core", 89 | ] 90 | 91 | [[package]] 92 | name = "async-stream-impl" 93 | version = "0.3.3" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" 96 | dependencies = [ 97 | "proc-macro2", 98 | "quote", 99 | "syn", 100 | ] 101 | 102 | [[package]] 103 | name = "async-trait" 104 | version = "0.1.57" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" 107 | dependencies = [ 108 | "proc-macro2", 109 | "quote", 110 | "syn", 111 | ] 112 | 113 | [[package]] 114 | name = "atty" 115 | version = "0.2.14" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 118 | dependencies = [ 119 | "hermit-abi", 120 | "libc", 121 | "winapi", 122 | ] 123 | 124 | [[package]] 125 | name = "autocfg" 126 | version = "1.1.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 129 | 130 | [[package]] 131 | name = "axum" 132 | version = "0.5.16" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "c9e3356844c4d6a6d6467b8da2cffb4a2820be256f50a3a386c9d152bab31043" 135 | dependencies = [ 136 | "async-trait", 137 | "axum-core", 138 | "bitflags", 139 | "bytes", 140 | "futures-util", 141 | "http", 142 | "http-body", 143 | "hyper", 144 | "itoa 1.0.4", 145 | "matchit", 146 | "memchr", 147 | "mime", 148 | "percent-encoding", 149 | "pin-project-lite", 150 | "serde", 151 | "sync_wrapper", 152 | "tokio", 153 | "tower", 154 | "tower-http", 155 | "tower-layer", 156 | "tower-service", 157 | ] 158 | 159 | [[package]] 160 | name = "axum-core" 161 | version = "0.2.8" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "d9f0c0a60006f2a293d82d571f635042a72edf927539b7685bd62d361963839b" 164 | dependencies = [ 165 | "async-trait", 166 | "bytes", 167 | "futures-util", 168 | "http", 169 | "http-body", 170 | "mime", 171 | "tower-layer", 172 | "tower-service", 173 | ] 174 | 175 | [[package]] 176 | name = "backtrace" 177 | version = "0.3.66" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" 180 | dependencies = [ 181 | "addr2line", 182 | "cc", 183 | "cfg-if", 184 | "libc", 185 | "miniz_oxide", 186 | "object 0.29.0", 187 | "rustc-demangle", 188 | ] 189 | 190 | [[package]] 191 | name = "base64" 192 | version = "0.13.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 195 | 196 | [[package]] 197 | name = "binread" 198 | version = "2.2.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "16598dfc8e6578e9b597d9910ba2e73618385dc9f4b1d43dd92c349d6be6418f" 201 | dependencies = [ 202 | "binread_derive", 203 | "rustversion", 204 | ] 205 | 206 | [[package]] 207 | name = "binread_derive" 208 | version = "2.1.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "1d9672209df1714ee804b1f4d4f68c8eb2a90b1f7a07acf472f88ce198ef1fed" 211 | dependencies = [ 212 | "either", 213 | "proc-macro2", 214 | "quote", 215 | "syn", 216 | ] 217 | 218 | [[package]] 219 | name = "bitflags" 220 | version = "1.3.2" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 223 | 224 | [[package]] 225 | name = "block-buffer" 226 | version = "0.10.3" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 229 | dependencies = [ 230 | "generic-array", 231 | ] 232 | 233 | [[package]] 234 | name = "bstr" 235 | version = "0.2.17" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" 238 | dependencies = [ 239 | "lazy_static", 240 | "memchr", 241 | "regex-automata", 242 | "serde", 243 | ] 244 | 245 | [[package]] 246 | name = "bumpalo" 247 | version = "3.11.0" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 250 | 251 | [[package]] 252 | name = "bytemuck" 253 | version = "1.12.1" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" 256 | dependencies = [ 257 | "bytemuck_derive", 258 | ] 259 | 260 | [[package]] 261 | name = "bytemuck_derive" 262 | version = "1.2.1" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" 265 | dependencies = [ 266 | "proc-macro2", 267 | "quote", 268 | "syn", 269 | ] 270 | 271 | [[package]] 272 | name = "byteorder" 273 | version = "1.4.3" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 276 | 277 | [[package]] 278 | name = "bytes" 279 | version = "1.2.1" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 282 | 283 | [[package]] 284 | name = "cc" 285 | version = "1.0.73" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 288 | 289 | [[package]] 290 | name = "cfg-if" 291 | version = "1.0.0" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 294 | 295 | [[package]] 296 | name = "chunked_transfer" 297 | version = "1.4.0" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" 300 | 301 | [[package]] 302 | name = "clap" 303 | version = "3.2.22" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" 306 | dependencies = [ 307 | "atty", 308 | "bitflags", 309 | "clap_derive", 310 | "clap_lex", 311 | "indexmap", 312 | "once_cell", 313 | "strsim", 314 | "termcolor", 315 | "textwrap", 316 | ] 317 | 318 | [[package]] 319 | name = "clap_derive" 320 | version = "3.2.18" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" 323 | dependencies = [ 324 | "heck", 325 | "proc-macro-error", 326 | "proc-macro2", 327 | "quote", 328 | "syn", 329 | ] 330 | 331 | [[package]] 332 | name = "clap_lex" 333 | version = "0.2.4" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 336 | dependencies = [ 337 | "os_str_bytes", 338 | ] 339 | 340 | [[package]] 341 | name = "comfy-table" 342 | version = "6.1.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "85914173c2f558d61613bfbbf1911f14e630895087a7ed2fafc0f5319e1536e7" 345 | dependencies = [ 346 | "crossterm 0.25.0", 347 | "strum", 348 | "strum_macros", 349 | "unicode-width", 350 | ] 351 | 352 | [[package]] 353 | name = "console" 354 | version = "0.15.2" 355 | source = "registry+https://github.com/rust-lang/crates.io-index" 356 | checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" 357 | dependencies = [ 358 | "encode_unicode", 359 | "lazy_static", 360 | "libc", 361 | "terminal_size", 362 | "unicode-width", 363 | "winapi", 364 | ] 365 | 366 | [[package]] 367 | name = "console-api" 368 | version = "0.4.0" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "e57ff02e8ad8e06ab9731d5dc72dc23bef9200778eae1a89d555d8c42e5d4a86" 371 | dependencies = [ 372 | "prost", 373 | "prost-types", 374 | "tonic", 375 | "tracing-core", 376 | ] 377 | 378 | [[package]] 379 | name = "console-subscriber" 380 | version = "0.1.8" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "22a3a81dfaf6b66bce5d159eddae701e3a002f194d378cbf7be5f053c281d9be" 383 | dependencies = [ 384 | "console-api", 385 | "crossbeam-channel", 386 | "crossbeam-utils", 387 | "futures", 388 | "hdrhistogram", 389 | "humantime", 390 | "prost-types", 391 | "serde", 392 | "serde_json", 393 | "thread_local", 394 | "tokio", 395 | "tokio-stream", 396 | "tonic", 397 | "tracing", 398 | "tracing-core", 399 | "tracing-subscriber", 400 | ] 401 | 402 | [[package]] 403 | name = "cpp_demangle" 404 | version = "0.3.5" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" 407 | dependencies = [ 408 | "cfg-if", 409 | ] 410 | 411 | [[package]] 412 | name = "cpufeatures" 413 | version = "0.2.5" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 416 | dependencies = [ 417 | "libc", 418 | ] 419 | 420 | [[package]] 421 | name = "crc32fast" 422 | version = "1.3.2" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 425 | dependencies = [ 426 | "cfg-if", 427 | ] 428 | 429 | [[package]] 430 | name = "crossbeam-channel" 431 | version = "0.5.6" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 434 | dependencies = [ 435 | "cfg-if", 436 | "crossbeam-utils", 437 | ] 438 | 439 | [[package]] 440 | name = "crossbeam-utils" 441 | version = "0.8.12" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" 444 | dependencies = [ 445 | "cfg-if", 446 | ] 447 | 448 | [[package]] 449 | name = "crossterm" 450 | version = "0.23.2" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17" 453 | dependencies = [ 454 | "bitflags", 455 | "crossterm_winapi", 456 | "libc", 457 | "mio", 458 | "parking_lot", 459 | "signal-hook", 460 | "signal-hook-mio", 461 | "winapi", 462 | ] 463 | 464 | [[package]] 465 | name = "crossterm" 466 | version = "0.25.0" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" 469 | dependencies = [ 470 | "bitflags", 471 | "crossterm_winapi", 472 | "libc", 473 | "mio", 474 | "parking_lot", 475 | "signal-hook", 476 | "signal-hook-mio", 477 | "winapi", 478 | ] 479 | 480 | [[package]] 481 | name = "crossterm_winapi" 482 | version = "0.9.0" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" 485 | dependencies = [ 486 | "winapi", 487 | ] 488 | 489 | [[package]] 490 | name = "crypto-common" 491 | version = "0.1.6" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 494 | dependencies = [ 495 | "generic-array", 496 | "typenum", 497 | ] 498 | 499 | [[package]] 500 | name = "csv" 501 | version = "1.1.6" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" 504 | dependencies = [ 505 | "bstr", 506 | "csv-core", 507 | "itoa 0.4.8", 508 | "ryu", 509 | "serde", 510 | ] 511 | 512 | [[package]] 513 | name = "csv-core" 514 | version = "0.1.10" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" 517 | dependencies = [ 518 | "memchr", 519 | ] 520 | 521 | [[package]] 522 | name = "dialoguer" 523 | version = "0.10.2" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "a92e7e37ecef6857fdc0c0c5d42fd5b0938e46590c2183cc92dd310a6d078eb1" 526 | dependencies = [ 527 | "console", 528 | "tempfile", 529 | "zeroize", 530 | ] 531 | 532 | [[package]] 533 | name = "digest" 534 | version = "0.10.5" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" 537 | dependencies = [ 538 | "block-buffer", 539 | "crypto-common", 540 | ] 541 | 542 | [[package]] 543 | name = "directories" 544 | version = "4.0.1" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" 547 | dependencies = [ 548 | "dirs-sys", 549 | ] 550 | 551 | [[package]] 552 | name = "directories-next" 553 | version = "2.0.0" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" 556 | dependencies = [ 557 | "cfg-if", 558 | "dirs-sys-next", 559 | ] 560 | 561 | [[package]] 562 | name = "dirs-sys" 563 | version = "0.3.7" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 566 | dependencies = [ 567 | "libc", 568 | "redox_users", 569 | "winapi", 570 | ] 571 | 572 | [[package]] 573 | name = "dirs-sys-next" 574 | version = "0.1.2" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 577 | dependencies = [ 578 | "libc", 579 | "redox_users", 580 | "winapi", 581 | ] 582 | 583 | [[package]] 584 | name = "either" 585 | version = "1.8.0" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 588 | 589 | [[package]] 590 | name = "encode_unicode" 591 | version = "0.3.6" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 594 | 595 | [[package]] 596 | name = "espflash" 597 | version = "1.7.0" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "7353f886e9b14407c37a0ef89657d7ff88ecf7dcaf97074301777c148208014d" 600 | dependencies = [ 601 | "base64", 602 | "binread", 603 | "bytemuck", 604 | "clap", 605 | "comfy-table", 606 | "crossterm 0.25.0", 607 | "csv", 608 | "dialoguer", 609 | "directories-next", 610 | "espmonitor", 611 | "flate2", 612 | "indicatif", 613 | "log", 614 | "maplit", 615 | "md5", 616 | "miette", 617 | "parse_int", 618 | "regex", 619 | "serde", 620 | "serde-hex", 621 | "serde_json", 622 | "serde_plain", 623 | "serialport", 624 | "sha2", 625 | "slip-codec", 626 | "strum", 627 | "strum_macros", 628 | "thiserror", 629 | "toml", 630 | "tracing-subscriber", 631 | "update-informer", 632 | "xmas-elf", 633 | ] 634 | 635 | [[package]] 636 | name = "espmonitor" 637 | version = "0.10.0" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "02d8108f9eddda1613b8c558a3bf0a363187e743f9b4825613dd924b9f422e6d" 640 | dependencies = [ 641 | "addr2line", 642 | "clap", 643 | "crossterm 0.23.2", 644 | "gimli", 645 | "lazy_static", 646 | "nix", 647 | "object 0.27.1", 648 | "regex", 649 | "serial", 650 | ] 651 | 652 | [[package]] 653 | name = "fallible-iterator" 654 | version = "0.2.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 657 | 658 | [[package]] 659 | name = "fastrand" 660 | version = "1.8.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 663 | dependencies = [ 664 | "instant", 665 | ] 666 | 667 | [[package]] 668 | name = "flate2" 669 | version = "1.0.24" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 672 | dependencies = [ 673 | "crc32fast", 674 | "miniz_oxide", 675 | ] 676 | 677 | [[package]] 678 | name = "fnv" 679 | version = "1.0.7" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 682 | 683 | [[package]] 684 | name = "form_urlencoded" 685 | version = "1.1.0" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 688 | dependencies = [ 689 | "percent-encoding", 690 | ] 691 | 692 | [[package]] 693 | name = "futures" 694 | version = "0.3.24" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" 697 | dependencies = [ 698 | "futures-channel", 699 | "futures-core", 700 | "futures-io", 701 | "futures-sink", 702 | "futures-task", 703 | "futures-util", 704 | ] 705 | 706 | [[package]] 707 | name = "futures-channel" 708 | version = "0.3.24" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" 711 | dependencies = [ 712 | "futures-core", 713 | "futures-sink", 714 | ] 715 | 716 | [[package]] 717 | name = "futures-core" 718 | version = "0.3.24" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" 721 | 722 | [[package]] 723 | name = "futures-io" 724 | version = "0.3.24" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" 727 | 728 | [[package]] 729 | name = "futures-macro" 730 | version = "0.3.24" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" 733 | dependencies = [ 734 | "proc-macro2", 735 | "quote", 736 | "syn", 737 | ] 738 | 739 | [[package]] 740 | name = "futures-sink" 741 | version = "0.3.24" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" 744 | 745 | [[package]] 746 | name = "futures-task" 747 | version = "0.3.24" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" 750 | 751 | [[package]] 752 | name = "futures-util" 753 | version = "0.3.24" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" 756 | dependencies = [ 757 | "futures-core", 758 | "futures-macro", 759 | "futures-sink", 760 | "futures-task", 761 | "pin-project-lite", 762 | "pin-utils", 763 | "slab", 764 | ] 765 | 766 | [[package]] 767 | name = "generic-array" 768 | version = "0.14.6" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 771 | dependencies = [ 772 | "typenum", 773 | "version_check", 774 | ] 775 | 776 | [[package]] 777 | name = "getrandom" 778 | version = "0.2.7" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 781 | dependencies = [ 782 | "cfg-if", 783 | "libc", 784 | "wasi", 785 | ] 786 | 787 | [[package]] 788 | name = "gimli" 789 | version = "0.26.2" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 792 | dependencies = [ 793 | "fallible-iterator", 794 | "indexmap", 795 | "stable_deref_trait", 796 | ] 797 | 798 | [[package]] 799 | name = "h2" 800 | version = "0.3.14" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" 803 | dependencies = [ 804 | "bytes", 805 | "fnv", 806 | "futures-core", 807 | "futures-sink", 808 | "futures-util", 809 | "http", 810 | "indexmap", 811 | "slab", 812 | "tokio", 813 | "tokio-util", 814 | "tracing", 815 | ] 816 | 817 | [[package]] 818 | name = "hashbrown" 819 | version = "0.12.3" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 822 | dependencies = [ 823 | "ahash", 824 | ] 825 | 826 | [[package]] 827 | name = "hdrhistogram" 828 | version = "7.5.2" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8" 831 | dependencies = [ 832 | "base64", 833 | "byteorder", 834 | "flate2", 835 | "nom", 836 | "num-traits", 837 | ] 838 | 839 | [[package]] 840 | name = "heck" 841 | version = "0.4.0" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 844 | 845 | [[package]] 846 | name = "hermit-abi" 847 | version = "0.1.19" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 850 | dependencies = [ 851 | "libc", 852 | ] 853 | 854 | [[package]] 855 | name = "http" 856 | version = "0.2.8" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 859 | dependencies = [ 860 | "bytes", 861 | "fnv", 862 | "itoa 1.0.4", 863 | ] 864 | 865 | [[package]] 866 | name = "http-body" 867 | version = "0.4.5" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 870 | dependencies = [ 871 | "bytes", 872 | "http", 873 | "pin-project-lite", 874 | ] 875 | 876 | [[package]] 877 | name = "http-range-header" 878 | version = "0.3.0" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" 881 | 882 | [[package]] 883 | name = "httparse" 884 | version = "1.8.0" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 887 | 888 | [[package]] 889 | name = "httpdate" 890 | version = "1.0.2" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 893 | 894 | [[package]] 895 | name = "humantime" 896 | version = "2.1.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 899 | 900 | [[package]] 901 | name = "hyper" 902 | version = "0.14.20" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 905 | dependencies = [ 906 | "bytes", 907 | "futures-channel", 908 | "futures-core", 909 | "futures-util", 910 | "h2", 911 | "http", 912 | "http-body", 913 | "httparse", 914 | "httpdate", 915 | "itoa 1.0.4", 916 | "pin-project-lite", 917 | "socket2", 918 | "tokio", 919 | "tower-service", 920 | "tracing", 921 | "want", 922 | ] 923 | 924 | [[package]] 925 | name = "hyper-timeout" 926 | version = "0.4.1" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" 929 | dependencies = [ 930 | "hyper", 931 | "pin-project-lite", 932 | "tokio", 933 | "tokio-io-timeout", 934 | ] 935 | 936 | [[package]] 937 | name = "idna" 938 | version = "0.3.0" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 941 | dependencies = [ 942 | "unicode-bidi", 943 | "unicode-normalization", 944 | ] 945 | 946 | [[package]] 947 | name = "indexmap" 948 | version = "1.9.1" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 951 | dependencies = [ 952 | "autocfg", 953 | "hashbrown", 954 | ] 955 | 956 | [[package]] 957 | name = "indicatif" 958 | version = "0.17.1" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "bfddc9561e8baf264e0e45e197fd7696320026eb10a8180340debc27b18f535b" 961 | dependencies = [ 962 | "console", 963 | "number_prefix", 964 | "unicode-width", 965 | ] 966 | 967 | [[package]] 968 | name = "instant" 969 | version = "0.1.12" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 972 | dependencies = [ 973 | "cfg-if", 974 | ] 975 | 976 | [[package]] 977 | name = "ioctl-rs" 978 | version = "0.1.6" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d" 981 | dependencies = [ 982 | "libc", 983 | ] 984 | 985 | [[package]] 986 | name = "is_ci" 987 | version = "1.1.1" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" 990 | 991 | [[package]] 992 | name = "itertools" 993 | version = "0.10.5" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 996 | dependencies = [ 997 | "either", 998 | ] 999 | 1000 | [[package]] 1001 | name = "itoa" 1002 | version = "0.4.8" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 1005 | 1006 | [[package]] 1007 | name = "itoa" 1008 | version = "1.0.4" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" 1011 | 1012 | [[package]] 1013 | name = "js-sys" 1014 | version = "0.3.60" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 1017 | dependencies = [ 1018 | "wasm-bindgen", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "lazy_static" 1023 | version = "1.4.0" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1026 | 1027 | [[package]] 1028 | name = "libc" 1029 | version = "0.2.135" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" 1032 | 1033 | [[package]] 1034 | name = "libudev" 1035 | version = "0.3.0" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" 1038 | dependencies = [ 1039 | "libc", 1040 | "libudev-sys", 1041 | ] 1042 | 1043 | [[package]] 1044 | name = "libudev-sys" 1045 | version = "0.1.4" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" 1048 | dependencies = [ 1049 | "libc", 1050 | "pkg-config", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "lock_api" 1055 | version = "0.4.9" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1058 | dependencies = [ 1059 | "autocfg", 1060 | "scopeguard", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "log" 1065 | version = "0.4.17" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1068 | dependencies = [ 1069 | "cfg-if", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "mach" 1074 | version = "0.1.2" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "2fd13ee2dd61cc82833ba05ade5a30bb3d63f7ced605ef827063c63078302de9" 1077 | dependencies = [ 1078 | "libc", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "mach" 1083 | version = "0.3.2" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" 1086 | dependencies = [ 1087 | "libc", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "maplit" 1092 | version = "1.0.2" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 1095 | 1096 | [[package]] 1097 | name = "matchers" 1098 | version = "0.1.0" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1101 | dependencies = [ 1102 | "regex-automata", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "matchit" 1107 | version = "0.5.0" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" 1110 | 1111 | [[package]] 1112 | name = "maybe-uninit" 1113 | version = "2.0.0" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 1116 | 1117 | [[package]] 1118 | name = "md5" 1119 | version = "0.7.0" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 1122 | 1123 | [[package]] 1124 | name = "memchr" 1125 | version = "2.5.0" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1128 | 1129 | [[package]] 1130 | name = "memoffset" 1131 | version = "0.6.5" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1134 | dependencies = [ 1135 | "autocfg", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "miette" 1140 | version = "5.3.0" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "a28d6092d7e94a90bb9ea8e6c26c99d5d112d49dda2afdb4f7ea8cf09e1a5a6d" 1143 | dependencies = [ 1144 | "atty", 1145 | "backtrace", 1146 | "miette-derive", 1147 | "once_cell", 1148 | "owo-colors", 1149 | "supports-color", 1150 | "supports-hyperlinks", 1151 | "supports-unicode", 1152 | "terminal_size", 1153 | "textwrap", 1154 | "thiserror", 1155 | "unicode-width", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "miette-derive" 1160 | version = "5.3.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "4f2485ed7d1fe80704928e3eb86387439609bd0c6bb96db8208daa364cfd1e09" 1163 | dependencies = [ 1164 | "proc-macro2", 1165 | "quote", 1166 | "syn", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "mime" 1171 | version = "0.3.16" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1174 | 1175 | [[package]] 1176 | name = "minimal-lexical" 1177 | version = "0.2.1" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1180 | 1181 | [[package]] 1182 | name = "miniz_oxide" 1183 | version = "0.5.4" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" 1186 | dependencies = [ 1187 | "adler", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "mio" 1192 | version = "0.8.4" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1195 | dependencies = [ 1196 | "libc", 1197 | "log", 1198 | "wasi", 1199 | "windows-sys", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "nix" 1204 | version = "0.24.2" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" 1207 | dependencies = [ 1208 | "bitflags", 1209 | "cfg-if", 1210 | "libc", 1211 | "memoffset", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "nodrop" 1216 | version = "0.1.14" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" 1219 | 1220 | [[package]] 1221 | name = "nom" 1222 | version = "7.1.1" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" 1225 | dependencies = [ 1226 | "memchr", 1227 | "minimal-lexical", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "nu-ansi-term" 1232 | version = "0.46.0" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1235 | dependencies = [ 1236 | "overload", 1237 | "winapi", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "num-traits" 1242 | version = "0.2.15" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1245 | dependencies = [ 1246 | "autocfg", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "num_cpus" 1251 | version = "1.13.1" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1254 | dependencies = [ 1255 | "hermit-abi", 1256 | "libc", 1257 | ] 1258 | 1259 | [[package]] 1260 | name = "number_prefix" 1261 | version = "0.4.0" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 1264 | 1265 | [[package]] 1266 | name = "object" 1267 | version = "0.27.1" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" 1270 | dependencies = [ 1271 | "flate2", 1272 | "memchr", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "object" 1277 | version = "0.29.0" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" 1280 | dependencies = [ 1281 | "memchr", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "once_cell" 1286 | version = "1.15.0" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" 1289 | 1290 | [[package]] 1291 | name = "opener" 1292 | version = "0.5.0" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "4ea3ebcd72a54701f56345f16785a6d3ac2df7e986d273eb4395c0b01db17952" 1295 | dependencies = [ 1296 | "bstr", 1297 | "winapi", 1298 | ] 1299 | 1300 | [[package]] 1301 | name = "os_str_bytes" 1302 | version = "6.3.0" 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" 1304 | checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" 1305 | 1306 | [[package]] 1307 | name = "overload" 1308 | version = "0.1.1" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1311 | 1312 | [[package]] 1313 | name = "owo-colors" 1314 | version = "3.5.0" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 1317 | 1318 | [[package]] 1319 | name = "parking_lot" 1320 | version = "0.12.1" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1323 | dependencies = [ 1324 | "lock_api", 1325 | "parking_lot_core", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "parking_lot_core" 1330 | version = "0.9.3" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 1333 | dependencies = [ 1334 | "cfg-if", 1335 | "libc", 1336 | "redox_syscall", 1337 | "smallvec 1.10.0", 1338 | "windows-sys", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "parse_int" 1343 | version = "0.6.0" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "2d695b79916a2c08bcff7be7647ab60d1402885265005a6658ffe6d763553c5a" 1346 | dependencies = [ 1347 | "num-traits", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "percent-encoding" 1352 | version = "2.2.0" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1355 | 1356 | [[package]] 1357 | name = "pin-project" 1358 | version = "1.0.12" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 1361 | dependencies = [ 1362 | "pin-project-internal", 1363 | ] 1364 | 1365 | [[package]] 1366 | name = "pin-project-internal" 1367 | version = "1.0.12" 1368 | source = "registry+https://github.com/rust-lang/crates.io-index" 1369 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 1370 | dependencies = [ 1371 | "proc-macro2", 1372 | "quote", 1373 | "syn", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "pin-project-lite" 1378 | version = "0.2.9" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1381 | 1382 | [[package]] 1383 | name = "pin-utils" 1384 | version = "0.1.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1387 | 1388 | [[package]] 1389 | name = "pkg-config" 1390 | version = "0.3.25" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1393 | 1394 | [[package]] 1395 | name = "ppv-lite86" 1396 | version = "0.2.16" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1399 | 1400 | [[package]] 1401 | name = "proc-macro-error" 1402 | version = "1.0.4" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1405 | dependencies = [ 1406 | "proc-macro-error-attr", 1407 | "proc-macro2", 1408 | "quote", 1409 | "syn", 1410 | "version_check", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "proc-macro-error-attr" 1415 | version = "1.0.4" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1418 | dependencies = [ 1419 | "proc-macro2", 1420 | "quote", 1421 | "version_check", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "proc-macro2" 1426 | version = "1.0.46" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" 1429 | dependencies = [ 1430 | "unicode-ident", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "prost" 1435 | version = "0.11.0" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "399c3c31cdec40583bb68f0b18403400d01ec4289c383aa047560439952c4dd7" 1438 | dependencies = [ 1439 | "bytes", 1440 | "prost-derive", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "prost-derive" 1445 | version = "0.11.0" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "7345d5f0e08c0536d7ac7229952590239e77abf0a0100a1b1d890add6ea96364" 1448 | dependencies = [ 1449 | "anyhow", 1450 | "itertools", 1451 | "proc-macro2", 1452 | "quote", 1453 | "syn", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "prost-types" 1458 | version = "0.11.1" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "4dfaa718ad76a44b3415e6c4d53b17c8f99160dcb3a99b10470fce8ad43f6e3e" 1461 | dependencies = [ 1462 | "bytes", 1463 | "prost", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "quote" 1468 | version = "1.0.21" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1471 | dependencies = [ 1472 | "proc-macro2", 1473 | ] 1474 | 1475 | [[package]] 1476 | name = "rand" 1477 | version = "0.8.5" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1480 | dependencies = [ 1481 | "libc", 1482 | "rand_chacha", 1483 | "rand_core", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "rand_chacha" 1488 | version = "0.3.1" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1491 | dependencies = [ 1492 | "ppv-lite86", 1493 | "rand_core", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "rand_core" 1498 | version = "0.6.4" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1501 | dependencies = [ 1502 | "getrandom", 1503 | ] 1504 | 1505 | [[package]] 1506 | name = "redox_syscall" 1507 | version = "0.2.16" 1508 | source = "registry+https://github.com/rust-lang/crates.io-index" 1509 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1510 | dependencies = [ 1511 | "bitflags", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "redox_users" 1516 | version = "0.4.3" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 1519 | dependencies = [ 1520 | "getrandom", 1521 | "redox_syscall", 1522 | "thiserror", 1523 | ] 1524 | 1525 | [[package]] 1526 | name = "regex" 1527 | version = "1.6.0" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1530 | dependencies = [ 1531 | "aho-corasick", 1532 | "memchr", 1533 | "regex-syntax", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "regex-automata" 1538 | version = "0.1.10" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1541 | dependencies = [ 1542 | "regex-syntax", 1543 | ] 1544 | 1545 | [[package]] 1546 | name = "regex-syntax" 1547 | version = "0.6.27" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1550 | 1551 | [[package]] 1552 | name = "remove_dir_all" 1553 | version = "0.5.3" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1556 | dependencies = [ 1557 | "winapi", 1558 | ] 1559 | 1560 | [[package]] 1561 | name = "ring" 1562 | version = "0.16.20" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 1565 | dependencies = [ 1566 | "cc", 1567 | "libc", 1568 | "once_cell", 1569 | "spin", 1570 | "untrusted", 1571 | "web-sys", 1572 | "winapi", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "rustc-demangle" 1577 | version = "0.1.21" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" 1580 | 1581 | [[package]] 1582 | name = "rustls" 1583 | version = "0.20.6" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" 1586 | dependencies = [ 1587 | "log", 1588 | "ring", 1589 | "sct", 1590 | "webpki", 1591 | ] 1592 | 1593 | [[package]] 1594 | name = "rustversion" 1595 | version = "1.0.9" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 1598 | 1599 | [[package]] 1600 | name = "ryu" 1601 | version = "1.0.11" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1604 | 1605 | [[package]] 1606 | name = "scopeguard" 1607 | version = "1.1.0" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1610 | 1611 | [[package]] 1612 | name = "sct" 1613 | version = "0.7.0" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 1616 | dependencies = [ 1617 | "ring", 1618 | "untrusted", 1619 | ] 1620 | 1621 | [[package]] 1622 | name = "semver" 1623 | version = "1.0.14" 1624 | source = "registry+https://github.com/rust-lang/crates.io-index" 1625 | checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" 1626 | 1627 | [[package]] 1628 | name = "serde" 1629 | version = "1.0.145" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" 1632 | dependencies = [ 1633 | "serde_derive", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "serde-hex" 1638 | version = "0.1.0" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "ca37e3e4d1b39afd7ff11ee4e947efae85adfddf4841787bfa47c470e96dc26d" 1641 | dependencies = [ 1642 | "array-init", 1643 | "serde", 1644 | "smallvec 0.6.14", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "serde_derive" 1649 | version = "1.0.145" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" 1652 | dependencies = [ 1653 | "proc-macro2", 1654 | "quote", 1655 | "syn", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "serde_json" 1660 | version = "1.0.86" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" 1663 | dependencies = [ 1664 | "itoa 1.0.4", 1665 | "ryu", 1666 | "serde", 1667 | ] 1668 | 1669 | [[package]] 1670 | name = "serde_plain" 1671 | version = "1.0.0" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | checksum = "95455e7e29fada2052e72170af226fbe368a4ca33dee847875325d9fdb133858" 1674 | dependencies = [ 1675 | "serde", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "serial" 1680 | version = "0.4.0" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86" 1683 | dependencies = [ 1684 | "serial-core", 1685 | "serial-unix", 1686 | "serial-windows", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "serial-core" 1691 | version = "0.4.0" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581" 1694 | dependencies = [ 1695 | "libc", 1696 | ] 1697 | 1698 | [[package]] 1699 | name = "serial-unix" 1700 | version = "0.4.0" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7" 1703 | dependencies = [ 1704 | "ioctl-rs", 1705 | "libc", 1706 | "serial-core", 1707 | "termios", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "serial-windows" 1712 | version = "0.4.0" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162" 1715 | dependencies = [ 1716 | "libc", 1717 | "serial-core", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "serialport" 1722 | version = "4.2.0" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "aab92efb5cf60ad310548bc3f16fa6b0d950019cb7ed8ff41968c3d03721cf12" 1725 | dependencies = [ 1726 | "CoreFoundation-sys", 1727 | "IOKit-sys", 1728 | "bitflags", 1729 | "cfg-if", 1730 | "libudev", 1731 | "mach 0.3.2", 1732 | "nix", 1733 | "regex", 1734 | "winapi", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "sha-1" 1739 | version = "0.10.0" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" 1742 | dependencies = [ 1743 | "cfg-if", 1744 | "cpufeatures", 1745 | "digest", 1746 | ] 1747 | 1748 | [[package]] 1749 | name = "sha2" 1750 | version = "0.10.6" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 1753 | dependencies = [ 1754 | "cfg-if", 1755 | "cpufeatures", 1756 | "digest", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "sharded-slab" 1761 | version = "0.1.4" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 1764 | dependencies = [ 1765 | "lazy_static", 1766 | ] 1767 | 1768 | [[package]] 1769 | name = "signal-hook" 1770 | version = "0.3.14" 1771 | source = "registry+https://github.com/rust-lang/crates.io-index" 1772 | checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" 1773 | dependencies = [ 1774 | "libc", 1775 | "signal-hook-registry", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "signal-hook-mio" 1780 | version = "0.2.3" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" 1783 | dependencies = [ 1784 | "libc", 1785 | "mio", 1786 | "signal-hook", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "signal-hook-registry" 1791 | version = "1.4.0" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 1794 | dependencies = [ 1795 | "libc", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "slab" 1800 | version = "0.4.7" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 1803 | dependencies = [ 1804 | "autocfg", 1805 | ] 1806 | 1807 | [[package]] 1808 | name = "slip-codec" 1809 | version = "0.3.3" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "16f79a64a7c3cf9c25da0e0ef422db7ba3694b58b2e218692cb9f5c47fbaaff4" 1812 | 1813 | [[package]] 1814 | name = "smallvec" 1815 | version = "0.6.14" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" 1818 | dependencies = [ 1819 | "maybe-uninit", 1820 | ] 1821 | 1822 | [[package]] 1823 | name = "smallvec" 1824 | version = "1.10.0" 1825 | source = "registry+https://github.com/rust-lang/crates.io-index" 1826 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 1827 | 1828 | [[package]] 1829 | name = "smawk" 1830 | version = "0.3.1" 1831 | source = "registry+https://github.com/rust-lang/crates.io-index" 1832 | checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" 1833 | 1834 | [[package]] 1835 | name = "socket2" 1836 | version = "0.4.7" 1837 | source = "registry+https://github.com/rust-lang/crates.io-index" 1838 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1839 | dependencies = [ 1840 | "libc", 1841 | "winapi", 1842 | ] 1843 | 1844 | [[package]] 1845 | name = "spin" 1846 | version = "0.5.2" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1849 | 1850 | [[package]] 1851 | name = "stable_deref_trait" 1852 | version = "1.2.0" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1855 | 1856 | [[package]] 1857 | name = "strsim" 1858 | version = "0.10.0" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1861 | 1862 | [[package]] 1863 | name = "strum" 1864 | version = "0.24.1" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" 1867 | 1868 | [[package]] 1869 | name = "strum_macros" 1870 | version = "0.24.3" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 1873 | dependencies = [ 1874 | "heck", 1875 | "proc-macro2", 1876 | "quote", 1877 | "rustversion", 1878 | "syn", 1879 | ] 1880 | 1881 | [[package]] 1882 | name = "supports-color" 1883 | version = "1.3.0" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "4872ced36b91d47bae8a214a683fe54e7078875b399dfa251df346c9b547d1f9" 1886 | dependencies = [ 1887 | "atty", 1888 | "is_ci", 1889 | ] 1890 | 1891 | [[package]] 1892 | name = "supports-hyperlinks" 1893 | version = "1.2.0" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "590b34f7c5f01ecc9d78dba4b3f445f31df750a67621cf31626f3b7441ce6406" 1896 | dependencies = [ 1897 | "atty", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "supports-unicode" 1902 | version = "1.0.2" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "a8b945e45b417b125a8ec51f1b7df2f8df7920367700d1f98aedd21e5735f8b2" 1905 | dependencies = [ 1906 | "atty", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "syn" 1911 | version = "1.0.102" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" 1914 | dependencies = [ 1915 | "proc-macro2", 1916 | "quote", 1917 | "unicode-ident", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "sync_wrapper" 1922 | version = "0.1.1" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" 1925 | 1926 | [[package]] 1927 | name = "tempfile" 1928 | version = "3.3.0" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 1931 | dependencies = [ 1932 | "cfg-if", 1933 | "fastrand", 1934 | "libc", 1935 | "redox_syscall", 1936 | "remove_dir_all", 1937 | "winapi", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "termcolor" 1942 | version = "1.1.3" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 1945 | dependencies = [ 1946 | "winapi-util", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "terminal_size" 1951 | version = "0.1.17" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 1954 | dependencies = [ 1955 | "libc", 1956 | "winapi", 1957 | ] 1958 | 1959 | [[package]] 1960 | name = "termios" 1961 | version = "0.2.2" 1962 | source = "registry+https://github.com/rust-lang/crates.io-index" 1963 | checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" 1964 | dependencies = [ 1965 | "libc", 1966 | ] 1967 | 1968 | [[package]] 1969 | name = "textwrap" 1970 | version = "0.15.1" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" 1973 | dependencies = [ 1974 | "smawk", 1975 | "unicode-linebreak", 1976 | "unicode-width", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "thiserror" 1981 | version = "1.0.37" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 1984 | dependencies = [ 1985 | "thiserror-impl", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "thiserror-impl" 1990 | version = "1.0.37" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 1993 | dependencies = [ 1994 | "proc-macro2", 1995 | "quote", 1996 | "syn", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "thread_local" 2001 | version = "1.1.4" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 2004 | dependencies = [ 2005 | "once_cell", 2006 | ] 2007 | 2008 | [[package]] 2009 | name = "tinyvec" 2010 | version = "1.6.0" 2011 | source = "registry+https://github.com/rust-lang/crates.io-index" 2012 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2013 | dependencies = [ 2014 | "tinyvec_macros", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "tinyvec_macros" 2019 | version = "0.1.0" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2022 | 2023 | [[package]] 2024 | name = "tokio" 2025 | version = "1.21.2" 2026 | source = "registry+https://github.com/rust-lang/crates.io-index" 2027 | checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" 2028 | dependencies = [ 2029 | "autocfg", 2030 | "bytes", 2031 | "libc", 2032 | "memchr", 2033 | "mio", 2034 | "num_cpus", 2035 | "parking_lot", 2036 | "pin-project-lite", 2037 | "signal-hook-registry", 2038 | "socket2", 2039 | "tokio-macros", 2040 | "tracing", 2041 | "winapi", 2042 | ] 2043 | 2044 | [[package]] 2045 | name = "tokio-io-timeout" 2046 | version = "1.2.0" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" 2049 | dependencies = [ 2050 | "pin-project-lite", 2051 | "tokio", 2052 | ] 2053 | 2054 | [[package]] 2055 | name = "tokio-macros" 2056 | version = "1.8.0" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 2059 | dependencies = [ 2060 | "proc-macro2", 2061 | "quote", 2062 | "syn", 2063 | ] 2064 | 2065 | [[package]] 2066 | name = "tokio-stream" 2067 | version = "0.1.11" 2068 | source = "registry+https://github.com/rust-lang/crates.io-index" 2069 | checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" 2070 | dependencies = [ 2071 | "futures-core", 2072 | "pin-project-lite", 2073 | "tokio", 2074 | ] 2075 | 2076 | [[package]] 2077 | name = "tokio-tungstenite" 2078 | version = "0.17.2" 2079 | source = "registry+https://github.com/rust-lang/crates.io-index" 2080 | checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" 2081 | dependencies = [ 2082 | "futures-util", 2083 | "log", 2084 | "tokio", 2085 | "tungstenite", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "tokio-util" 2090 | version = "0.7.4" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 2093 | dependencies = [ 2094 | "bytes", 2095 | "futures-core", 2096 | "futures-sink", 2097 | "pin-project-lite", 2098 | "tokio", 2099 | "tracing", 2100 | ] 2101 | 2102 | [[package]] 2103 | name = "toml" 2104 | version = "0.5.9" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2107 | dependencies = [ 2108 | "serde", 2109 | ] 2110 | 2111 | [[package]] 2112 | name = "tonic" 2113 | version = "0.8.2" 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" 2115 | checksum = "55b9af819e54b8f33d453655bef9b9acc171568fb49523078d0cc4e7484200ec" 2116 | dependencies = [ 2117 | "async-stream", 2118 | "async-trait", 2119 | "axum", 2120 | "base64", 2121 | "bytes", 2122 | "futures-core", 2123 | "futures-util", 2124 | "h2", 2125 | "http", 2126 | "http-body", 2127 | "hyper", 2128 | "hyper-timeout", 2129 | "percent-encoding", 2130 | "pin-project", 2131 | "prost", 2132 | "prost-derive", 2133 | "tokio", 2134 | "tokio-stream", 2135 | "tokio-util", 2136 | "tower", 2137 | "tower-layer", 2138 | "tower-service", 2139 | "tracing", 2140 | "tracing-futures", 2141 | ] 2142 | 2143 | [[package]] 2144 | name = "tower" 2145 | version = "0.4.13" 2146 | source = "registry+https://github.com/rust-lang/crates.io-index" 2147 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2148 | dependencies = [ 2149 | "futures-core", 2150 | "futures-util", 2151 | "indexmap", 2152 | "pin-project", 2153 | "pin-project-lite", 2154 | "rand", 2155 | "slab", 2156 | "tokio", 2157 | "tokio-util", 2158 | "tower-layer", 2159 | "tower-service", 2160 | "tracing", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "tower-http" 2165 | version = "0.3.4" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" 2168 | dependencies = [ 2169 | "bitflags", 2170 | "bytes", 2171 | "futures-core", 2172 | "futures-util", 2173 | "http", 2174 | "http-body", 2175 | "http-range-header", 2176 | "pin-project-lite", 2177 | "tower", 2178 | "tower-layer", 2179 | "tower-service", 2180 | ] 2181 | 2182 | [[package]] 2183 | name = "tower-layer" 2184 | version = "0.3.2" 2185 | source = "registry+https://github.com/rust-lang/crates.io-index" 2186 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2187 | 2188 | [[package]] 2189 | name = "tower-service" 2190 | version = "0.3.2" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2193 | 2194 | [[package]] 2195 | name = "tracing" 2196 | version = "0.1.37" 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" 2198 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 2199 | dependencies = [ 2200 | "cfg-if", 2201 | "log", 2202 | "pin-project-lite", 2203 | "tracing-attributes", 2204 | "tracing-core", 2205 | ] 2206 | 2207 | [[package]] 2208 | name = "tracing-attributes" 2209 | version = "0.1.23" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 2212 | dependencies = [ 2213 | "proc-macro2", 2214 | "quote", 2215 | "syn", 2216 | ] 2217 | 2218 | [[package]] 2219 | name = "tracing-core" 2220 | version = "0.1.30" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 2223 | dependencies = [ 2224 | "once_cell", 2225 | "valuable", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "tracing-futures" 2230 | version = "0.2.5" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 2233 | dependencies = [ 2234 | "pin-project", 2235 | "tracing", 2236 | ] 2237 | 2238 | [[package]] 2239 | name = "tracing-log" 2240 | version = "0.1.3" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 2243 | dependencies = [ 2244 | "lazy_static", 2245 | "log", 2246 | "tracing-core", 2247 | ] 2248 | 2249 | [[package]] 2250 | name = "tracing-subscriber" 2251 | version = "0.3.16" 2252 | source = "registry+https://github.com/rust-lang/crates.io-index" 2253 | checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" 2254 | dependencies = [ 2255 | "matchers", 2256 | "nu-ansi-term", 2257 | "once_cell", 2258 | "regex", 2259 | "sharded-slab", 2260 | "smallvec 1.10.0", 2261 | "thread_local", 2262 | "tracing", 2263 | "tracing-core", 2264 | "tracing-log", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "try-lock" 2269 | version = "0.2.3" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2272 | 2273 | [[package]] 2274 | name = "tungstenite" 2275 | version = "0.17.3" 2276 | source = "registry+https://github.com/rust-lang/crates.io-index" 2277 | checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" 2278 | dependencies = [ 2279 | "base64", 2280 | "byteorder", 2281 | "bytes", 2282 | "http", 2283 | "httparse", 2284 | "log", 2285 | "rand", 2286 | "sha-1", 2287 | "thiserror", 2288 | "url", 2289 | "utf-8", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "typenum" 2294 | version = "1.15.0" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 2297 | 2298 | [[package]] 2299 | name = "unicode-bidi" 2300 | version = "0.3.8" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2303 | 2304 | [[package]] 2305 | name = "unicode-ident" 2306 | version = "1.0.5" 2307 | source = "registry+https://github.com/rust-lang/crates.io-index" 2308 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 2309 | 2310 | [[package]] 2311 | name = "unicode-linebreak" 2312 | version = "0.1.4" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "c5faade31a542b8b35855fff6e8def199853b2da8da256da52f52f1316ee3137" 2315 | dependencies = [ 2316 | "hashbrown", 2317 | "regex", 2318 | ] 2319 | 2320 | [[package]] 2321 | name = "unicode-normalization" 2322 | version = "0.1.22" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2325 | dependencies = [ 2326 | "tinyvec", 2327 | ] 2328 | 2329 | [[package]] 2330 | name = "unicode-width" 2331 | version = "0.1.10" 2332 | source = "registry+https://github.com/rust-lang/crates.io-index" 2333 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 2334 | 2335 | [[package]] 2336 | name = "untrusted" 2337 | version = "0.7.1" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 2340 | 2341 | [[package]] 2342 | name = "update-informer" 2343 | version = "0.5.0" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | checksum = "f154aee470c0882ea0f3b1cc2a46c5f4d24f282655f7b0cec065614fe24c447f" 2346 | dependencies = [ 2347 | "directories", 2348 | "semver", 2349 | "serde", 2350 | "serde_json", 2351 | "ureq", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "ureq" 2356 | version = "2.5.0" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "b97acb4c28a254fd7a4aeec976c46a7fa404eac4d7c134b30c75144846d7cb8f" 2359 | dependencies = [ 2360 | "base64", 2361 | "chunked_transfer", 2362 | "flate2", 2363 | "log", 2364 | "once_cell", 2365 | "rustls", 2366 | "serde", 2367 | "serde_json", 2368 | "url", 2369 | "webpki", 2370 | "webpki-roots", 2371 | ] 2372 | 2373 | [[package]] 2374 | name = "url" 2375 | version = "2.3.1" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 2378 | dependencies = [ 2379 | "form_urlencoded", 2380 | "idna", 2381 | "percent-encoding", 2382 | ] 2383 | 2384 | [[package]] 2385 | name = "utf-8" 2386 | version = "0.7.6" 2387 | source = "registry+https://github.com/rust-lang/crates.io-index" 2388 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2389 | 2390 | [[package]] 2391 | name = "valuable" 2392 | version = "0.1.0" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2395 | 2396 | [[package]] 2397 | name = "version_check" 2398 | version = "0.9.4" 2399 | source = "registry+https://github.com/rust-lang/crates.io-index" 2400 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2401 | 2402 | [[package]] 2403 | name = "want" 2404 | version = "0.3.0" 2405 | source = "registry+https://github.com/rust-lang/crates.io-index" 2406 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2407 | dependencies = [ 2408 | "log", 2409 | "try-lock", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "wasi" 2414 | version = "0.11.0+wasi-snapshot-preview1" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2417 | 2418 | [[package]] 2419 | name = "wasm-bindgen" 2420 | version = "0.2.83" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 2423 | dependencies = [ 2424 | "cfg-if", 2425 | "wasm-bindgen-macro", 2426 | ] 2427 | 2428 | [[package]] 2429 | name = "wasm-bindgen-backend" 2430 | version = "0.2.83" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 2433 | dependencies = [ 2434 | "bumpalo", 2435 | "log", 2436 | "once_cell", 2437 | "proc-macro2", 2438 | "quote", 2439 | "syn", 2440 | "wasm-bindgen-shared", 2441 | ] 2442 | 2443 | [[package]] 2444 | name = "wasm-bindgen-macro" 2445 | version = "0.2.83" 2446 | source = "registry+https://github.com/rust-lang/crates.io-index" 2447 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 2448 | dependencies = [ 2449 | "quote", 2450 | "wasm-bindgen-macro-support", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "wasm-bindgen-macro-support" 2455 | version = "0.2.83" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 2458 | dependencies = [ 2459 | "proc-macro2", 2460 | "quote", 2461 | "syn", 2462 | "wasm-bindgen-backend", 2463 | "wasm-bindgen-shared", 2464 | ] 2465 | 2466 | [[package]] 2467 | name = "wasm-bindgen-shared" 2468 | version = "0.2.83" 2469 | source = "registry+https://github.com/rust-lang/crates.io-index" 2470 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 2471 | 2472 | [[package]] 2473 | name = "web-sys" 2474 | version = "0.3.60" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 2477 | dependencies = [ 2478 | "js-sys", 2479 | "wasm-bindgen", 2480 | ] 2481 | 2482 | [[package]] 2483 | name = "webpki" 2484 | version = "0.22.0" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 2487 | dependencies = [ 2488 | "ring", 2489 | "untrusted", 2490 | ] 2491 | 2492 | [[package]] 2493 | name = "webpki-roots" 2494 | version = "0.22.5" 2495 | source = "registry+https://github.com/rust-lang/crates.io-index" 2496 | checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" 2497 | dependencies = [ 2498 | "webpki", 2499 | ] 2500 | 2501 | [[package]] 2502 | name = "winapi" 2503 | version = "0.3.9" 2504 | source = "registry+https://github.com/rust-lang/crates.io-index" 2505 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2506 | dependencies = [ 2507 | "winapi-i686-pc-windows-gnu", 2508 | "winapi-x86_64-pc-windows-gnu", 2509 | ] 2510 | 2511 | [[package]] 2512 | name = "winapi-i686-pc-windows-gnu" 2513 | version = "0.4.0" 2514 | source = "registry+https://github.com/rust-lang/crates.io-index" 2515 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2516 | 2517 | [[package]] 2518 | name = "winapi-util" 2519 | version = "0.1.5" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2522 | dependencies = [ 2523 | "winapi", 2524 | ] 2525 | 2526 | [[package]] 2527 | name = "winapi-x86_64-pc-windows-gnu" 2528 | version = "0.4.0" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2531 | 2532 | [[package]] 2533 | name = "windows-sys" 2534 | version = "0.36.1" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 2537 | dependencies = [ 2538 | "windows_aarch64_msvc", 2539 | "windows_i686_gnu", 2540 | "windows_i686_msvc", 2541 | "windows_x86_64_gnu", 2542 | "windows_x86_64_msvc", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "windows_aarch64_msvc" 2547 | version = "0.36.1" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 2550 | 2551 | [[package]] 2552 | name = "windows_i686_gnu" 2553 | version = "0.36.1" 2554 | source = "registry+https://github.com/rust-lang/crates.io-index" 2555 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 2556 | 2557 | [[package]] 2558 | name = "windows_i686_msvc" 2559 | version = "0.36.1" 2560 | source = "registry+https://github.com/rust-lang/crates.io-index" 2561 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 2562 | 2563 | [[package]] 2564 | name = "windows_x86_64_gnu" 2565 | version = "0.36.1" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 2568 | 2569 | [[package]] 2570 | name = "windows_x86_64_msvc" 2571 | version = "0.36.1" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 2574 | 2575 | [[package]] 2576 | name = "wokwi-server" 2577 | version = "0.2.0" 2578 | dependencies = [ 2579 | "anyhow", 2580 | "base64", 2581 | "bytes", 2582 | "clap", 2583 | "console-subscriber", 2584 | "espflash", 2585 | "futures-util", 2586 | "opener", 2587 | "serde", 2588 | "serde_json", 2589 | "tokio", 2590 | "tokio-tungstenite", 2591 | "tungstenite", 2592 | "xmas-elf", 2593 | ] 2594 | 2595 | [[package]] 2596 | name = "xmas-elf" 2597 | version = "0.8.0" 2598 | source = "registry+https://github.com/rust-lang/crates.io-index" 2599 | checksum = "8d29b4d8e7beaceb4e77447ba941a7600d23d0319ab52da0461abea214832d5a" 2600 | dependencies = [ 2601 | "zero", 2602 | ] 2603 | 2604 | [[package]] 2605 | name = "zero" 2606 | version = "0.1.2" 2607 | source = "registry+https://github.com/rust-lang/crates.io-index" 2608 | checksum = "5f1bc8a6b2005884962297587045002d8cfb8dcec9db332f4ca216ddc5de82c5" 2609 | 2610 | [[package]] 2611 | name = "zeroize" 2612 | version = "1.5.7" 2613 | source = "registry+https://github.com/rust-lang/crates.io-index" 2614 | checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" 2615 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wokwi-server" 3 | description = "A tool for running embedded applications in Wokwi online simulator" 4 | version = "0.2.0" 5 | authors = ["Scott Mabin "] 6 | categories = ["embedded", "hardware-support", "no-std"] 7 | keywords = ["esp", "wokwi", "runner", "espflash"] 8 | license = "MIT OR Apache-2.0" 9 | readme = "README.md" 10 | repository = "https://github.com/mabezdev/wokwi-server" 11 | edition = "2021" 12 | 13 | [dependencies] 14 | tungstenite = "0.17.2" 15 | tokio-tungstenite = "0.17.1" 16 | anyhow = "1.0.57" 17 | serde_json = "1.0.81" 18 | serde = { version = "1.0", features = ["derive"] } 19 | base64 = "0.13.0" 20 | clap = { version = "3.1.18", features=["env"] } 21 | tokio = { version = "1", features = ["full"] } 22 | futures-util = "0.3.21" 23 | bytes = "1.1.0" 24 | espflash = "1.7" 25 | xmas-elf = "0.8.0" 26 | opener = "0.5.0" 27 | 28 | console-subscriber = { version = "0.1.6", optional = true } 29 | 30 | [features] 31 | tokio-console = ["dep:console-subscriber"] -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright 2019-2020 Contributors to wokwi-server 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without 7 | limitation the rights to use, copy, modify, merge, 8 | publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice 14 | shall be included in all copies or substantial portions 15 | of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Wokwi server 3 | 4 | A CLI tool for launching a wokwi instance for your project. 5 | 6 | [![asciicast](https://asciinema.org/a/496018.svg)](https://asciinema.org/a/496018) 7 | 8 | ## Installation 9 | 10 | Download the prebuilt executables for you platform from [the releases pages](https://github.com/MabezDev/wokwi-server/releases). Alternatively, if you have Rust installed you can install it via cargo. 11 | 12 | ```rust 13 | cargo install wokwi-server --git https://github.com/MabezDev/wokwi-server --locked 14 | ``` 15 | 16 | ## Usage 17 | 18 | Only two arguments are required, the target, specified with `--chip` and the path to your application elf file. Example running the esp-idf blink example on Wokwi: 19 | 20 | ```sh 21 | idf.py build # build the application 22 | wokwi-server --chip esp32 build/blink.elf # running example opened in the browser! 23 | ``` 24 | 25 | ### Simulating your binary on a custom Wokwi project 26 | 27 | You can use the ID of a Wokwi project to simulate your resulting binary on it: 28 | ```sh 29 | wokwi-server --chip --id build/blink.elf 30 | ``` 31 | 32 | The ID of a Wokwi project can be found in the URL. E.g., the ID of 33 | [ESP32 Rust Blinky](https://wokwi.com/projects/345932416223806035) is `345932416223806035`. 34 | 35 | ### As a cargo runner 36 | 37 | Inside `.cargo/config.toml`, add a `runner` section to your `target` key ([cargo reference](https://doc.rust-lang.org/cargo/reference/config.html)). Example for the esp32: 38 | 39 | ```toml 40 | runner = "wokwi-server --chip esp32" 41 | ``` 42 | 43 | Once configured, it's possible to launch and run your application in the Wokwi simulator by running `cargo run`. 44 | 45 | ## GDB support 46 | 47 | Wokwi exposes a GDB stub which this tool exposes via a TCP connection, see the following vscode configuration as a reference. 48 | 49 | ```jsonc 50 | { 51 | "type": "gdb", 52 | "request": "attach", 53 | "name": "VsCode: Wokwi Debug", 54 | // change this! 55 | "executable": "${workspaceFolder}/target/xtensa-esp32-espidf/debug/esp-fs-tests", 56 | "target": "127.0.0.1:9333", 57 | "remote": true, 58 | // change this! 59 | "gdbpath": "xtensa-esp32-elf/bin/xtensa-esp32-elf-gdb", 60 | "cwd": "${workspaceRoot}", 61 | "stopAtConnect": true, 62 | "valuesFormatting": "parseText" 63 | } 64 | ``` 65 | 66 | ## Troubleshooting 67 | 68 | If Wokwi doesn't progress past "Connecting to ws://localhost:9012..." in the browser: 69 | 70 | - It is likely that your browser is blocking mixed content (Safari and Orion both do this) 71 | - You may override your default browser using the `$BROWSER` environment variable. 72 | - If using `wokwi-server` as a cargo runner, set this in `.cargo/config.toml` 73 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | 2 | use serde::Serialize; 3 | use serde_json::Value; 4 | 5 | #[derive(Debug, Serialize)] 6 | pub struct SimulationPacket { 7 | pub r#type: String, 8 | pub elf: String, // string because we base64 encode the binary data 9 | #[serde(rename = "espBin")] 10 | pub esp_bin: Vec>, 11 | } 12 | 13 | #[derive(Debug)] 14 | pub enum GdbInstruction { 15 | Command(String), 16 | Break, 17 | } -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context; 2 | use anyhow::Result; 3 | use bytes::{Buf, BytesMut}; 4 | use espflash::elf::ElfFirmwareImage; 5 | use futures_util::{SinkExt, StreamExt}; 6 | use serde_json::{json, Value}; 7 | use std::path::PathBuf; 8 | use tokio::io::AsyncReadExt; 9 | use tokio::io::AsyncWriteExt; 10 | use tokio::net::{TcpListener, TcpStream}; 11 | use tokio::signal; 12 | use tokio::sync::mpsc::{Receiver, Sender}; 13 | use tokio::task::JoinSet; 14 | use tokio_tungstenite::accept_async; 15 | use wokwi_server::{GdbInstruction, SimulationPacket}; 16 | 17 | use espflash::{Chip, PartitionTable}; 18 | 19 | const PORT: u16 = 9012; 20 | const GDB_PORT: u16 = 9333; 21 | 22 | use clap::Parser; 23 | 24 | /// Wokwi server 25 | #[derive(Parser, Debug, Clone)] 26 | #[clap(author, version, about, long_about = None)] 27 | struct Args { 28 | #[clap(short, long, env = "WOKWI_HOST")] 29 | host: Option, 30 | 31 | /// chip name 32 | #[clap(short, long)] 33 | chip: Chip, 34 | 35 | /// path to bootloader 36 | #[clap(short, long)] 37 | bootloader: Option, 38 | 39 | /// path to partition table csv 40 | #[clap(short, long)] 41 | partition_table: Option, 42 | 43 | /// wokwi project id 44 | #[clap(short, long)] 45 | id: Option, 46 | 47 | elf: PathBuf, 48 | } 49 | 50 | #[tokio::main] 51 | async fn main() -> Result<(), anyhow::Error> { 52 | #[cfg(feature = "tokio-console")] 53 | console_subscriber::init(); 54 | 55 | let opts = Args::parse(); 56 | if !matches!( 57 | opts.chip, 58 | Chip::Esp32 | Chip::Esp32c3 | Chip::Esp32s2 | Chip::Esp32s3 59 | ) { 60 | anyhow::bail!("Chip not supported in Wokwi. See available chips and features at https://docs.wokwi.com/guides/esp32#simulation-features"); 61 | } 62 | 63 | if !opts.elf.exists() { 64 | anyhow::bail!("Path to elf does not exist"); 65 | } 66 | 67 | if let Some(bt) = &opts.bootloader { 68 | if !bt.exists() { 69 | anyhow::bail!("Path to bootloader does not exist"); 70 | } 71 | } 72 | 73 | if let Some(pt) = &opts.partition_table { 74 | if !pt.exists() { 75 | anyhow::bail!("Path to partition table does not exist"); 76 | } 77 | } 78 | 79 | let (wsend, wrecv) = tokio::sync::mpsc::channel(1); 80 | let (gsend, grecv) = tokio::sync::mpsc::channel(1); 81 | 82 | let mut set = JoinSet::new(); 83 | set.spawn(wokwi_task(opts, gsend, wrecv)); 84 | set.spawn(gdb_task(wsend, grecv)); 85 | 86 | loop { 87 | tokio::select! { 88 | _ = signal::ctrl_c() => { 89 | set.shutdown().await; 90 | break; 91 | }, 92 | task = set.join_next() => { 93 | match task { 94 | Some(Err(join_error)) => { 95 | println!("Task failed: {:?}", join_error); 96 | set.shutdown().await; 97 | break; 98 | } 99 | Some(Ok(Err(task_error))) => { 100 | println!("Task failed: {:?}", task_error); 101 | set.shutdown().await; 102 | break; 103 | } 104 | Some(Ok(_)) => {} /* Task gracefully shutdown */ 105 | None => break, /* All tasks completed */ 106 | } 107 | } 108 | } 109 | } 110 | Ok(()) 111 | } 112 | 113 | async fn wokwi_task( 114 | opts: Args, 115 | mut send: Sender, 116 | mut recv: Receiver, 117 | ) -> Result<()> { 118 | let server = TcpListener::bind(("127.0.0.1", PORT)) 119 | .await 120 | .with_context(|| format!("Failed to listen on 127.0.0.1:{}", PORT))?; 121 | 122 | let project_id = match opts.id.clone() { 123 | Some(id) => id, 124 | None => match opts.chip { 125 | Chip::Esp32 => "338154815612781140".to_string(), 126 | Chip::Esp32s2 => "338154940543271506".to_string(), 127 | Chip::Esp32c3 => "338322025101656660".to_string(), 128 | Chip::Esp32s3 => "345144250522927698".to_string(), 129 | _ => unreachable!(), 130 | }, 131 | }; 132 | 133 | let mut url = format!( 134 | "https://wokwi.com/_alpha/wembed/{}?partner=espressif&port={}&data=demo", 135 | project_id, PORT 136 | ); 137 | 138 | if let Some(h) = opts.host.as_ref() { 139 | url.push_str(&format!("&_host={}", h)) 140 | } 141 | 142 | println!( 143 | "Open the following link in the browser\r\n\r\n{}\r\n\r\n", 144 | url 145 | ); 146 | opener::open_browser(url).ok(); // we don't care if this fails 147 | 148 | loop { 149 | let (stream, _) = server.accept().await?; 150 | process(opts.clone(), stream, (&mut send, &mut recv)).await?; 151 | } 152 | } 153 | 154 | async fn process( 155 | opts: Args, 156 | stream: TcpStream, 157 | (send, recv): (&mut Sender, &mut Receiver), 158 | ) -> Result<()> { 159 | let websocket = accept_async(stream).await?; 160 | let (mut outgoing, mut incoming) = websocket.split(); 161 | let msg = incoming.next().await; // await for hello message 162 | println!("Client connected: {:?}", msg); 163 | 164 | let bytes = tokio::fs::read(&opts.elf).await?; 165 | let elf = xmas_elf::ElfFile::new(&bytes).expect("Invalid elf file"); 166 | let firmware = ElfFirmwareImage::new(elf); 167 | 168 | let p = if let Some(p) = &opts.partition_table { 169 | Some(PartitionTable::try_from_str(String::from_utf8_lossy( 170 | &tokio::fs::read(p).await?, 171 | ))?) 172 | } else { 173 | None 174 | }; 175 | 176 | let b = if let Some(b) = &opts.bootloader { 177 | Some(tokio::fs::read(b).await?) 178 | } else { 179 | None 180 | }; 181 | 182 | // TODO allow setting flash params, or take from bootloader? 183 | let image = opts 184 | .chip 185 | .get_flash_image(&firmware, b, p, None, None, None, None, None)?; 186 | let parts: Vec<_> = image.flash_segments().collect(); 187 | 188 | let bootloader = &parts[0]; 189 | let partition_table = &parts[1]; 190 | let app = &parts[2]; 191 | 192 | let simdata = SimulationPacket { 193 | r#type: "start".to_owned(), 194 | elf: base64::encode(&bytes), 195 | esp_bin: vec![ 196 | vec![ 197 | Value::Number(bootloader.addr.into()), 198 | Value::String(base64::encode(&bootloader.data)), 199 | ], 200 | vec![ 201 | Value::Number(partition_table.addr.into()), 202 | Value::String(base64::encode(&partition_table.data)), 203 | ], 204 | vec![ 205 | Value::Number(app.addr.into()), 206 | Value::String(base64::encode(&app.data)), 207 | ], 208 | ], 209 | }; 210 | 211 | // send the simulation data 212 | outgoing 213 | .send(tungstenite::Message::Text(serde_json::to_string(&simdata)?)) 214 | .await?; 215 | 216 | loop { 217 | tokio::select! { 218 | Some(msg) = incoming.next() => { 219 | let msg = msg?; 220 | if msg.is_text() { 221 | let v: Value = serde_json::from_str(msg.to_text()?)?; 222 | match &v["type"] { 223 | Value::String(s) if s == "uartData" => { 224 | if let Value::Array(bytes) = &v["bytes"] { 225 | let bytes: Vec = 226 | bytes.iter().map(|v| v.as_u64().unwrap() as u8).collect(); 227 | tokio::io::stdout().write_all(&bytes).await?; 228 | } 229 | } 230 | Value::String(s) if s == "gdbResponse" => { 231 | let s = v["response"].as_str().unwrap(); 232 | send.send(s.to_owned()).await?; 233 | } 234 | _ => unreachable!(), 235 | } 236 | } 237 | }, 238 | Some(command) = recv.recv() => { 239 | match command { 240 | GdbInstruction::Command(s) => { 241 | outgoing 242 | .send(tungstenite::Message::Text(serde_json::to_string( 243 | &json!({ 244 | "type": "gdb", 245 | "message": s 246 | }))? 247 | )).await?; 248 | }, 249 | GdbInstruction::Break => { 250 | outgoing 251 | .send(tungstenite::Message::Text(serde_json::to_string( 252 | &json!({ 253 | "type": "gdbBreak" 254 | }))? 255 | )).await?; 256 | }, 257 | } 258 | } 259 | } 260 | } 261 | } 262 | 263 | async fn gdb_task(mut send: Sender, mut recv: Receiver) -> Result<()> { 264 | let server = TcpListener::bind(("127.0.0.1", GDB_PORT)).await?; 265 | loop { 266 | let (stream, _) = server.accept().await?; 267 | println!("GDB client connected."); 268 | match handle_gdb_client(stream, &mut send, &mut recv).await { 269 | Ok(_) => println!("GDB Session ended cleanly."), 270 | Err(e) => println!("GDB Session ended with error: {:?}", e), 271 | } 272 | } 273 | } 274 | 275 | async fn handle_gdb_client( 276 | mut stream: TcpStream, 277 | send: &mut Sender, 278 | recv: &mut Receiver, 279 | ) -> Result<()> { 280 | stream.write_all(b"+").await?; 281 | 282 | let mut buffer = BytesMut::with_capacity(1024); 283 | loop { 284 | tokio::select! { 285 | r = stream.read_buf(&mut buffer) => { 286 | let n = r?; 287 | 288 | if n == 0 { 289 | anyhow::bail!("GDB End of stream"); 290 | } 291 | 292 | loop { 293 | let raw_command = String::from_utf8_lossy(buffer.as_ref()); 294 | let start = raw_command.find('$').map(|i| i + 1); // we want everything after the $ 295 | let end = raw_command.find('#'); 296 | 297 | match (start, end) { 298 | (Some(start), Some(end)) => { 299 | let command = &raw_command[start..end]; 300 | let end = end + 1; // move past # 301 | let checksum = &raw_command[end..]; 302 | // println!("Command: {}, checksum: {}", command, checksum); 303 | let len = if gdb_checksum(command, checksum).is_err() { 304 | stream.write_all(b"-").await?; 305 | end 306 | } else { 307 | stream.write_all(b"+").await?; 308 | send.send(GdbInstruction::Command(command.to_owned())) 309 | .await?; 310 | end + 2 311 | }; 312 | buffer.advance(len); 313 | } 314 | (None, Some(end)) => buffer.advance(end), /* partial command, discard */ 315 | (Some(_), None) => break, /* incomplete, need more data */ 316 | (None, None) => { 317 | if let Some(_index) = buffer.iter().position(|&x| x == 0x03) { 318 | // println!("GDB BREAK detected in packet at index {}", index); 319 | send.send(GdbInstruction::Break).await?; 320 | } 321 | buffer.advance(buffer.remaining()); /* garbage */ 322 | break; 323 | } 324 | } 325 | } 326 | } 327 | resp = recv.recv() => { 328 | let resp = resp.ok_or_else(|| anyhow::anyhow!("Channel closed unexpectedly"))?; 329 | stream.write_all(resp.as_bytes()).await?; 330 | } 331 | } 332 | } 333 | } 334 | 335 | fn gdb_checksum(cmd: &str, checksum: &str) -> Result<()> { 336 | let cs = cmd.as_bytes().iter().map(|&n| n as u16).sum::() & 0xff; 337 | let cs = format!("{:02x}", cs); 338 | if cs != checksum { 339 | println!("Invalid checksum, expected {}, calculated {}", checksum, cs); 340 | anyhow::bail!("Invalid checksum, expected {}, calculated {}", checksum, cs); 341 | } 342 | Ok(()) 343 | } 344 | --------------------------------------------------------------------------------