fix merge conflicts with master
@@ -27,22 +27,30 @@ on:
- lib.rs
- Cargo.toml
+# workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
+env:
+ CARGO_TERM_COLOR: always
+ CARGO_INCREMENTAL: "0"
+
jobs:
check:
if: github.event.pull_request.draft == false
name: Check
runs-on: ubuntu-latest
steps:
+ - uses: actions/checkout@v4
+ - run: sudo apt-get update
+ - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev libxdo-dev
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
+ with:
+ cache-all-crates: "true"
+ save-if: ${{ github.ref == 'refs/heads/master' }}
- uses: ilammy/setup-nasm@v1
- - run: sudo apt-get update
- - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev
- - uses: actions/checkout@v4
- run: cargo check --all --examples --tests
test:
@@ -50,15 +58,24 @@ jobs:
name: Test Suite
- uses: davidB/rust-cargo-make@v1
- uses: browser-actions/setup-firefox@latest
- uses: jetli/wasm-pack-action@v0.4.0
+ - run: sudo rm -rf /usr/share/dotnet
+ - run: sudo rm -rf "$AGENT_TOOLSDIRECTORY"
+ - run: |
+ df -h
+ sudo rm -rf ${GITHUB_WORKSPACE}/.git
- run: cargo make tests
fmt:
@@ -66,11 +83,15 @@ jobs:
name: Rustfmt
+ - uses: ilammy/setup-nasm@v1
+ components: rustfmt
- - uses: ilammy/setup-nasm@v1
- - run: rustup component add rustfmt
- run: cargo fmt --all -- --check
clippy:
@@ -78,17 +99,104 @@ jobs:
name: Clippy
+ - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev
+ components: rustfmt, clippy
+ - run: cargo clippy --workspace --examples --tests -- -D warnings
+ miri:
+ if: github.event.pull_request.draft == false
+ name: Miri
+ runs-on: ubuntu-latest
+ env:
+ CARGO_UNSTABLE_SPARSE_REGISTRY: 'true'
+ RUSTFLAGS: -Dwarnings
+ RUST_BACKTRACE: 1
+ MIRIFLAGS: -Zmiri-tag-gc=1
+ # Change to specific Rust release to pin
+ rust_stable: stable
+ rust_nightly: nightly-2023-11-16
+ rust_clippy: 1.70.0
+ steps:
- - run: rustup component add clippy
+ - name: Install Rust ${{ env.rust_nightly }}
+ uses: dtolnay/rust-toolchain@master
+ toolchain: ${{ env.rust_nightly }}
+ components: miri
+ - uses: Swatinem/rust-cache@v2
+ - name: miri
+ # Many of tests in tokio/tests and doctests use #[tokio::test] or
+ # #[tokio::main] that calls epoll_create1 that Miri does not support.
+ # run: cargo miri test --features full --lib --no-fail-fast
+ run: |
+ cargo miri test --package dioxus-core -- --exact --nocapture
+ cargo miri test --package dioxus-native-core --test miri_native -- --exact --nocapture
+ MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-strict-provenance -Zmiri-retag-fields
+ PROPTEST_CASES: 10
+ playwright:
+ name: Playwright Tests
+ # Do our best to cache the toolchain and node install steps
- uses: actions/checkout@v4
- - run: cargo clippy --workspace --examples --tests -- -D warnings
+ - uses: actions/setup-node@v4
+ node-version: 16
+ - name: Install Rust
+ toolchain: stable
+ targets: x86_64-unknown-linux-gnu,wasm32-unknown-unknown
+ - name: Install dependencies
+ run: npm ci
+ working-directory: ./playwright-tests
+ - name: Install Playwright
+ run: npm install -D @playwright/test
+ - name: Install Playwright Browsers
+ run: npx playwright install --with-deps
+ - name: Run Playwright tests
+ run: npx playwright test
+ - uses: actions/upload-artifact@v4
+ if: always()
+ name: playwright-report
+ path: playwright-report/
+ retention-days: 30
matrix_test:
runs-on: ${{ matrix.platform.os }}
env:
RUST_CARGO_COMMAND: ${{ matrix.platform.cross == true && 'cross' || 'cargo' }}
strategy:
@@ -135,20 +243,18 @@ jobs:
with:
toolchain: ${{ matrix.platform.toolchain }}
targets: ${{ matrix.platform.target }}
- name: Install cross
if: ${{ matrix.platform.cross == true }}
uses: taiki-e/install-action@cross
- workspaces: core -> ../target
- save-if: ${{ matrix.features.key == 'all' }}
-
- - name: Install rustfmt
- run: rustup component add rustfmt
+ key: "${{ matrix.platform.target }}"
- name: test
run: |
@@ -1,133 +0,0 @@
-name: Miri Tests
-on:
- push:
- # Run in PRs and for bors, but not on master.
- branches:
- - 'auto'
- - 'try'
- paths:
- - packages/**
- - examples/**
- - src/**
- - .github/**
- - lib.rs
- - Cargo.toml
- pull_request:
- types: [opened, synchronize, reopened, ready_for_review]
- - 'master'
- schedule:
- - cron: '6 6 * * *' # At 6:06 UTC every day.
-env:
- CARGO_UNSTABLE_SPARSE_REGISTRY: 'true'
- RUSTFLAGS: -Dwarnings
- RUST_BACKTRACE: 1
- # Change to specific Rust release to pin
- rust_stable: stable
- rust_nightly: nightly-2023-11-16
- rust_clippy: 1.70.0
- # When updating this, also update:
- # - README.md
- # - tokio/README.md
- # - CONTRIBUTING.md
- # - tokio/Cargo.toml
- # - tokio-util/Cargo.toml
- # - tokio-test/Cargo.toml
- # - tokio-stream/Cargo.toml
- # rust_min: 1.49.0
-concurrency:
- group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
- cancel-in-progress: true
-jobs:
- test:
- runs-on: ${{ matrix.os }}
- env:
- HOST_TARGET: ${{ matrix.host_target }}
- strategy:
- fail-fast: false
- matrix:
- include:
- - os: ubuntu-latest
- host_target: x86_64-unknown-linux-gnu
- # - os: macos-latest
- # host_target: x86_64-apple-darwin
- # - os: windows-latest
- # host_target: i686-pc-windows-msvc
- steps:
- - name: Set the tag GC interval to 1 on linux
- if: runner.os == 'Linux'
- run: echo "MIRIFLAGS=-Zmiri-tag-gc=1" >> $GITHUB_ENV
- - name: Install Rust ${{ env.rust_nightly }}
- uses: dtolnay/rust-toolchain@master
- with:
- toolchain: ${{ env.rust_nightly }}
- components: miri
- - uses: Swatinem/rust-cache@v2
- - name: miri
- # Many of tests in tokio/tests and doctests use #[tokio::test] or
- # #[tokio::main] that calls epoll_create1 that Miri does not support.
- # run: cargo miri test --features full --lib --no-fail-fast
- run: |
- cargo miri test --package dioxus-core -- --exact --nocapture
- cargo miri test --package dioxus-native-core --test miri_native -- --exact --nocapture
- # working-directory: tokio
- MIRIFLAGS: -Zmiri-disable-isolation -Zmiri-strict-provenance -Zmiri-retag-fields
- PROPTEST_CASES: 10
- # Cache the global cargo directory, but NOT the local `target` directory which
- # we cannot reuse anyway when the nightly changes (and it grows quite large
- # over time).
- # - name: Add cache for cargo
- # id: cache
- # uses: actions/cache@v3
- # with:
- # path: |
- # # Taken from <https://doc.rust-lang.org/nightly/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci>.
- # ~/.cargo/bin
- # ~/.cargo/registry/index
- # ~/.cargo/registry/cache
- # ~/.cargo/git/db
- # # contains package information of crates installed via `cargo install`.
- # ~/.cargo/.crates.toml
- # ~/.cargo/.crates2.json
- # key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- # restore-keys: ${{ runner.os }}-cargo
- # - name: Install rustup-toolchain-install-master
- # if: ${{ steps.cache.outputs.cache-hit != 'true' }}
- # shell: bash
- # run: |
- # cargo install -f rustup-toolchain-install-master
- # - name: Install "master" toolchain
- # if [[ ${{ github.event_name }} == 'schedule' ]]; then
- # echo "Building against latest rustc git version"
- # git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1 > rust-version
- # fi
- # toolchain --host ${{ matrix.host_target }}
- # - name: Show Rust version
- # rustup show
- # rustc -Vv
- # cargo -V
- # - name: Test
- # MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-core --test miri_stress -- --exact --nocapture
- # MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-ignore-leaks" cargo +nightly miri test --package dioxus-native-core --test miri_native -- --exact --nocapture
@@ -1,52 +0,0 @@
-name: Playwright Tests
- branches: [main, master]
-defaults:
- run:
- working-directory: ./playwright-tests
- if: github.event.pull_request.draft == false
- timeout-minutes: 60
- runs-on: ubuntu-latest
- # Do our best to cache the toolchain and node install steps
- - uses: actions/setup-node@v4
- node-version: 16
- - name: Install Rust
- toolchain: stable
- targets: x86_64-unknown-linux-gnu,wasm32-unknown-unknown
- - name: Install dependencies
- run: npm ci
- - name: Install Playwright
- run: npm install -D @playwright/test
- - name: Install Playwright Browsers
- run: npx playwright install --with-deps
- # Cache the CLI by using cargo run internally
- # - name: Install Dioxus CLI
- # uses: actions-rs/cargo@v1
- # command: install
- # args: --path packages/cli
- - name: Run Playwright tests
- run: npx playwright test
- - uses: actions/upload-artifact@v4
- if: always()
- name: playwright-report
- path: playwright-report/
- retention-days: 30
@@ -0,0 +1,37 @@
+name: Clear cache
+on:
+ workflow_dispatch:
+permissions:
+ actions: write
+jobs:
+ clear-cache:
+ - name: Clear cache
+ uses: actions/github-script@v6
+ github-token: ${{ secrets.cache_controller }}
+ script: |
+ console.log("About to clear")
+ while (true) {
+ const caches = await github.rest.actions.getActionsCacheList({
+ owner: context.repo.owner,
+ repo: context.repo.repo
+ })
+ if (caches.data.actions_caches.length === 0) {
+ break
+ }
+ for (const cache of caches.data.actions_caches) {
+ console.log(cache)
+ github.rest.actions.deleteActionsCacheById({
+ repo: context.repo.repo,
+ cache_id: cache.id,
+ console.log("Clear completed")
@@ -2,10 +2,12 @@
/playwright-tests/web/dist
/playwright-tests/fullstack/dist
/dist
-Cargo.lock
.DS_Store
/examples/assets/test_video.mp4
+# new recommendation to keep the lockfile in for CI and reproducible builds
+# Cargo.lock
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
@@ -0,0 +1,12337 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli 0.28.1",
+]
+name = "adler"
+version = "1.0.2"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+name = "adler32"
+version = "1.2.0"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+name = "aead"
+version = "0.5.2"
+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
+ "crypto-common",
+ "generic-array 0.14.7",
+name = "aes"
+version = "0.8.3"
+checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2"
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+name = "aes-gcm"
+version = "0.10.3"
+checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1"
+ "aead",
+ "aes",
+ "ctr",
+ "ghash",
+ "subtle",
+name = "ahash"
+version = "0.7.7"
+checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd"
+ "getrandom 0.2.12",
+ "once_cell",
+ "version_check",
+version = "0.8.7"
+checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
+ "const-random",
+ "zerocopy",
+name = "aho-corasick"
+version = "0.7.20"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+ "memchr",
+version = "1.1.2"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+name = "aligned"
+version = "0.4.1"
+checksum = "80a21b9440a626c7fc8573a9e3d3a06b75c7c97754c2949bc7857b90353ca655"
+ "as-slice",
+name = "alloc-no-stdlib"
+version = "2.0.4"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+name = "alloc-stdlib"
+version = "0.2.2"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+ "alloc-no-stdlib",
+name = "allocator-api2"
+version = "0.2.16"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+name = "android-tzdata"
+version = "0.1.1"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+name = "android_system_properties"
+version = "0.1.5"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+ "libc",
+name = "anes"
+version = "0.1.6"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+name = "anstream"
+version = "0.6.5"
+checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6"
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+name = "anstyle"
+version = "1.0.4"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+name = "anstyle-parse"
+version = "0.2.3"
+checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+name = "anstyle-query"
+checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+ "windows-sys 0.52.0",
+name = "anstyle-wincon"
+version = "3.0.2"
+checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+name = "anyhow"
+version = "1.0.79"
+checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
+name = "anymap"
+version = "0.12.1"
+checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344"
+version = "1.0.0-beta.2"
+checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72"
+name = "anymap2"
+version = "0.13.0"
+checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c"
+name = "ar"
+version = "0.9.0"
+checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69"
+name = "arbitrary"
+version = "0.4.7"
+checksum = "db55d72333851e17d572bec876e390cd3b11eb1ef53ae821dd9f3b653d2b4569"
+version = "1.3.2"
+checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
+name = "arc-swap"
+version = "1.6.0"
+checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
+name = "arg_enum_proc_macro"
+version = "0.3.4"
+checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
+ "proc-macro2",
+ "quote",
+ "syn 2.0.48",
+name = "argh"
+version = "0.1.12"
+checksum = "7af5ba06967ff7214ce4c7419c7d185be7ecd6cc4965a8f6e1d8ce0398aad219"
+ "argh_derive",
+ "argh_shared",
+name = "argh_derive"
+checksum = "56df0aeedf6b7a2fc67d06db35b09684c3e8da0c95f8f27685cb17e08413d87a"
+name = "argh_shared"
+checksum = "5693f39141bda5760ecc4111ab08da40565d1771038c4a0250f03457ec707531"
+ "serde",
+name = "arrayvec"
+version = "0.7.4"
+checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+name = "as-slice"
+version = "0.2.1"
+checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516"
+ "stable_deref_trait",
+name = "askama_escape"
+checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341"
+name = "async-broadcast"
+version = "0.5.1"
+checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b"
+ "event-listener 2.5.3",
+ "futures-core",
+name = "async-channel"
+version = "1.9.0"
+checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35"
+ "concurrent-queue",
+version = "2.1.1"
+checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
+ "event-listener 4.0.3",
+ "event-listener-strategy",
+ "pin-project-lite",
+name = "async-compression"
+version = "0.3.15"
+checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a"
+ "brotli",
+ "flate2",
+ "tokio",
+version = "0.4.5"
+checksum = "bc2d0cfb2a7388d34f590e76686704c494ed7aaceed62ee1ba35cbf363abc2a5"
+name = "async-executor"
+version = "1.8.0"
+checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
+ "async-lock 3.3.0",
+ "async-task",
+ "fastrand 2.0.1",
+ "futures-lite 2.2.0",
+ "slab",
+name = "async-fs"
+checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
+ "async-lock 2.8.0",
+ "autocfg",
+ "blocking",
+ "futures-lite 1.13.0",
+name = "async-io"
+version = "1.13.0"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+ "log",
+ "parking",
+ "polling 2.8.0",
+ "rustix 0.37.27",
+ "socket2 0.4.10",
+ "waker-fn",
+version = "2.2.2"
+checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7"
+ "futures-io",
+ "polling 3.3.1",
+ "rustix 0.38.28",
+ "tracing",
+name = "async-lock"
+version = "2.8.0"
+checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b"
+version = "3.3.0"
+checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+name = "async-process"
+version = "1.8.1"
+checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88"
+ "async-io 1.13.0",
+ "async-signal",
+ "event-listener 3.1.0",
+ "windows-sys 0.48.0",
+name = "async-recursion"
+version = "1.0.5"
+checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
+name = "async-signal"
+version = "0.2.5"
+checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
+ "async-io 2.2.2",
+ "atomic-waker",
+ "signal-hook-registry",
+name = "async-stream"
+version = "0.3.5"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+ "async-stream-impl",
+name = "async-stream-impl"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+name = "async-task"
+version = "4.7.0"
+checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799"
+name = "async-trait"
+version = "0.1.77"
+checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
+name = "atk"
+version = "0.18.0"
+checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4"
+ "atk-sys",
+ "glib",
+name = "atk-sys"
+checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009"
+ "glib-sys",
+ "gobject-sys",
+ "system-deps",
+name = "atoi"
+version = "2.0.0"
+checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
+ "num-traits",
+name = "atomic"
+version = "0.5.3"
+checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba"
+version = "0.6.0"
+checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994"
+ "bytemuck",
+name = "atomic-waker"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+name = "atomic-write-file"
+version = "0.1.2"
+checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436"
+ "nix 0.27.1",
+ "rand 0.8.5",
+name = "atty"
+version = "0.2.14"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+ "hermit-abi 0.1.19",
+ "winapi",
+name = "auth-git2"
+checksum = "41e7771d4ab6635cbd685ce8db215b29c78a468098126de77c57f3b2e6eb3757"
+ "dirs 5.0.1",
+ "git2",
+ "terminal-prompt",
+name = "autocfg"
+version = "1.1.0"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+name = "av1-grain"
+checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf"
+ "anyhow",
+ "arrayvec",
+ "nom",
+ "num-rational",
+ "v_frame",
+name = "avif-serialize"
+version = "0.8.1"
+checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2"
+name = "axum"
+version = "0.5.17"
+checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43"
+ "async-trait",
+ "axum-core 0.2.9",
+ "base64 0.13.1",
+ "bitflags 1.3.2",
+ "bytes",
+ "futures-util",
+ "headers 0.3.9",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
+ "itoa 1.0.10",
+ "matchit 0.5.0",
+ "mime",
+ "percent-encoding",
+ "serde_json",
+ "serde_urlencoded",
+ "sha-1",
+ "sync_wrapper",
+ "tokio-tungstenite 0.17.2",
+ "tower",
+ "tower-http 0.3.5",
+ "tower-layer",
+ "tower-service",
+version = "0.6.20"
+checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+ "axum-core 0.3.4",
+ "axum-macros",
+ "base64 0.21.7",
+ "matchit 0.7.3",
+ "rustversion",
+ "serde_path_to_error",
+ "sha1",
+ "tokio-tungstenite 0.20.1",
+name = "axum-auth"
+version = "0.1.0"
+ "axum 0.6.20",
+ "axum_session",
+ "axum_session_auth",
+ "dioxus",
+ "dioxus-fullstack",
+ "dioxus-web",
+ "execute",
+ "simple_logger",
+ "sqlx",
+ "tower-http 0.4.4",
+name = "axum-core"
+version = "0.2.9"
+checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+name = "axum-desktop"
+ "dioxus-desktop",
+ "dioxus-router",
+name = "axum-hello-world"
+ "reqwest",
+ "tracing-subscriber",
+ "tracing-wasm",
+name = "axum-macros"
+version = "0.3.8"
+checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62"
+ "heck 0.4.1",
+name = "axum-router"
+name = "axum-server"
+checksum = "447f28c85900215cc1bea282f32d4a2f22d55c5a300afdfbc661c8d6a632e063"
+ "arc-swap",
+ "rustls 0.21.10",
+ "rustls-pemfile",
+ "tokio-rustls 0.24.1",
+name = "axum_session"
+checksum = "2b9a35d2907b706dcd52f875c4f9fe55293ebc03fc5b3c2d8883104c821452b8"
+ "aes-gcm",
+ "chrono",
+ "cookie 0.17.0",
+ "dashmap",
+ "futures",
+ "thiserror",
+ "uuid",
+name = "axum_session_auth"
+version = "0.3.1"
+checksum = "88d26b395b86d34230970c09fee81cad335704d5b6b797714a9ebb8a51cc4fa6"
+ "async-recursion",
+name = "backtrace"
+version = "0.3.69"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+ "addr2line",
+ "cc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+name = "base16ct"
+version = "0.2.0"
+checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf"
+name = "base64"
+version = "0.9.3"
+checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
+ "byteorder",
+ "safemem",
+version = "0.13.1"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+version = "0.21.7"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+name = "base64-simd"
+version = "0.7.0"
+checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5"
+ "simd-abstraction",
+name = "base64ct"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+name = "basic-toml"
+version = "0.1.8"
+checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5"
+name = "bigdecimal"
+checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa"
+ "num-bigint",
+ "num-integer",
+name = "binascii"
+version = "0.1.4"
+checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
+name = "bincode"
+version = "1.3.3"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+name = "bit-vec"
+version = "0.6.3"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+name = "bit_field"
+version = "0.10.2"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+name = "bitflags"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+version = "2.4.1"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+name = "bitmaps"
+version = "2.1.0"
+checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"
+ "typenum",
+name = "bitstream-io"
+version = "1.10.0"
+checksum = "e445576659fd04a57b44cbd00aa37aaa815ebefa0aa3cb677a6b5e63d883074f"
+version = "2.2.0"
+checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da"
+name = "bitvec"
+version = "1.0.1"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+name = "block"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+name = "block-buffer"
+version = "0.10.4"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+name = "blocking"
+version = "1.5.1"
+checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
+ "async-channel 2.1.1",
+ "piper",
+name = "borsh"
+version = "1.3.0"
+checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028"
+ "borsh-derive",
+ "cfg_aliases",
+name = "borsh-derive"
+checksum = "bf4918709cc4dd777ad2b6303ed03cb37f3ca0ccede8c1b0d28ac6db8f4710e0"
+ "proc-macro-crate 2.0.1",
+ "syn_derive",
+name = "brotli"
+version = "3.4.0"
+checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f"
+ "alloc-stdlib",
+ "brotli-decompressor",
+name = "brotli-decompressor"
+version = "2.5.1"
+checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f"
+name = "bstr"
+version = "0.2.17"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
+ "regex-automata 0.4.3",
+name = "btoi"
+version = "0.4.3"
+checksum = "9dd6407f73a9b8b6162d8a2ef999fe6afd7cc15902ebf42c5cd296addf17e0ad"
+name = "built"
+checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe"
+ "cargo-lock 8.0.3",
+version = "0.7.1"
+checksum = "38d17f4d6e4dc36d1a02fbedc2753a096848e7c1b0772f7654eab8e2c927dd53"
+name = "bumpalo"
+version = "3.14.0"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+name = "bytecheck"
+version = "0.6.11"
+checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627"
+ "bytecheck_derive",
+ "ptr_meta",
+ "simdutf8",
+name = "bytecheck_derive"
+checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61"
+ "syn 1.0.109",
+name = "bytemuck"
+version = "1.14.0"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+name = "byteorder"
+version = "1.5.0"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+name = "bytes"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+name = "bzip2"
+version = "0.4.4"
+checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
+ "bzip2-sys",
+name = "bzip2-sys"
+version = "0.1.11+1.0.8"
+checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+ "pkg-config",
+name = "cairo-rs"
+version = "0.18.5"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
+ "bitflags 2.4.1",
+ "cairo-sys-rs",
+name = "cairo-sys-rs"
+version = "0.18.2"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
+name = "camino"
+version = "1.1.6"
+checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+name = "cargo-generate"
+checksum = "8a2885ae054e000b117515ab33e91c10eca90c2788a7baec1b97ada1f1f51e57"
+ "auth-git2",
+ "clap 4.4.15",
+ "console",
+ "dialoguer",
+ "env_logger",
+ "fs-err",
+ "gix-config",
+ "home",
+ "ignore",
+ "indexmap 2.1.0",
+ "indicatif",
+ "liquid",
+ "liquid-core",
+ "liquid-derive",
+ "liquid-lib",
+ "names",
+ "paste",
+ "path-absolutize",
+ "regex",
+ "remove_dir_all",
+ "rhai",
+ "sanitize-filename",
+ "semver",
+ "tempfile",
+ "toml 0.8.2",
+ "walkdir",
+name = "cargo-lock"
+version = "8.0.3"
+checksum = "031718ddb8f78aa5def78a09e90defe30151d1f6c672f937af4dd916429ed996"
+ "toml 0.5.11",
+ "url",
+version = "9.0.0"
+checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72"
+ "petgraph",
+ "toml 0.7.8",
+name = "cargo-platform"
+checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
+name = "cargo_metadata"
+version = "0.15.4"
+checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a"
+ "camino",
+ "cargo-platform",
+version = "0.17.0"
+checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592"
+name = "cargo_toml"
+version = "0.16.3"
+checksum = "e3f9629bc6c4388ea699781dc988c2b99766d7679b151c81990b4fa1208fafd3"
+name = "cassowary"
+version = "0.3.0"
+checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
+name = "cast"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+name = "cc"
+version = "1.0.83"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+ "jobserver",
+name = "cesu8"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+name = "cfb"
+version = "0.7.3"
+checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
+ "fnv",
+name = "cfg-expr"
+version = "0.12.0"
+checksum = "0bbc13bf6290a6b202cc3efb36f7ec2b739a80634215630c8053a313edf6abef"
+ "smallvec",
+version = "0.15.6"
+checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a"
+ "target-lexicon",
+name = "cfg-if"
+version = "1.0.0"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+name = "cfg_aliases"
+checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+name = "chrono"
+version = "0.4.31"
+checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-targets 0.48.5",
+name = "ciborium"
+checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926"
+ "ciborium-io",
+ "ciborium-ll",
+name = "ciborium-io"
+checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656"
+name = "ciborium-ll"
+checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b"
+ "half 1.8.2",
+name = "cipher"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+ "inout",
+name = "clap"
+version = "2.34.0"
+checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
+ "textwrap",
+ "unicode-width",
+version = "4.4.15"
+checksum = "c12ed66a79a555082f595f7eb980d08669de95009dd4b3d61168c573ebe38fc9"
+ "clap_builder",
+ "clap_derive",
+name = "clap_builder"
+checksum = "0f4645eab3431e5a8403a96bea02506a8b35d28cd0f0330977dd5d22f9c84f43"
+ "anstream",
+ "clap_lex",
+ "strsim",
+name = "clap_derive"
+version = "4.4.7"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+name = "clap_lex"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+name = "closure"
+checksum = "d6173fd61b610d15a7566dd7b7620775627441c4ab9dac8906e17cb93a24b782"
+name = "cocoa"
+version = "0.25.0"
+checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c"
+ "block",
+ "cocoa-foundation",
+ "core-foundation",
+ "core-graphics",
+ "foreign-types 0.5.0",
+ "objc",
+name = "cocoa-foundation"
+checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7"
+ "core-graphics-types",
+name = "color_quant"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+name = "colorchoice"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+name = "colored"
+version = "1.9.4"
+checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355"
+ "is-terminal",
+ "lazy_static",
+checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8"
+name = "combine"
+version = "4.6.6"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+name = "concurrent-queue"
+version = "2.4.0"
+checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
+ "crossbeam-utils",
+name = "console"
+version = "0.15.8"
+checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
+ "encode_unicode",
+name = "console_error_panic_hook"
+version = "0.1.7"
+checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
+name = "const-oid"
+version = "0.9.6"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+name = "const-random"
+version = "0.1.17"
+checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a"
+ "const-random-macro",
+name = "const-random-macro"
+version = "0.1.16"
+checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
+ "tiny-keccak",
+name = "const-str"
+version = "0.3.2"
+checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3"
+ "const-str-proc-macro",
+name = "const-str-proc-macro"
+checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a"
+name = "const_format"
+version = "0.2.32"
+checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673"
+ "const_format_proc_macros",
+name = "const_format_proc_macros"
+checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500"
+ "unicode-xid",
+name = "constant_time_eq"
+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+name = "constcat"
+checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08"
+name = "convert_case"
+version = "0.4.0"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+version = "0.5.0"
+checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8"
+checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
+ "unicode-segmentation",
+name = "cookie"
+checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
+ "time",
+checksum = "3cd91cf61412820176e137621345ee43b3f4423e589e7ae4e50d601d93e35ef8"
+ "hmac",
+ "sha2",
+name = "core-foundation"
+version = "0.9.4"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+ "core-foundation-sys",
+name = "core-foundation-sys"
+version = "0.8.6"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+name = "core-graphics"
+version = "0.23.1"
+checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212"
+name = "core-graphics-types"
+version = "0.1.3"
+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
+name = "cpufeatures"
+version = "0.2.12"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+name = "crc"
+version = "3.0.1"
+checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
+ "crc-catalog",
+name = "crc-catalog"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+name = "crc32fast"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+name = "criterion"
+version = "0.3.6"
+checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
+ "atty",
+ "cast",
+ "clap 2.34.0",
+ "criterion-plot 0.4.5",
+ "csv",
+ "itertools 0.10.5",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "serde_cbor",
+ "serde_derive",
+ "tinytemplate",
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+ "anes",
+ "ciborium",
+ "criterion-plot 0.5.0",
+name = "criterion-plot"
+checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+name = "crossbeam-channel"
+version = "0.5.11"
+checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
+name = "crossbeam-deque"
+version = "0.8.5"
+checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+ "crossbeam-epoch",
+name = "crossbeam-epoch"
+version = "0.9.18"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+name = "crossbeam-queue"
+version = "0.3.11"
+checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
+name = "crossbeam-utils"
+version = "0.8.19"
+checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+name = "crossterm"
+version = "0.26.1"
+checksum = "a84cda67535339806297f1b331d6dd6320470d2a0fe65381e79ee9e156dd3d13"
+ "crossterm_winapi",
+ "mio",
+ "parking_lot",
+ "signal-hook",
+ "signal-hook-mio",
+version = "0.27.0"
+checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
+name = "crossterm_winapi"
+version = "0.9.1"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+name = "cruet"
+version = "0.14.0"
+checksum = "6132609543972496bc97b1e01f1ce6586768870aeb4cabeb3385f4e05b5caead"
+name = "crunchy"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+name = "crypto-bigint"
+version = "0.5.5"
+checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
+ "rand_core 0.6.4",
+ "zeroize",
+name = "crypto-common"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+name = "cssparser"
+version = "0.27.2"
+checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa 0.4.8",
+ "matches",
+ "phf 0.8.0",
+version = "0.29.6"
+checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
+ "phf 0.10.1",
+version = "0.33.0"
+checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e"
+ "phf 0.11.2",
+name = "cssparser-color"
+checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f"
+ "cssparser 0.33.0",
+name = "cssparser-macros"
+version = "0.6.1"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
+name = "csv"
+checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
+ "csv-core",
+ "ryu",
+name = "csv-core"
+version = "0.1.11"
+checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
+name = "ctor"
+version = "0.2.6"
+checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e"
+name = "ctr"
+version = "0.9.2"
+checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835"
+name = "ctrlc"
+version = "3.4.2"
+checksum = "b467862cc8610ca6fc9a1532d7777cee0804e678ab45410897b9396495994a0b"
+name = "curve25519-dalek"
+version = "4.1.1"
+checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c"
+ "curve25519-dalek-derive",
+ "digest",
+ "fiat-crypto",
+ "platforms",
+ "rustc_version",
+name = "curve25519-dalek-derive"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+name = "cvt"
+checksum = "d2ae9bf77fbf2d39ef573205d554d87e86c12f1994e9ea335b0651b9b278bcf1"
+name = "darling"
+version = "0.20.3"
+checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
+ "darling_core",
+ "darling_macro",
+name = "darling_core"
+checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621"
+ "ident_case",
+name = "darling_macro"
+checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
+name = "dashmap"
+version = "5.5.3"
+checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
+ "hashbrown 0.14.3",
+ "lock_api",
+ "parking_lot_core",
+name = "data-encoding"
+version = "2.5.0"
+checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+name = "data-url"
+checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193"
+name = "der"
+version = "0.7.8"
+checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+ "const-oid",
+ "pem-rfc7468",
+name = "deranged"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+ "powerfmt",
+name = "derivative"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
+name = "derive_more"
+version = "0.99.17"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+ "convert_case 0.4.0",
+name = "devise"
+checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8"
+ "devise_codegen",
+ "devise_core",
+name = "devise_codegen"
+checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6"
+name = "devise_core"
+checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a"
+ "proc-macro2-diagnostics",
+name = "dialoguer"
+version = "0.11.0"
+checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de"
+ "shell-words",
+name = "diff"
+version = "0.1.13"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
+name = "digest"
+version = "0.10.7"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+ "block-buffer",
+name = "dioxus"
+ "criterion 0.3.6",
+ "dioxus-core",
+ "dioxus-core-macro",
+ "dioxus-hooks",
+ "dioxus-hot-reload",
+ "dioxus-html",
+ "dioxus-rsx",
+ "dioxus-signals",
+name = "dioxus-autofmt"
+ "prettier-please",
+ "pretty_assertions",
+name = "dioxus-check"
+ "indoc",
+ "owo-colors",
+name = "dioxus-cli"
+ "axum 0.5.17",
+ "axum-server",
+ "cargo-generate",
+ "cargo_metadata 0.15.4",
+ "cargo_toml",
+ "colored 2.1.0",
+ "ctrlc",
+ "dioxus-autofmt",
+ "dioxus-check",
+ "dioxus-cli-config",
+ "dirs 4.0.0",
+ "fern",
+ "fs_extra",
+ "gitignore",
+ "html_parser",
+ "hyper-rustls 0.23.2",
+ "interprocess-docfix",
+ "manganis-cli-support",
+ "mlua",
+ "notify",
+ "open",
+ "rsx-rosetta",
+ "subprocess",
+ "tar",
+ "tauri-bundler",
+ "tauri-utils",
+ "toml_edit 0.19.15",
+ "tower-http 0.2.5",
+ "wasm-bindgen-cli-support",
+ "zip",
+name = "dioxus-cli-config"
+name = "dioxus-core"
+ "dioxus-ssr",
+ "futures-channel",
+ "longest-increasing-subsequence",
+ "rustc-hash",
+ "smallbox",
+name = "dioxus-core-macro"
+ "constcat",
+ "convert_case 0.6.0",
+ "prettyplease",
+ "trybuild",
+name = "dioxus-debug-cell"
+checksum = "2ea539174bb236e0e7dc9c12b19b88eae3cb574dedbd0252a2d43ea7e6de13e2"
+name = "dioxus-desktop"
+ "crossbeam-channel",
+ "dioxus-interpreter-js",
+ "dunce",
+ "exitcode",
+ "global-hotkey",
+ "infer 0.11.0",
+ "minify-js",
+ "muda",
+ "objc_id",
+ "rfd",
+ "scraper",
+ "tao",
+ "urlencoding",
+ "webbrowser",
+ "wry",
+name = "dioxus-examples"
+ "fermi",
+ "http-range",
+ "im-rc",
+ "manganis",
+ "num-format",
+ "separator",
+name = "dioxus-ext"
+name = "dioxus-fullstack"
+ "anymap 0.12.1",
+ "dioxus_server_macro",
+ "http-body-util",
+ "pin-project",
+ "salvo",
+ "server_fn",
+ "tokio-stream",
+ "tokio-util",
+ "tracing-futures",
+ "warp",
+ "web-sys",
+name = "dioxus-hooks"
+ "dioxus-debug-cell",
+name = "dioxus-hot-reload"
+name = "dioxus-html"
+ "async-channel 1.9.0",
+ "dioxus-html-internal-macro",
+ "enumset",
+ "euclid",
+ "keyboard-types",
+ "serde-value",
+ "serde_repr",
+name = "dioxus-html-internal-macro"
+name = "dioxus-interpreter-js"
+ "sledgehammer_bindgen",
+ "sledgehammer_utils",
+name = "dioxus-liveview"
+ "pretty_env_logger",
+ "rocket",
+ "rocket_ws",
+name = "dioxus-logger"
+checksum = "3d7cbab0b5519060fe9e14b3c21e3f2329b8386cd905618f78c7b929cd00cf54"
+name = "dioxus-mobile"
+name = "dioxus-native-core"
+ "anymap 1.0.0-beta.2",
+ "dioxus-native-core",
+ "dioxus-native-core-macro",
+ "lightningcss",
+ "shipyard",
+ "taffy",
+name = "dioxus-native-core-macro"
+name = "dioxus-playwright-fullstack-test"
+name = "dioxus-playwright-liveview-test"
+version = "0.0.1"
+ "dioxus-liveview",
+name = "dioxus-playwright-web-test"
+name = "dioxus-pwa-example"
+ "console_error_panic_hook",
+ "wasm-logger",
+name = "dioxus-router"
+ "criterion 0.5.1",
+ "dioxus-router-macro",
+ "gloo",
+ "gloo-utils 0.1.7",
+ "wasm-bindgen-test",
+name = "dioxus-router-macro"
+name = "dioxus-rsx"
+ "internment",
+ "krates",
+name = "dioxus-signals"
+ "generational-box",
+name = "dioxus-ssr"
+ "argh",
+ "askama_escape",
+ "lru 0.10.1",
+name = "dioxus-tailwind"
+version = "0.0.0"
+name = "dioxus-tui"
+ "crossterm 0.26.1",
+ "plasmo",
+name = "dioxus-web"
+ "gloo-dialogs",
+ "gloo-timers",
+ "serde-wasm-bindgen",
+ "wasm-bindgen-futures",
+name = "dioxus_server_macro"
+ "server_fn_macro",
+name = "dirs"
+version = "4.0.0"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+ "dirs-sys 0.3.7",
+version = "5.0.1"
+checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225"
+ "dirs-sys 0.4.1",
+name = "dirs-next"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+ "dirs-sys-next",
+name = "dirs-sys"
+version = "0.3.7"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+ "redox_users",
+checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c"
+ "option-ext",
+name = "dirs-sys-next"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+name = "dispatch"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+name = "dissimilar"
+version = "1.0.7"
+checksum = "86e3bdc80eee6e16b2b6b0f87fbc98c04bee3455e35174c0de1a125d0688c632"
+name = "doc-comment"
+version = "0.3.3"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+name = "dotenvy"
+version = "0.15.7"
+checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
+name = "dtoa"
+version = "1.0.9"
+checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
+name = "dtoa-short"
+checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
+ "dtoa",
+name = "dunce"
+checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
+name = "dyn-clone"
+version = "1.0.16"
+checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"
+name = "ecdsa"
+version = "0.16.9"
+checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca"
+ "der",
+ "elliptic-curve",
+ "rfc6979",
+ "signature",
+ "spki",
+name = "ed25519"
+version = "2.2.3"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
+ "pkcs8",
+name = "ed25519-dalek"
+checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0"
+ "curve25519-dalek",
+ "ed25519",
+name = "ego-tree"
+version = "0.6.2"
+checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591"
+name = "either"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+name = "elliptic-curve"
+version = "0.13.8"
+checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
+ "base16ct",
+ "crypto-bigint",
+ "ff",
+ "group",
+ "hkdf",
+ "sec1",
+name = "encode_unicode"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+name = "encoding_rs"
+version = "0.8.33"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+name = "enum-as-inner"
+checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a"
+name = "enumflags2"
+checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939"
+ "enumflags2_derive",
+name = "enumflags2_derive"
+checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246"
+name = "enumset"
+version = "1.1.3"
+checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d"
+ "enumset_derive",
+name = "enumset_derive"
+checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af"
+ "darling",
+name = "env_logger"
+version = "0.10.1"
+checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece"
+ "humantime",
+ "termcolor",
+name = "equivalent"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+name = "errno"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+name = "etag"
+checksum = "4b3d0661a2ccddc26cba0b834e9b717959ed6fdd76c7129ee159c170a875bf44"
+ "str-buf",
+ "xxhash-rust",
+name = "etcetera"
+version = "0.8.0"
+checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
+name = "euclid"
+version = "0.22.9"
+checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787"
+name = "event-listener"
+version = "2.5.3"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+version = "3.1.0"
+checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2"
+version = "4.0.3"
+checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
+name = "event-listener-strategy"
+checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
+name = "execute"
+version = "0.2.13"
+checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10"
+ "execute-command-macro",
+ "execute-command-tokens",
+ "generic-array 1.0.0",
+name = "execute-command-macro"
+version = "0.1.9"
+checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd"
+ "execute-command-macro-impl",
+name = "execute-command-macro-impl"
+version = "0.1.10"
+checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b"
+name = "execute-command-tokens"
+checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad"
+name = "exitcode"
+checksum = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193"
+name = "exr"
+version = "1.71.0"
+checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8"
+ "bit_field",
+ "flume",
+ "half 2.2.1",
+ "lebe",
+ "rayon-core",
+ "zune-inflate",
+name = "fallible-iterator"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+name = "faster-hex"
+checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
+name = "fastrand"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+ "instant",
+version = "2.0.1"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+name = "fdeflate"
+checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd"
+ "simd-adler32",
+name = "fermi"
+ "closure",
+name = "fern"
+checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee"
+ "colored 1.9.4",
+name = "ff"
+checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
+name = "fiat-crypto"
+checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7"
+name = "field-offset"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+ "memoffset 0.9.0",
+name = "figment"
+version = "0.10.13"
+checksum = "7629b8c7bcd214a072c2c88b263b5bb3ceb54c34365d8c41c1665461aeae0993"
+ "atomic 0.6.0",
+ "pear",
+ "uncased",
+name = "filetime"
+version = "0.2.23"
+checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
+ "redox_syscall",
+name = "finl_unicode"
+checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6"
+name = "fixedbitset"
+version = "0.4.2"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+name = "flate2"
+version = "1.0.28"
+checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+ "crc32fast",
+name = "flume"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+ "futures-sink",
+ "spin 0.9.8",
+name = "fnv"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+name = "foreign-types"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+ "foreign-types-shared 0.1.1",
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+ "foreign-types-macros",
+ "foreign-types-shared 0.3.1",
+name = "foreign-types-macros"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+name = "foreign-types-shared"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+name = "form_urlencoded"
+version = "1.2.1"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+name = "fs-err"
+version = "2.11.0"
+checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41"
+name = "fs_at"
+checksum = "982f82cc75107eef84f417ad6c53ae89bf65b561937ca4a3b3b0fd04d0aa2425"
+ "aligned",
+ "cvt",
+ "nix 0.26.4",
+name = "fs_extra"
+checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
+name = "fsevent-sys"
+version = "4.1.0"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+name = "funty"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+name = "futf"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+ "mac",
+ "new_debug_unreachable",
+name = "futures"
+version = "0.3.30"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
+ "futures-executor",
+ "futures-task",
+name = "futures-channel"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+name = "futures-core"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+name = "futures-executor"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+name = "futures-intrusive"
+checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
+name = "futures-io"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+name = "futures-lite"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+ "fastrand 1.9.0",
+checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba"
+name = "futures-macro"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+name = "futures-sink"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+name = "futures-task"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+name = "futures-util"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+ "futures-macro",
+ "pin-utils",
+name = "fxhash"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+name = "gdk"
+checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646"
+ "cairo-rs",
+ "gdk-pixbuf",
+ "gdk-sys",
+ "gio",
+ "pango",
+name = "gdk-pixbuf"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
+ "gdk-pixbuf-sys",
+name = "gdk-pixbuf-sys"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
+ "gio-sys",
+name = "gdk-sys"
+checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2"
+ "pango-sys",
+name = "gdkwayland-sys"
+checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a"
+name = "gdkx11"
+checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce"
+ "gdk",
+ "gdkx11-sys",
+ "x11",
+name = "gdkx11-sys"
+checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043"
+name = "generational-box"
+name = "generator"
+version = "0.7.5"
+checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
+ "windows 0.48.0",
+name = "generic-array"
+version = "0.14.7"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+checksum = "fe739944a5406424e080edccb6add95685130b9f160d5407c639c7df0c5836b0"
+name = "getopts"
+version = "0.2.21"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+name = "getrandom"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+ "wasi 0.9.0+wasi-snapshot-preview1",
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+ "wasi 0.11.0+wasi-snapshot-preview1",
+name = "ghash"
+checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40"
+ "opaque-debug",
+ "polyval",
+name = "gif"
+checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
+ "color_quant",
+ "weezl",
+name = "gimli"
+version = "0.26.2"
+checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
+ "fallible-iterator",
+ "indexmap 1.9.3",
+version = "0.28.1"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+name = "gio"
+version = "0.18.4"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
+name = "gio-sys"
+version = "0.18.1"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
+name = "git2"
+checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd"
+ "libgit2-sys",
+ "openssl-probe",
+ "openssl-sys",
+name = "gitignore"
+version = "1.0.8"
+checksum = "7d051488d9a601181a9b90c9ad8ae7e8251d642ddd2463008f2f5019d255bd89"
+ "glob",
+name = "gix-actor"
+checksum = "2eadca029ef716b4378f7afb19f7ee101fde9e58ba1f1445971315ac866db417"
+ "bstr 1.9.0",
+ "btoi",
+ "gix-date",
+ "winnow",
+name = "gix-config"
+version = "0.31.0"
+checksum = "5cae98c6b4c66c09379bc35274b172587d6b0ac369a416c39128ad8c6454f9bb"
+ "gix-config-value",
+ "gix-features",
+ "gix-glob",
+ "gix-path",
+ "gix-ref",
+ "gix-sec",
+ "unicode-bom",
+name = "gix-config-value"
+version = "0.14.3"
+checksum = "52e0be46f4cf1f8f9e88d0e3eb7b29718aff23889563249f379119bd1ab6910e"
+name = "gix-date"
+checksum = "fb7f3dfb72bebe3449b5e642be64e3c6ccbe9821c8b8f19f487cf5bfbbf4067e"
+name = "gix-features"
+version = "0.36.1"
+checksum = "4d46a4a5c6bb5bebec9c0d18b65ada20e6517dbd7cf855b87dd4bbdce3a771b2"
+ "gix-hash",
+ "gix-trace",
+ "prodash",
+ "sha1_smol",
+name = "gix-fs"
+checksum = "20e86eb040f5776a5ade092282e51cdcad398adb77d948b88d17583c2ae4e107"
+name = "gix-glob"
+version = "0.14.1"
+checksum = "5db19298c5eeea2961e5b3bf190767a2d1f09b8802aeb5f258e42276350aff19"
+name = "gix-hash"
+version = "0.13.3"
+checksum = "1f8cf8c2266f63e582b7eb206799b63aa5fa68ee510ad349f637dfe2d0653de0"
+ "faster-hex",
+name = "gix-lock"
+version = "11.0.1"
+checksum = "7e5c65e6a29830a435664891ced3f3c1af010f14900226019590ee0971a22f37"
+ "gix-tempfile",
+ "gix-utils",
+name = "gix-object"
+version = "0.38.0"
+checksum = "740f2a44267f58770a1cb3a3d01d14e67b089c7136c48d4bddbb3cfd2bf86a51"
+ "gix-actor",
+ "gix-validate",
+name = "gix-path"
+checksum = "b8dd0998ab245f33d40ca2267e58d542fe54185ebd1dc41923346cf28d179fb6"
+name = "gix-ref"
+checksum = "0ec2f6d07ac88d2fb8007ee3fa3e801856fb9d82e7366ec0ca332eb2c9d74a52"
+ "gix-fs",
+ "gix-lock",
+ "gix-object",
+ "memmap2",
+name = "gix-sec"
+checksum = "78f6dce0c6683e2219e8169aac4b1c29e89540a8262fef7056b31d80d969408c"
+ "windows 0.52.0",
+name = "gix-tempfile"
+checksum = "388dd29114a86ec69b28d1e26d6d63a662300ecf61ab3f4cc578f7d7dc9e7e23"
+name = "gix-trace"
+checksum = "e8e1127ede0475b58f4fe9c0aaa0d9bb0bad2af90bbd93ccd307c8632b863d89"
+name = "gix-utils"
+checksum = "de6225e2de30b6e9bca2d9f1cc4731640fcef0fb3cabddceee366e7e85d3e94f"
+name = "gix-validate"
+checksum = "ac7cc36f496bd5d96cdca0f9289bb684480725d40db60f48194aa7723b883854"
+name = "glib"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
+ "glib-macros",
+name = "glib-macros"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
+ "proc-macro-error",
+name = "glib-sys"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
+name = "glob"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+name = "global-hotkey"
+checksum = "d505f007b733fc3b3261ca0710e7e689411422ace5f5b2a63a14d8596159db23"
+ "x11-dl",
+name = "globset"
+version = "0.4.14"
+checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+ "aho-corasick 1.1.2",
+ "regex-syntax 0.8.2",
+name = "gloo"
+checksum = "28999cda5ef6916ffd33fb4a7b87e1de633c47c0dc6d97905fee1cdaa142b94d"
+ "gloo-console",
+ "gloo-events",
+ "gloo-file",
+ "gloo-history",
+ "gloo-net 0.3.1",
+ "gloo-render",
+ "gloo-storage 0.2.2",
+ "gloo-worker",
+name = "gloo-console"
+checksum = "82b7ce3c05debe147233596904981848862b068862e9ec3e34be446077190d3f"
+name = "gloo-dialogs"
+checksum = "67062364ac72d27f08445a46cab428188e2e224ec9e37efdba48ae8c289002e6"
+name = "gloo-events"
+checksum = "68b107f8abed8105e4182de63845afcc7b69c098b7852a813ea7462a320992fc"
+name = "gloo-file"
+checksum = "a8d5564e570a38b43d78bdc063374a0c3098c4f0d64005b12f9bbe87e869b6d7"
+name = "gloo-history"
+checksum = "85725d90bf0ed47063b3930ef28e863658a7905989e9929a8708aab74a1d5e7f"
+name = "gloo-net"
+checksum = "9902a044653b26b99f7e3693a42f171312d9be8b26b5697bd1e43ad1f8a35e10"
+checksum = "a66b4e3c7d9ed8d315fd6b97c8b1f74a7c6ecbbc2320e65ae7ed38b7068cc620"
+name = "gloo-render"
+checksum = "2fd9306aef67cfd4449823aadcd14e3958e0800aa2183955a309112a84ec7764"
+name = "gloo-storage"
+checksum = "5d6ab60bf5dbfd6f0ed1f7843da31b41010515c745735c970e821945ca91e480"
+checksum = "fbc8031e8c92758af912f9bc08fbbadd3c6f3cfcbf6b64cdf3d6a81f0139277a"
+ "gloo-utils 0.2.0",
+name = "gloo-timers"
+checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
+name = "gloo-utils"
+checksum = "037fcb07216cb3a30f7292bd0176b050b7b9a052ba830ef7d5d65f6dc64ba58e"
+checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa"
+name = "gloo-worker"
+checksum = "13471584da78061a28306d1359dd0178d8d6fc1c7c80e5e35d27260346e0516a"
+ "anymap2",
+ "bincode",
+name = "gobject-sys"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
+name = "grid"
+version = "0.10.0"
+checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c"
+name = "group"
+checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63"
+name = "gtk"
+checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c"
+ "atk",
+ "field-offset",
+ "gtk-sys",
+ "gtk3-macros",
+name = "gtk-sys"
+checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722"
+name = "gtk3-macros"
+checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e"
+ "proc-macro-crate 1.3.1",
+name = "h2"
+version = "0.3.23"
+checksum = "b553656127a00601c8ae5590fcfdc118e4083a7924b6cf4ffc1ea4b99dc429d7"
+checksum = "991910e35c615d8cab86b5ab04be67e6ad24d2bf5f4f11fdbbed26da999bbeab"
+ "http 1.0.0",
+name = "half"
+version = "1.8.2"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+version = "2.2.1"
+checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0"
+ "crunchy",
+name = "handlebars"
+version = "4.5.0"
+checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225"
+ "pest",
+ "pest_derive",
+name = "hashbrown"
+version = "0.12.3"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+ "ahash 0.7.7",
+version = "0.13.2"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+ "ahash 0.8.7",
+ "bumpalo",
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+ "allocator-api2",
+name = "hashlink"
+version = "0.8.4"
+checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+name = "headers"
+version = "0.3.9"
+checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270"
+ "headers-core 0.2.0",
+ "httpdate",
+checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9"
+ "headers-core 0.3.0",
+name = "headers-core"
+checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
+checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4"
+name = "heck"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+name = "hermit-abi"
+version = "0.1.19"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+name = "hex"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+name = "hkdf"
+version = "0.12.4"
+checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
+name = "hmac"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+name = "home"
+version = "0.5.9"
+checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+name = "hostname"
+checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867"
+ "match_cfg",
+name = "html5ever"
+version = "0.26.0"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+ "markup5ever",
+name = "html_parser"
+checksum = "f6f56db07b6612644f6f7719f8ef944f75fff9d6378fdf3d316fd32194184abd"
+ "doc-comment",
+name = "http"
+version = "0.2.11"
+checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+name = "http-body"
+version = "0.4.6"
+checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+name = "http-body-util"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+ "http-body 1.0.0",
+name = "http-range"
+checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573"
+name = "http-range-header"
+checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+name = "httparse"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+name = "httpdate"
+version = "1.0.3"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+name = "humantime"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+name = "hyper"
+version = "0.14.28"
+checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+ "h2 0.3.23",
+ "httparse",
+ "socket2 0.5.5",
+ "want",
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+ "h2 0.4.1",
+name = "hyper-rustls"
+version = "0.23.2"
+checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
+ "rustls 0.20.9",
+ "rustls-native-certs",
+ "tokio-rustls 0.23.4",
+version = "0.24.2"
+checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+name = "hyper-tls"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+ "native-tls",
+ "tokio-native-tls",
+name = "hyper-util"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+ "hyper 1.1.0",
+name = "iana-time-zone"
+version = "0.1.59"
+checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539"
+ "android_system_properties",
+ "iana-time-zone-haiku",
+ "windows-core",
+name = "iana-time-zone-haiku"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+name = "id-arena"
+checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
+name = "ident_case"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+name = "idna"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+ "unicode-bidi",
+ "unicode-normalization",
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+name = "ignore"
+version = "0.4.22"
+checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
+ "crossbeam-deque",
+ "globset",
+ "same-file",
+ "winapi-util",
+name = "im-rc"
+version = "15.1.0"
+checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe"
+ "bitmaps",
+ "rand_xoshiro",
+ "sized-chunks",
+name = "image"
+version = "0.24.7"
+checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
+ "exr",
+ "gif",
+ "jpeg-decoder",
+ "png",
+ "qoi",
+ "ravif",
+ "rgb",
+ "tiff",
+ "webp",
+name = "imagequant"
+version = "4.2.2"
+checksum = "84d51957ac48371e8e2eaaeb4eba56150ff2109c1c8c200002afb7dd6e2d260f"
+ "thread_local",
+name = "imgref"
+checksum = "90d944e334f00f4449c9640b440a171f816be0152305c12ef90424fc35fd035c"
+name = "indexmap"
+version = "1.9.3"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+ "hashbrown 0.12.3",
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+ "equivalent",
+name = "indicatif"
+version = "0.17.7"
+checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25"
+ "number_prefix",
+ "portable-atomic",
+name = "indoc"
+checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+name = "infer"
+checksum = "0a6c16b11a665b26aeeb9b1d7f954cdeb034be38dd00adab4f2ae921a8fee804"
+ "cfb",
+checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc"
+name = "inlinable_string"
+version = "0.1.15"
+checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
+name = "inotify"
+checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff"
+ "inotify-sys",
+name = "inotify-sys"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+name = "inout"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+name = "instant"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+name = "internment"
+checksum = "5e976188335292f66a1533fd41d5c2ce24b32dc2c000569b8dccf4e57f489806"
+name = "interpolate_name"
+version = "0.2.4"
+checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
+name = "interprocess-docfix"
+version = "1.2.2"
+checksum = "4b84ee245c606aeb0841649a9288e3eae8c61b853a8cd5c0e14450e96d53d28f"
+ "intmap",
+ "spinning",
+ "to_method",
+name = "intmap"
+checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9"
+name = "inventory"
+version = "0.3.14"
+checksum = "c8573b2b1fb643a372c73b23f4da5f888677feef3305146d68a539250a9bccc7"
+name = "io-lifetimes"
+version = "1.0.11"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+ "hermit-abi 0.3.3",
+name = "ipconfig"
+checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
+ "widestring",
+ "winreg",
+name = "ipnet"
+version = "2.9.0"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+name = "ipnetwork"
+version = "0.20.0"
+checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e"
+name = "iri-string"
+checksum = "8f0f7638c1e223529f1bfdc48c8b133b9e0b434094d1d28473161ee48b235f78"
+name = "is-docker"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
+name = "is-terminal"
+version = "0.4.10"
+checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
+name = "is-wsl"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
+ "is-docker",
+name = "is_ci"
+version = "1.1.1"
+checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
+name = "itertools"
+version = "0.10.5"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+ "either",
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
+name = "itoa"
+version = "0.4.8"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+version = "1.0.10"
+checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+name = "javascriptcore-rs"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
+ "javascriptcore-rs-sys",
+name = "javascriptcore-rs-sys"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
+name = "jni"
+version = "0.21.1"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
+ "cesu8",
+ "combine",
+ "jni-sys",
+ "windows-sys 0.45.0",
+name = "jni-sys"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+name = "jobserver"
+version = "0.1.27"
+checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+name = "jpeg-decoder"
+checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
+name = "js-sys"
+version = "0.3.66"
+checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca"
+name = "json-patch"
+checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6"
+ "treediff",
+name = "keyboard-types"
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
+name = "kqueue"
+checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
+ "kqueue-sys",
+name = "kqueue-sys"
+checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
+name = "krates"
+version = "0.12.6"
+checksum = "942c43a6cba1c201dfe81a943c89fa5c9140b34993e0c027f542c80b92e319a7"
+ "cfg-expr 0.12.0",
+name = "kstring"
+checksum = "ec3066350882a1cd6d950d055997f379ac37fd39f81cd4d8ed186032eb3c5747"
+ "static_assertions",
+name = "kuchikiki"
+version = "0.8.2"
+checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8"
+ "cssparser 0.27.2",
+ "html5ever",
+ "selectors 0.22.0",
+name = "lazy_static"
+version = "1.4.0"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+ "spin 0.5.2",
+name = "leb128"
+checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+name = "lebe"
+checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
+name = "libc"
+version = "0.2.152"
+checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
+name = "libflate"
+checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18"
+ "adler32",
+ "libflate_lz77",
+name = "libflate_lz77"
+checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf"
+ "rle-decode-fast",
+name = "libfuzzer-sys"
+checksum = "fcf184a4b6b274f82a5df6b357da6055d3e82272327bba281c28bbba6f1664ef"
+ "arbitrary 0.4.7",
+checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7"
+ "arbitrary 1.3.2",
+name = "libgit2-sys"
+version = "0.16.1+1.7.1"
+checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c"
+ "libssh2-sys",
+ "libz-sys",
+name = "libm"
+version = "0.2.8"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+name = "libredox"
+checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+name = "libsqlite3-sys"
+checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
+ "vcpkg",
+name = "libssh2-sys"
+checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee"
+name = "libwebp-sys"
+checksum = "3e0df0a0f9444d52aee6335cd724d21a2ee3285f646291799a72be518ec8ee3c"
+name = "libxdo"
+checksum = "00333b8756a3d28e78def82067a377de7fa61b24909000aeaa2b446a948d14db"
+ "libxdo-sys",
+name = "libxdo-sys"
+checksum = "db23b9e7e2b7831bbd8aac0bbeeeb7b68cbebc162b227e7052e8e55829a09212"
+name = "libz-sys"
+version = "1.1.14"
+checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050"
+name = "lightningcss"
+version = "1.0.0-alpha.51"
+checksum = "99d6ad516c08b24c246b339159dc2ee2144c012e8ebdf4db4bddefb8734b2b69"
+ "const-str",
+ "cssparser-color",
+ "data-encoding",
+ "parcel_selectors",
+ "parcel_sourcemap",
+ "pathdiff",
+name = "line-col"
+checksum = "9e69cdf6b85b5c8dce514f694089a2cf8b1a702f6cd28607bcb3cf296c9778db"
+name = "line-wrap"
+checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
+name = "linked-hash-map"
+version = "0.5.6"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+name = "linux-raw-sys"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+version = "0.4.12"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
+name = "liquid"
+version = "0.26.4"
+checksum = "69f68ae1011499ae2ef879f631891f21c78e309755f4a5e483c4a8f12e10b609"
+name = "liquid-core"
+checksum = "79e0724dfcaad5cfb7965ea0f178ca0870b8d7315178f4a7179f5696f7f04d5f"
+ "kstring",
+name = "liquid-derive"
+checksum = "fc2fb41a9bb4257a3803154bdf7e2df7d45197d1941c9b1a90ad815231630721"
+name = "liquid-lib"
+checksum = "e2a17e273a6fb1fb6268f7a5867ddfd0bd4683c7e19b51084f3d567fad4348c0"
+name = "lock_api"
+version = "0.4.11"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+ "scopeguard",
+name = "log"
+version = "0.4.20"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+ "value-bag",
+name = "longest-increasing-subsequence"
+checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
+name = "loom"
+checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
+ "generator",
+ "scoped-tls",
+name = "loop9"
+checksum = "81a837f917de41d61ab531ba255d1913208d02325cab0d6a66a706e0dbaa699d"
+ "imgref",
+name = "lru"
+checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909"
+checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670"
+ "hashbrown 0.13.2",
+checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7"
+name = "lru-cache"
+checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
+ "linked-hash-map",
+name = "lua-src"
+version = "546.0.2"
+checksum = "2da0daa7eee611a4c30c8f5ee31af55266e26e573971ba9336d2993e2da129b2"
+name = "luajit-src"
+version = "210.4.8+resty107baaf"
+checksum = "e05167e8b2a2185758d83ed23541e5bd8bce37072e4204e0ef2c9b322bc87c4e"
+ "which",
+name = "mac"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+name = "mac_address"
+version = "1.1.5"
+checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856"
+ "nix 0.23.2",
+name = "malloc_buf"
+version = "0.0.6"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+name = "manganis"
+source = "git+https://github.com/DioxusLabs/collect-assets?rev=e0093a4#e0093a47f0fa3bb50c49cd21aee5aa674faa24ad"
+ "manganis-macro",
+name = "manganis-cli-support"
+ "cargo-lock 9.0.0",
+ "cargo_metadata 0.17.0",
+ "image",
+ "imagequant",
+ "manganis-common",
+ "mozjpeg",
+ "railwind",
+name = "manganis-common"
+name = "manganis-macro"
+name = "markup5ever"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+ "phf_codegen 0.10.0",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+name = "match_cfg"
+checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
+name = "matchers"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+ "regex-automata 0.1.10",
+name = "matches"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+name = "matchit"
+checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+name = "maybe-rayon"
+checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"
+name = "md-5"
+version = "0.10.6"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
+name = "md5"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+name = "memchr"
+version = "2.7.1"
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+name = "memmap2"
+checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
+name = "memoffset"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+name = "mime"
+version = "0.3.17"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+name = "mime-infer"
+version = "3.0.0"
+checksum = "91caed19dd472bc88bcd063571df18153529d49301a1918f4cf37f42332bee2e"
+ "unicase",
+name = "mime_guess"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+name = "minify-js"
+checksum = "22d6c512a82abddbbc13b70609cb2beff01be2c7afff534d6e5e1c85e438fc8b"
+ "parse-js",
+name = "minimal-lexical"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+name = "miniz_oxide"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+ "adler",
+name = "mio"
+version = "0.8.10"
+checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+name = "mlua"
+checksum = "0bb37b0ba91f017aa7ca2b98ef99496827770cd635b4a932a6047c5b4bbe678e"
+ "bstr 0.2.17",
+ "lua-src",
+ "luajit-src",
+ "mlua_derive",
+name = "mlua_derive"
+checksum = "b9214e60d3cf1643013b107330fcd374ccec1e4ba1eef76e7e5da5e8202e71c0"
+name = "mozjpeg"
+version = "0.9.8"
+checksum = "e8a807fbca64e7df4847726d172f459fb13e65cbf5e23b01f27408581d58258f"
+ "mozjpeg-sys",
+name = "mozjpeg-sys"
+checksum = "74c4fe4006093b2948ccb37bb413b6b9da2d654a9a50419b5861b0f4e8ad4da9"
+ "nasm-rs",
+name = "muda"
+version = "0.11.3"
+checksum = "884427679a3ef726cd4a0ad6eec2ca618737ba11ebe8c9320dc305c09c78c8fc"
+ "cocoa",
+ "gtk",
+ "libxdo",
+name = "multer"
+checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2"
+ "encoding_rs",
+checksum = "a15d522be0a9c3e46fd2632e272d178f56387bdb5c9fbb3a36c649062e9b5219"
+name = "multimap"
+checksum = "e1a5d38b9b352dbd913288736af36af41c48d61b1a8cd34bcecd727561b7d511"
+name = "names"
+checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc"
+name = "nasm-rs"
+checksum = "fe4d98d0065f4b1daf164b3eafb11974c94662e5e2396cf03f32d0bb5c17da51"
+name = "native-tls"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+ "openssl",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+name = "ndk"
+checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0"
+ "ndk-sys",
+ "num_enum",
+ "raw-window-handle 0.5.2",
+name = "ndk-context"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+name = "ndk-sys"
+version = "0.4.1+23.1.7779620"
+checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3"
+name = "new_debug_unreachable"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+name = "nix"
+checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c"
+ "memoffset 0.6.5",
+checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
+ "memoffset 0.7.1",
+version = "0.27.1"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+name = "nodrop"
+version = "0.1.14"
+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+name = "nom"
+version = "7.1.3"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+ "minimal-lexical",
+name = "noop_proc_macro"
+checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
+name = "normpath"
+checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5"
+name = "notify"
+version = "5.2.0"
+checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486"
+ "filetime",
+ "fsevent-sys",
+ "inotify",
+ "kqueue",
+name = "nu-ansi-term"
+version = "0.46.0"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+ "overload",
+name = "num-bigint"
+checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+name = "num-bigint-dig"
+checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
+ "libm",
+ "num-iter",
+name = "num-derive"
+checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
+checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712"
+name = "num-format"
+checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3"
+name = "num-integer"
+version = "0.1.45"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+name = "num-iter"
+version = "0.1.43"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+name = "num-rational"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+name = "num-traits"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+name = "num_cpus"
+version = "1.16.0"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+name = "num_enum"
+checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+ "num_enum_derive",
+name = "num_enum_derive"
+checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
+name = "num_threads"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+name = "number_prefix"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+name = "oauth2"
+version = "4.4.2"
+checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f"
+name = "objc"
+version = "0.2.7"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+ "malloc_buf",
+ "objc_exception",
+name = "objc-foundation"
+checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+name = "objc_exception"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+name = "objc_id"
+checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+name = "object"
+version = "0.32.2"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+name = "once_cell"
+version = "1.19.0"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+name = "oorandom"
+version = "11.1.3"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+name = "opaque-debug"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+name = "open"
+version = "4.2.0"
+checksum = "3a083c0c7e5e4a8ec4176346cf61f67ac674e8bfb059d9226e1c54a96b377c12"
+ "is-wsl",
+name = "openid_auth_demo"
+ "dioxus-logger",
+ "form_urlencoded",
+ "gloo-storage 0.3.0",
+ "openidconnect",
+name = "openidconnect"
+checksum = "62d6050f6a84b81f23c569f5607ad883293e57491036e318fafe6fc4895fadb1"
+ "dyn-clone",
+ "ed25519-dalek",
+ "oauth2",
+ "p256",
+ "p384",
+ "rsa",
+ "serde_plain",
+ "serde_with",
+name = "openssl"
+version = "0.10.62"
+checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671"
+ "foreign-types 0.3.2",
+ "openssl-macros",
+name = "openssl-macros"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+name = "openssl-probe"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+name = "openssl-src"
+version = "300.2.1+3.2.0"
+checksum = "3fe476c29791a5ca0d1273c697e96085bbabbbea2ef7afd5617e78a4b40332d3"
+name = "openssl-sys"
+version = "0.9.98"
+checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7"
+ "openssl-src",
+name = "option-ext"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+name = "ordered-float"
+version = "2.10.1"
+checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
+name = "ordered-stream"
+checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
+name = "os_pipe"
+checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9"
+name = "outref"
+checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4"
+name = "overload"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+name = "owo-colors"
+version = "3.5.0"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+ "supports-color",
+name = "p256"
+checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b"
+ "ecdsa",
+ "primeorder",
+name = "p384"
+checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209"
+name = "pango"
+version = "0.18.3"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
+name = "pango-sys"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
+name = "parcel_selectors"
+checksum = "05d74befe2d076330d9a58bf9ca2da424568724ab278adf15fb5718253133887"
+ "fxhash",
+ "precomputed-hash",
+name = "parcel_sourcemap"
+checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb"
+ "base64-simd",
+ "data-url",
+ "rkyv",
+ "vlq",
+name = "parking"
+checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
+name = "parking_lot"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+name = "parking_lot_core"
+version = "0.9.9"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+name = "parse-js"
+checksum = "9ec3b11d443640ec35165ee8f6f0559f1c6f41878d70330fe9187012b5935f02"
+ "aho-corasick 0.7.20",
+name = "password-hash"
+checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
+ "base64ct",
+name = "paste"
+version = "1.0.14"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+name = "path-absolutize"
+version = "3.1.1"
+checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5"
+ "path-dedot",
+name = "path-dedot"
+checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397"
+name = "path-slash"
+checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42"
+name = "pathdiff"
+checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
+name = "pbkdf2"
+checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
+ "password-hash",
+name = "pear"
+checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8"
+ "inlinable_string",
+ "pear_codegen",
+ "yansi 1.0.0-rc.1",
+name = "pear_codegen"
+checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77"
+name = "pem-rfc7468"
+checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+name = "percent-encoding"
+version = "2.3.1"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+name = "pest"
+version = "2.7.6"
+checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06"
+ "ucd-trie",
+name = "pest_derive"
+checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde"
+ "pest_generator",
+name = "pest_generator"
+checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275"
+ "pest_meta",
+name = "pest_meta"
+checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d"
+name = "petgraph"
+version = "0.6.4"
+checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+ "fixedbitset",
+name = "phf"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+ "phf_macros 0.8.0",
+ "phf_shared 0.8.0",
+ "proc-macro-hack",
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+ "phf_macros 0.10.0",
+ "phf_shared 0.10.0",
+version = "0.11.2"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+ "phf_macros 0.11.2",
+ "phf_shared 0.11.2",
+name = "phf_codegen"
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+ "phf_generator 0.8.0",
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+ "phf_generator 0.10.0",
+name = "phf_generator"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+ "rand 0.7.3",
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+name = "phf_macros"
+checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
+checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
+checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
+ "phf_generator 0.11.2",
+name = "phf_shared"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+ "siphasher",
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+name = "pin-project"
+checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+ "pin-project-internal",
+name = "pin-project-internal"
+checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+name = "pin-project-lite"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+name = "pin-utils"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+name = "piper"
+checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4"
+name = "pkcs1"
+checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
+name = "pkcs8"
+checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
+name = "pkg-config"
+version = "0.3.28"
+checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
+name = "plasmo"
+ "ratatui",
+name = "platforms"
+checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c"
+name = "plist"
+checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef"
+ "line-wrap",
+ "quick-xml",
+name = "plotters"
+checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
+ "plotters-backend",
+ "plotters-svg",
+name = "plotters-backend"
+checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+name = "plotters-svg"
+checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+name = "png"
+version = "0.17.10"
+checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
+ "fdeflate",
+name = "polling"
+checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
+version = "3.3.1"
+checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e"
+name = "polyval"
+checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb"
+ "universal-hash",
+name = "portable-atomic"
+checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
+name = "powerfmt"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+name = "ppv-lite86"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+name = "precomputed-hash"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+name = "prettier-please"
+checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3"
+name = "pretty_assertions"
+checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
+ "diff",
+ "yansi 0.5.1",
+name = "pretty_env_logger"
+checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c"
+name = "prettyplease"
+checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5"
+name = "primeorder"
+version = "0.13.6"
+checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6"
+name = "proc-macro-crate"
+version = "1.3.1"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a"
+ "toml_datetime",
+ "toml_edit 0.20.2",
+name = "proc-macro-error"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+ "proc-macro-error-attr",
+name = "proc-macro-error-attr"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+name = "proc-macro2"
+version = "1.0.76"
+checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
+ "unicode-ident",
+name = "proc-macro2-diagnostics"
+checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8"
+name = "prodash"
+version = "26.2.2"
+checksum = "794b5bf8e2d19b53dcdcec3e4bba628e20f5b6062503ba89281fa7037dd7bbcf"
+name = "profiling"
+version = "1.0.13"
+checksum = "d135ede8821cf6376eb7a64148901e1690b788c11ae94dc297ae917dbc91dc0e"
+ "profiling-procmacros",
+name = "profiling-procmacros"
+checksum = "4b322d7d65c1ab449be3c890fcbd0db6e1092d0dd05d79dba2dd28032cebeb05"
+name = "ptr_meta"
+checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
+ "ptr_meta_derive",
+name = "ptr_meta_derive"
+checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
+name = "qoi"
+checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
+name = "query_segments_demo"
+name = "quick-error"
+version = "1.2.3"
+checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
+checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
+name = "quick-xml"
+checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
+name = "quote"
+version = "1.0.35"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+name = "radium"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+name = "railwind"
+checksum = "2bc2b6ca634162c78a6e8d399e12e22b42bcbf2eb60f2b7a2f99aa2379d41800"
+ "hex",
+ "line-col",
+ "ron",
+ "serde_regex",
+name = "rand"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+ "getrandom 0.1.16",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+ "rand_pcg",
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+ "rand_chacha 0.3.1",
+name = "rand_chacha"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+ "ppv-lite86",
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+name = "rand_core"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+name = "rand_hc"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+name = "rand_pcg"
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+name = "rand_xoshiro"
+checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
+name = "ratatui"
+version = "0.24.0"
+checksum = "0ebc917cfb527a566c37ecb94c7e3fd098353516fb4eb6bea17015ade0182425"
+ "cassowary",
+ "crossterm 0.27.0",
+ "itertools 0.11.0",
+ "lru 0.12.1",
+ "strum",
+name = "rav1e"
+version = "0.6.6"
+checksum = "16c383692a5e7abd9f6d1eddb1a5e0269f859392387883361bb09e5555852ec1"
+ "arg_enum_proc_macro",
+ "av1-grain",
+ "bitstream-io 1.10.0",
+ "built 0.5.2",
+ "interpolate_name",
+ "libfuzzer-sys 0.3.5",
+ "maybe-rayon",
+ "noop_proc_macro",
+ "num-derive 0.3.3",
+ "rust_hawktracer",
+ "simd_helpers",
+checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9"
+ "bitstream-io 2.2.0",
+ "built 0.7.1",
+ "itertools 0.12.0",
+ "libfuzzer-sys 0.4.7",
+ "num-derive 0.4.1",
+ "profiling",
+name = "ravif"
+version = "0.11.4"
+checksum = "d44feba0b8a381a5efa2c0baf8dace8418904403260233f4a614503b018fc288"
+ "avif-serialize",
+ "loop9",
+ "quick-error 2.0.1",
+ "rav1e 0.6.6",
+ "rav1e 0.7.1",
+name = "raw-window-handle"
+checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9"
+checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544"
+name = "rayon"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+name = "rayon-core"
+version = "1.12.0"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+name = "redox_syscall"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+name = "redox_users"
+checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+ "libredox",
+name = "ref-cast"
+version = "1.0.22"
+checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f"
+ "ref-cast-impl",
+name = "ref-cast-impl"
+checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc"
+name = "regex"
+version = "1.10.2"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+name = "regex-automata"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+ "regex-syntax 0.6.29",
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+name = "regex-syntax"
+version = "0.6.29"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+name = "remove_dir_all"
+checksum = "23895cfadc1917fed9c6ed76a8c2903615fa3704f7493ff82b364c6540acc02b"
+ "fs_at",
+ "normpath",
+name = "rend"
+checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd"
+ "bytecheck",
+name = "reqwest"
+version = "0.11.23"
+checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
+ "hyper-rustls 0.24.2",
+ "hyper-tls",
+ "ipnet",
+ "system-configuration",
+ "trust-dns-resolver",
+ "wasm-streams",
+ "webpki-roots",
+name = "resolv-conf"
+checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00"
+ "hostname",
+ "quick-error 1.2.3",
+name = "rfc6979"
+checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2"
+name = "rfd"
+checksum = "3c9e7b57df6e8472152674607f6cc68aa14a748a3157a857a94f516e11aeacc2"
+ "dispatch",
+ "objc-foundation",
+name = "rgb"
+version = "0.8.37"
+checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8"
+name = "rhai"
+version = "1.16.3"
+checksum = "e3625f343d89990133d013e39c46e350915178cf94f1bec9f49b0cbef98a3e3c"
+ "rhai_codegen",
+ "smartstring",
+name = "rhai_codegen"
+checksum = "853977598f084a492323fe2f7896b4100a86284ee8473612de60021ea341310f"
+name = "ring"
+version = "0.16.20"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+ "untrusted 0.7.1",
+checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
+ "untrusted 0.9.0",
+name = "rkyv"
+version = "0.7.43"
+checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5"
+ "bitvec",
+ "rend",
+ "rkyv_derive",
+ "seahash",
+ "tinyvec",
+name = "rkyv_derive"
+checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033"
+name = "rle-decode-fast"
+checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
+name = "rocket"
+checksum = "9e7bb57ccb26670d73b6a47396c83139447b9e7878cab627fdfe9ea8da489150"
+ "async-stream",
+ "atomic 0.5.3",
+ "binascii",
+ "figment",
+ "multer 2.1.0",
+ "num_cpus",
+ "ref-cast",
+ "rocket_codegen",
+ "rocket_http",
+ "state",
+ "ubyte",
+name = "rocket_codegen"
+checksum = "a2238066abf75f21be6cd7dc1a09d5414a671f4246e384e49fe3f8a4936bd04c"
+ "devise",
+name = "rocket_http"
+checksum = "37a1663694d059fe5f943ea5481363e48050acedd241d46deb2e27f71110389e"
+ "cookie 0.18.0",
+ "stable-pattern",
+name = "rocket_ws"
+checksum = "b6677b3fe72e2d73dd632c412546ed8153e8685c830ee8d20e4488575cb905d9"
+name = "ron"
+checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
+name = "rsa"
+checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+ "num-bigint-dig",
+ "pkcs1",
+name = "rsx-rosetta"
+ "convert_case 0.5.0",
+name = "rust-embed"
+version = "8.2.0"
+checksum = "a82c0bbc10308ed323529fd3c1dce8badda635aa319a5ff0e6466f33b8101e3f"
+ "rust-embed-impl",
+ "rust-embed-utils",
+name = "rust-embed-impl"
+checksum = "6227c01b1783cdfee1bcf844eb44594cd16ec71c35305bf1c9fb5aade2735e16"
+name = "rust-embed-utils"
+checksum = "8cb0a25bfbb2d4b4402179c2cf030387d9990857ce08a32592c6238db9fa8665"
+name = "rust_decimal"
+version = "1.33.1"
+checksum = "06676aec5ccb8fc1da723cc8c0f9a46549f21ebb8753d3915c6c41db1e7f1dc4"
+ "borsh",
+name = "rust_hawktracer"
+checksum = "e3480a29b927f66c6e06527be7f49ef4d291a01d694ec1fe85b0de71d6b02ac1"
+ "rust_hawktracer_normal_macro",
+ "rust_hawktracer_proc_macro",
+name = "rust_hawktracer_normal_macro"
+checksum = "8a570059949e1dcdc6f35228fa389f54c2c84dfe0c94c05022baacd56eacd2e9"
+name = "rust_hawktracer_proc_macro"
+checksum = "cb626abdbed5e93f031baae60d72032f56bc964e11ac2ff65f2ba3ed98d6d3e1"
+name = "rustc-demangle"
+version = "0.1.23"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+name = "rustc-hash"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+name = "rustc_version"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+name = "rustix"
+version = "0.37.27"
+checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
+ "errno",
+ "io-lifetimes",
+ "linux-raw-sys 0.3.8",
+version = "0.38.28"
+checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
+ "linux-raw-sys 0.4.12",
+name = "rustls"
+version = "0.20.9"
+checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
+ "ring 0.16.20",
+ "sct",
+ "webpki",
+version = "0.21.10"
+checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
+ "ring 0.17.7",
+ "rustls-webpki",
+name = "rustls-native-certs"
+checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
+name = "rustls-pemfile"
+checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+name = "rustls-webpki"
+version = "0.101.7"
+checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+name = "rustversion"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+name = "ryu"
+checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+name = "safemem"
+checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
+name = "salvo"
+version = "0.63.1"
+checksum = "adc1aaf77a4c306270cb7b1a6e08a5b12ee14935ac5a5c6b0ce1958d66a72ad9"
+ "salvo-compression",
+ "salvo-serve-static",
+ "salvo_core",
+ "salvo_extra",
+name = "salvo-compression"
+checksum = "c487a736613df6e2ae455bdd3775d86ad9a2a2dcf0cd4067adc9ce08dc9f0d97"
+ "zstd 0.13.0",
+name = "salvo-hello-world"
+name = "salvo-serve-static"
+checksum = "5ef927fe76c5444b3ef6386180ec0f39998e26414dee66e6ce48b91da6f2ef8e"
+ "mime-infer",
+ "path-slash",
+ "rust-embed",
+name = "salvo_core"
+checksum = "c36a49a4227992bb0e27f3c9589e24b2bd8c68a29e2ed42e03f6de6da39faa0f"
+ "cruet",
+ "enumflags2",
+ "headers 0.4.0",
+ "hyper-util",
+ "multer 3.0.0",
+ "multimap",
+ "salvo_macros",
+ "serde-xml-rs",
+name = "salvo_extra"
+checksum = "bcfdffe788f7ae4c79bdeea16db85cd27e473a8d4bef44ba10b9323461f78087"
+ "etag",
+ "tokio-tungstenite 0.21.0",
+ "ulid",
+name = "salvo_macros"
+checksum = "5fa50756ef995d410bb1968b403a1eca169b54c3c0eb4be4bcb1da8c7591cb7d"
+name = "same-file"
+version = "1.0.6"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+name = "sanitize-filename"
+checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603"
+name = "schannel"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+name = "scoped-tls"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+name = "scopeguard"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+name = "scraper"
+version = "0.16.0"
+checksum = "59e25654b5e9fd557a67dbaab5a5d36b8c448d0561beb4c041b6dbb902eddfa6"
+ "cssparser 0.29.6",
+ "ego-tree",
+ "getopts",
+ "selectors 0.24.0",
+name = "sct"
+checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+name = "seahash"
+checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
+name = "sec1"
+checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc"
+name = "security-framework"
+version = "2.9.2"
+checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
+name = "security-framework-sys"
+version = "2.9.1"
+checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
+name = "selectors"
+version = "0.22.0"
+checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
+ "derive_more",
+ "phf_codegen 0.8.0",
+ "servo_arc 0.1.1",
+ "thin-slice",
+checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
+ "servo_arc 0.2.0",
+name = "semver"
+version = "1.0.21"
+checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+name = "separator"
+checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5"
+name = "serde"
+version = "1.0.195"
+checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
+name = "serde-value"
+checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
+ "ordered-float",
+name = "serde-wasm-bindgen"
+checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e"
+name = "serde-xml-rs"
+checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782"
+ "xml-rs",
+name = "serde_cbor"
+checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
+name = "serde_derive"
+checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
+name = "serde_json"
+version = "1.0.111"
+checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4"
+name = "serde_path_to_error"
+checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c"
+name = "serde_plain"
+checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50"
+name = "serde_qs"
+checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c"
+name = "serde_regex"
+checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf"
+name = "serde_repr"
+version = "0.1.18"
+checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
+name = "serde_spanned"
+checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+name = "serde_urlencoded"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+name = "serde_with"
+checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23"
+ "serde_with_macros",
+name = "serde_with_macros"
+checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788"
+name = "server_fn"
+version = "0.5.4"
+checksum = "cfed18dfcc8d9004579c40482c3419c07f60ffb9c5b250542edca99f508b0ce9"
+ "const_format",
+ "gloo-net 0.2.6",
+ "inventory",
+ "serde_qs",
+ "server_fn_macro_default",
+name = "server_fn_macro"
+checksum = "0b70ae8e22546ba85500391b36c08e3fba64871be8a26557a3663a8e08acb56f"
+name = "server_fn_macro_default"
+checksum = "7256ba61dfadb220598db418376e7bc2a34b96df36c4dc48f24ffe161810fc0b"
+name = "servo_arc"
+checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432"
+ "nodrop",
+checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
+name = "sha-1"
+checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c"
+name = "sha1"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+name = "sha1_smol"
+checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+name = "sha2"
+version = "0.10.8"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+name = "sharded-slab"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+name = "shell-words"
+checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
+name = "shipyard"
+checksum = "3511ae730f2e1c3d62a9025e2f9b2acbf130968057f1b3caab6d74a54a5e0e56"
+ "shipyard_proc",
+name = "shipyard_proc"
+checksum = "3eb847f4b9582e468198b5cfb5731b65cc67fe5e535acc9cbf3c11703d15f08c"
+name = "signal-hook"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+name = "signal-hook-mio"
+checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+name = "signal-hook-registry"
+version = "1.4.1"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+name = "signature"
+checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
+name = "simd-abstraction"
+checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987"
+ "outref",
+name = "simd-adler32"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+name = "simd_helpers"
+checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"
+name = "simdutf8"
+checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
+name = "simple_logger"
+version = "4.3.3"
+checksum = "8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1"
+name = "siphasher"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+name = "sized-chunks"
+checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e"
+name = "slab"
+version = "0.4.9"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+name = "sledgehammer_bindgen"
+checksum = "9298e863f0143b89972299110a7fa3e2fc08c412341d588c497bae38409f9e68"
+name = "sledgehammer_utils"
+checksum = "5cd16550f1dd7866c7580dbf80c892dc1bef106737eeb850d42c62ec61896059"
+ "lru 0.8.1",
+name = "slotmap"
+checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
+name = "smallbox"
+checksum = "d92359f97e6b417da4328a970cf04a044db104fbd57f7d72cb7ff665bb8806af"
+name = "smallvec"
+version = "1.11.2"
+checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+name = "smartstring"
+checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
+name = "socket2"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+name = "soup3"
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
+ "soup3-sys",
+name = "soup3-sys"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
+name = "spin"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+name = "spinning"
+checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b"
+name = "spki"
+checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
+name = "sqlformat"
+checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
+ "unicode_categories",
+name = "sqlx"
+checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf"
+ "sqlx-core",
+ "sqlx-macros",
+ "sqlx-mysql",
+ "sqlx-postgres",
+ "sqlx-sqlite",
+name = "sqlx-core"
+checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd"
+ "atoi",
+ "bigdecimal",
+ "bit-vec",
+ "crc",
+ "crossbeam-queue",
+ "dotenvy",
+ "futures-intrusive",
+ "hashlink",
+ "ipnetwork",
+ "mac_address",
+ "rust_decimal",
+ "sqlformat",
+name = "sqlx-macros"
+checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5"
+ "sqlx-macros-core",
+name = "sqlx-macros-core"
+checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841"
+ "atomic-write-file",
+name = "sqlx-mysql"
+checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
+ "md-5",
+ "stringprep",
+ "whoami",
+name = "sqlx-postgres"
+checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
+ "etcetera",
+name = "sqlx-sqlite"
+checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490"
+ "libsqlite3-sys",
+name = "stable-pattern"
+checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045"
+name = "stable_deref_trait"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+name = "state"
+checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
+ "loom",
+name = "static-hydrated"
+name = "static_assertions"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+name = "str-buf"
+checksum = "e75b72ee54e2f93c3ea1354066162be893ee5e25773ab743de3e088cecbb4f31"
+name = "string_cache"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+name = "string_cache_codegen"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+name = "stringprep"
+checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6"
+ "finl_unicode",
+name = "strsim"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+name = "strum"
+checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
+ "strum_macros",
+name = "strum_macros"
+version = "0.25.3"
+checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
+name = "subprocess"
+checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086"
+name = "subtle"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+name = "supports-color"
+checksum = "8ba6faf2ca7ee42fdd458f4347ae0a9bd6bcc445ad7cb57ad82b383f18870d6f"
+ "is_ci",
+name = "syn"
+version = "1.0.109"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+version = "2.0.48"
+checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+name = "syn_derive"
+checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
+name = "sync_wrapper"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+name = "system-configuration"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+ "system-configuration-sys",
+name = "system-configuration-sys"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+name = "system-deps"
+version = "6.2.0"
+checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331"
+ "cfg-expr 0.15.6",
+ "version-compare",
+name = "taffy"
+version = "0.3.18"
+checksum = "3c2287b6d7f721ada4cddf61ade5e760b2c6207df041cac9bfaa192897362fd3"
+ "grid",
+ "slotmap",
+name = "tao"
+checksum = "3c0dff18fed076d29cb5779e918ef4b8a5dbb756204e4a027794f0bce233d949"
+ "gdkwayland-sys",
+ "jni",
+ "ndk",
+ "ndk-context",
+ "raw-window-handle 0.6.0",
+ "tao-macros",
+ "windows-implement",
+ "windows-version",
+ "zbus",
+name = "tao-macros"
+checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2"
+name = "tap"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+name = "tar"
+version = "0.4.40"
+checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+ "xattr",
+name = "target-lexicon"
+version = "0.12.13"
+checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae"
+name = "tauri-bundler"
+checksum = "4c08935ca08f698ea9fc1038322b95f0a2834a7864d7e6ef62ba619ae5b51876"
+ "ar",
+ "dirs-next",
+ "handlebars",
+ "libflate",
+ "md5",
+ "os_pipe",
+ "plist",
+ "tauri-icns",
+ "ureq",
+name = "tauri-icns"
+checksum = "03b7eb4d0d43724ba9ba6a6717420ee68aee377816a3edbb45db8c18862b1431"
+name = "tauri-utils"
+version = "1.5.2"
+checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db"
+ "ctor",
+ "infer 0.13.0",
+ "json-patch",
+ "kuchikiki",
+name = "tempfile"
+version = "3.8.1"
+checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+name = "tendril"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+ "futf",
+ "utf-8",
+name = "termcolor"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+name = "terminal-prompt"
+checksum = "572818b3472910acbd5dff46a3413715c18e934b071ab2ba464a7b2c2af16376"
+name = "textwrap"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+name = "thin-slice"
+checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
+name = "thiserror"
+version = "1.0.56"
+checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+ "thiserror-impl",
+name = "thiserror-impl"
+checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+name = "thread_local"
+version = "1.1.7"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+name = "tiff"
+checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
+name = "time"
+version = "0.3.31"
+checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
+ "deranged",
+ "num_threads",
+ "time-core",
+ "time-macros",
+name = "time-core"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+name = "time-macros"
+checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
+name = "tiny-keccak"
+version = "2.0.2"
+checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
+name = "tinytemplate"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+name = "tinyvec"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+ "tinyvec_macros",
+name = "tinyvec_macros"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+name = "to_method"
+checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8"
+name = "tokio"
+version = "1.35.1"
+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+ "backtrace",
+ "tokio-macros",
+name = "tokio-macros"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+name = "tokio-native-tls"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+name = "tokio-rustls"
+version = "0.23.4"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+version = "0.24.1"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+name = "tokio-stream"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+name = "tokio-tungstenite"
+version = "0.17.2"
+checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181"
+ "tungstenite 0.17.3",
+version = "0.20.1"
+checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
+ "tungstenite 0.20.1",
+checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38"
+ "tungstenite 0.21.0",
+name = "tokio-util"
+version = "0.7.10"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+name = "toml"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+ "serde_spanned",
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+name = "toml_datetime"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+name = "toml_edit"
+version = "0.19.15"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+version = "0.20.2"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+name = "tower"
+version = "0.4.13"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+name = "tower-http"
+checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
+ "async-compression 0.3.15",
+ "http-range-header",
+ "iri-string",
+ "mime_guess",
+checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
+checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+ "async-compression 0.4.5",
+name = "tower-layer"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+name = "tower-service"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+name = "tracing"
+version = "0.1.40"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+ "tracing-attributes",
+ "tracing-core",
+name = "tracing-attributes"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+name = "tracing-core"
+version = "0.1.32"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+ "valuable",
+name = "tracing-futures"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+name = "tracing-log"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+name = "tracing-subscriber"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+ "matchers",
+ "nu-ansi-term",
+ "sharded-slab",
+ "tracing-log",
+name = "tracing-wasm"
+checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
+name = "treediff"
+version = "4.0.2"
+checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303"
+name = "trust-dns-proto"
+checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374"
+ "enum-as-inner",
+ "idna 0.4.0",
+name = "trust-dns-resolver"
+checksum = "10a3e6c3aff1718b3c73e395d1f35202ba2ffa847c6a62eea0db8fb4cfe30be6"
+ "ipconfig",
+ "lru-cache",
+ "resolv-conf",
+ "trust-dns-proto",
+name = "try-lock"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+name = "trybuild"
+version = "1.0.88"
+checksum = "76de4f783e610194f6c98bfd53f9fc52bb2e0d02c947621e8a0f4ecc799b2880"
+ "basic-toml",
+ "dissimilar",
+name = "tungstenite"
+version = "0.17.3"
+checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0"
+checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
+checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1"
+name = "typenum"
+version = "1.17.0"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+name = "ubyte"
+checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea"
+name = "ucd-trie"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+name = "uds_windows"
+checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
+name = "ulid"
+checksum = "7e37c4b6cbcc59a8dcd09a6429fbc7890286bcbb79215cea7b38a3c4c0921d93"
+name = "uncased"
+checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68"
+name = "unicase"
+version = "2.7.0"
+checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
+name = "unicode-bidi"
+checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
+name = "unicode-bom"
+version = "2.0.3"
+checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217"
+name = "unicode-ident"
+version = "1.0.12"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+name = "unicode-normalization"
+version = "0.1.22"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+name = "unicode-segmentation"
+version = "1.10.1"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+name = "unicode-width"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+name = "unicode-xid"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+name = "unicode_categories"
+checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+name = "universal-hash"
+checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
+name = "untrusted"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+name = "ureq"
+checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97"
+name = "url"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+ "idna 0.5.0",
+name = "urlencoding"
+version = "2.1.3"
+checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
+name = "utf-8"
+version = "0.7.6"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+name = "utf8parse"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+name = "uuid"
+version = "1.6.1"
+checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
+name = "v_frame"
+checksum = "c372e4e6fad129795fb86fda6021b258948560b39883b80ed00510a7d19846b0"
+name = "valuable"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+name = "value-bag"
+checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503"
+name = "vcpkg"
+version = "0.2.15"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+name = "version-compare"
+checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
+name = "version_check"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+name = "vlq"
+checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff"
+name = "waker-fn"
+checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690"
+name = "walkdir"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+name = "walrus"
+checksum = "2c03529cd0c4400a2449f640d2f27cd1b48c3065226d15e26d98e4429ab0adb7"
+ "gimli 0.26.2",
+ "id-arena",
+ "leb128",
+ "walrus-macro",
+ "wasm-encoder",
+ "wasmparser",
+name = "walrus-macro"
+version = "0.19.0"
+checksum = "0a6e5bd22c71e77d60140b0bd5be56155a37e5bd14e24f5f87298040d0cc40d7"
+ "heck 0.3.3",
+name = "want"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+ "try-lock",
+name = "warp"
+checksum = "c1e92e22e03ff1230c03a1a8ee37d2f89cd489e2e541b7550d6afad96faed169"
+name = "warp-hello-world"
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+version = "0.11.0+wasi-snapshot-preview1"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+name = "wasm-bindgen"
+version = "0.2.89"
+checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e"
+ "wasm-bindgen-macro",
+name = "wasm-bindgen-backend"
+checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826"
+ "wasm-bindgen-shared",
+name = "wasm-bindgen-cli-support"
+checksum = "cf8226e223e2dfbe8f921b7f20b82d1b5d86a6b143e9d6286cca8edd16695583"
+ "base64 0.9.3",
+ "walrus",
+ "wasm-bindgen-externref-xform",
+ "wasm-bindgen-multi-value-xform",
+ "wasm-bindgen-threads-xform",
+ "wasm-bindgen-wasm-conventions",
+ "wasm-bindgen-wasm-interpreter",
+name = "wasm-bindgen-externref-xform"
+checksum = "b8a719be856d8b0802c7195ca26ee6eb02cb9639a12b80be32db960ce9640cb8"
+name = "wasm-bindgen-futures"
+version = "0.4.39"
+checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12"
+name = "wasm-bindgen-macro"
+checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2"
+ "wasm-bindgen-macro-support",
+name = "wasm-bindgen-macro-support"
+checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
+ "wasm-bindgen-backend",
+name = "wasm-bindgen-multi-value-xform"
+checksum = "a12766255d4b9026700376cc81894eeb62903e4414cbc94675f6f9babd9cfb76"
+name = "wasm-bindgen-shared"
+checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f"
+name = "wasm-bindgen-test"
+version = "0.3.39"
+checksum = "2cf9242c0d27999b831eae4767b2a146feb0b27d332d553e605864acd2afd403"
+ "wasm-bindgen-test-macro",
+name = "wasm-bindgen-test-macro"
+checksum = "794645f5408c9a039fd09f4d113cdfb2e7eba5ff1956b07bcf701cf4b394fe89"
+name = "wasm-bindgen-threads-xform"
+checksum = "13c2b14c5b9c2c7aa9dd1eb7161857de9783f40e98582e7f41f2d7c04ffdc155"
+name = "wasm-bindgen-wasm-conventions"
+checksum = "aaedf88769cb23c6fd2e3bfed65bcbff6c5d92c8336afbd80d2dfcc8eb5cf047"
+name = "wasm-bindgen-wasm-interpreter"
+checksum = "a8a79039df1e0822e6d66508ec86052993deac201e26060f62abcd85e1daf951"
+name = "wasm-encoder"
+version = "0.29.0"
+checksum = "18c41dbd92eaebf3612a39be316540b8377c871cb9bde6b064af962984912881"
+name = "wasm-logger"
+checksum = "074649a66bb306c8f2068c9016395fa65d8e08d2affcbf95acf3c24c3ab19718"
+name = "wasm-streams"
+checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
+name = "wasmparser"
+version = "0.80.2"
+checksum = "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b"
+name = "web-sys"
+checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f"
+name = "webbrowser"
+version = "0.8.12"
+checksum = "82b2391658b02c27719fc5a0a73d6e696285138e8b12fba9d4baa70451023c71"
+name = "webkit2gtk"
+checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a"
+ "javascriptcore-rs",
+ "soup3",
+ "webkit2gtk-sys",
+name = "webkit2gtk-sys"
+checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c"
+name = "webp"
+checksum = "4bb5d8e7814e92297b0e1c773ce43d290bef6c17452dafd9fc49e5edb5beba71"
+ "libwebp-sys",
+name = "webpki"
+version = "0.22.4"
+checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53"
+name = "webpki-roots"
+checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
+name = "webview2-com"
+version = "0.28.0"
+checksum = "e0ae9c7e420783826cf769d2c06ac9ba462f450eca5893bb8c6c6529a4e5dd33"
+ "webview2-com-macros",
+ "webview2-com-sys",
+ "windows-interface",
+name = "webview2-com-macros"
+checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc"
+name = "webview2-com-sys"
+checksum = "d6ad85fceee6c42fa3d61239eba5a11401bf38407a849ed5ea1b407df08cca72"
+name = "weezl"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+name = "which"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+name = "whoami"
+checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50"
+name = "widestring"
+checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+name = "winapi"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+name = "winapi-i686-pc-windows-gnu"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+name = "winapi-util"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+name = "winapi-x86_64-pc-windows-gnu"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+name = "windows"
+version = "0.48.0"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+version = "0.52.0"
+checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
+ "windows-targets 0.52.0",
+name = "windows-core"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+name = "windows-implement"
+checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946"
+name = "windows-interface"
+checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1"
+name = "windows-sys"
+version = "0.45.0"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+ "windows-targets 0.42.2",
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+name = "windows-targets"
+version = "0.42.2"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+version = "0.48.5"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
+name = "windows-version"
+checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4"
+name = "windows_aarch64_gnullvm"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+name = "windows_aarch64_msvc"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+name = "windows_i686_gnu"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+name = "windows_i686_msvc"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+name = "windows_x86_64_gnu"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+name = "windows_x86_64_gnullvm"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+name = "windows_x86_64_msvc"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+name = "winnow"
+version = "0.5.34"
+checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16"
+name = "winreg"
+version = "0.50.0"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+name = "wry"
+version = "0.35.2"
+checksum = "d3016c47c9b6f7029a9da7cd48af8352327226bba0e955f3c92e2966651365a9"
+ "gdkx11",
+ "webkit2gtk",
+ "webview2-com",
+name = "wyz"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+name = "x11"
+version = "2.21.0"
+checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
+name = "x11-dl"
+checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
+name = "xattr"
+checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1"
+name = "xdg-home"
+checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd"
+name = "xml-rs"
+checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
+name = "xxhash-rust"
+version = "0.8.8"
+checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61"
+name = "yansi"
+checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+version = "1.0.0-rc.1"
+checksum = "1367295b8f788d371ce2dbc842c7b709c73ee1364d30351dd300ec2203b12377"
+name = "zbus"
+version = "3.14.1"
+checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
+ "async-broadcast",
+ "async-executor",
+ "async-fs",
+ "async-process",
+ "derivative",
+ "ordered-stream",
+ "uds_windows",
+ "xdg-home",
+ "zbus_macros",
+ "zbus_names",
+ "zvariant",
+name = "zbus_macros"
+checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d"
+ "zvariant_utils",
+name = "zbus_names"
+version = "2.6.0"
+checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9"
+name = "zerocopy"
+version = "0.7.32"
+checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+ "zerocopy-derive",
+name = "zerocopy-derive"
+checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+name = "zeroize"
+version = "1.7.0"
+checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+name = "zip"
+checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
+ "bzip2",
+ "constant_time_eq",
+ "pbkdf2",
+ "zstd 0.11.2+zstd.1.5.2",
+name = "zstd"
+version = "0.11.2+zstd.1.5.2"
+checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
+ "zstd-safe 5.0.2+zstd.1.5.2",
+checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"
+ "zstd-safe 7.0.0",
+name = "zstd-safe"
+version = "5.0.2+zstd.1.5.2"
+checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
+ "zstd-sys",
+version = "7.0.0"
+checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"
+name = "zstd-sys"
+version = "2.0.9+zstd.1.5.5"
+checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"
+name = "zune-inflate"
+version = "0.2.54"
+checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
+name = "zvariant"
+version = "3.15.0"
+checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c"
+ "zvariant_derive",
+name = "zvariant_derive"
+checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd"
+name = "zvariant_utils"
+checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200"
@@ -4,11 +4,13 @@ members = [
"packages/dioxus",
"packages/core",
"packages/cli",
+ "packages/cli-config",
"packages/core-macro",
"packages/router-macro",
"packages/extension",
"packages/router",
"packages/html",
+ "packages/html-internal-macro",
"packages/hooks",
"packages/web",
"packages/ssr",
@@ -60,6 +62,7 @@ dioxus-core-macro = { path = "packages/core-macro", version = "0.4.0" }
dioxus-router = { path = "packages/router", version = "0.4.1" }
dioxus-router-macro = { path = "packages/router-macro", version = "0.4.1" }
dioxus-html = { path = "packages/html", default-features = false, version = "0.4.0" }
+dioxus-html-internal-macro = { path = "packages/html-internal-macro", version = "0.4.0" }
dioxus-hooks = { path = "packages/hooks", version = "0.4.0" }
dioxus-web = { path = "packages/web", version = "0.4.0" }
dioxus-ssr = { path = "packages/ssr", version = "0.4.0" }
@@ -77,6 +80,7 @@ dioxus-native-core = { path = "packages/native-core", version = "0.4.0" }
dioxus-native-core-macro = { path = "packages/native-core-macro", version = "0.4.0" }
rsx-rosetta = { path = "packages/rsx-rosetta", version = "0.4.0" }
dioxus-signals = { path = "packages/signals" }
+dioxus-cli-config = { path = "packages/cli-config", version = "0.4.1" }
generational-box = { path = "packages/generational-box", version = "0.4.3" }
dioxus-hot-reload = { path = "packages/hot-reload", version = "0.4.0" }
dioxus-fullstack = { path = "packages/fullstack", version = "0.4.1" }
@@ -94,6 +98,11 @@ thiserror = "1.0.40"
prettyplease = { package = "prettier-please", version = "0.2", features = [
"verbatim",
] }
+manganis-cli-support = { git = "https://github.com/DioxusLabs/collect-assets", rev = "e0093a4", features = [
+ "html",
+] }
+manganis = { git = "https://github.com/DioxusLabs/collect-assets", rev = "e0093a4" }
# This is a "virtual package"
# It is not meant to be published, but is used so "cargo run --example XYZ" works properly
@@ -129,12 +138,10 @@ serde_json = "1.0.79"
rand = { version = "0.8.4", features = ["small_rng"] }
tokio = { version = "1.16.1", features = ["full"] }
reqwest = { version = "0.11.9", features = ["json"] }
-fern = { version = "0.6.0", features = ["colored"] }
env_logger = "0.10.0"
simple_logger = "4.0.0"
thiserror = { workspace = true }
-[dependencies]
+manganis = { workspace = true }
tracing-subscriber = "0.3.17"
http-range = "0.1.5"
@@ -105,6 +105,8 @@ args = [
"dioxus-router",
"--exclude",
"dioxus-desktop",
+ "--exclude",
+ "dioxus-mobile",
]
private = true
@@ -139,7 +139,6 @@ Missing Features
Missing examples
- Shared state
- Root-less element groups
-- Spread props
- Custom elements
- Component Children: Pass children into child components
- Render To string: Render a mounted virtualdom to a string
@@ -76,7 +76,11 @@ fn app(cx: Scope) -> Element {
"Hover, click, type or scroll to see the info down below"
}
- div { events.read().iter().map(|event| rsx!( div { "{event:?}" } )) }
+ div {
+ for event in events.read().iter() {
+ div { "{event:?}" }
))
@@ -6,13 +6,13 @@ This calculator version uses React-style state management. All state is held as
use dioxus::events::*;
use dioxus::html::input_data::keyboard_types::Key;
use dioxus::prelude::*;
-use dioxus_desktop::{Config, WindowBuilder};
+use dioxus_desktop::{Config, LogicalSize, WindowBuilder};
fn main() {
let config = Config::new().with_window(
WindowBuilder::default()
.with_title("Calculator")
- .with_inner_size(dioxus_desktop::LogicalSize::new(300.0, 500.0)),
+ .with_inner_size(LogicalSize::new(300.0, 500.0)),
);
dioxus_desktop::launch_cfg(app, config);
@@ -58,13 +58,13 @@ fn app(cx: Scope) -> Element {
};
cx.render(rsx!(
- style { include_str!("./assets/calculator.css") }
+ style { {include_str!("./assets/calculator.css")} }
div { id: "wrapper",
div { class: "app",
div { class: "calculator",
tabindex: "0",
onkeydown: handle_key_down_event,
- div { class: "calculator-display", val.to_string() }
+ div { class: "calculator-display", "{val}" }
div { class: "calculator-keypad",
div { class: "input-keys",
div { class: "function-keys",
@@ -103,14 +103,14 @@ fn app(cx: Scope) -> Element {
div { class: "digit-keys",
button { class: "calculator-key key-0", onclick: move |_| input_digit(0), "0" }
button { class: "calculator-key key-dot", onclick: move |_| val.make_mut().push('.'), "●" }
- (1..10).map(|k| rsx!{
+ for k in 1..10 {
button {
class: "calculator-key {k}",
name: "key-{k}",
onclick: move |_| input_digit(k),
"{k}"
- }),
div { class: "operator-keys",
@@ -10,7 +10,7 @@ fn app(cx: Scope) -> Element {
use_future!(cx, || async move {
loop {
- tokio::time::sleep(std::time::Duration::from_millis(100)).await;
+ tokio::time::sleep(std::time::Duration::from_millis(10)).await;
count += 1;
println!("current: {count}");
@@ -32,12 +32,12 @@ fn app(cx: Scope) -> Element {
ul {
- emails_sent.read().iter().map(|message| cx.render(rsx! {
+ for message in emails_sent.read().iter() {
li {
h3 { "email" }
span {"{message}"}
- }))
})
@@ -15,8 +15,8 @@ fn app(cx: Scope) -> Element {
if *running.current() {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
- if let Some(element) = elements.read().get(focused) {
- element.set_focus(true);
+ if let Some(element) = elements.with(|f| f.get(focused).cloned()) {
+ _ = element.set_focus(true).await;
} else {
focused = 0;
@@ -62,7 +62,7 @@ fn ClientList(cx: Scope) -> Element {
Link { to: Route::ClientAdd {}, class: "pure-button pure-button-primary", "Add Client" }
Link { to: Route::Settings {}, class: "pure-button", "Settings" }
- clients.read().iter().map(|client| rsx! {
+ for client in clients.read().iter() {
div {
class: "client",
style: "margin-bottom: 50px",
@@ -70,7 +70,7 @@ fn ClientList(cx: Scope) -> Element {
p { "Name: {client.first_name} {client.last_name}" }
p { "Description: {client.description}" }
- })
p {
"This should show an image:"
- img { src: mg!(image("examples/assets/logo.png").format(ImageType::Avif)).to_string() }
+ img { src: manganis::mg!(image("examples/assets/logo.png").format(ImageType::Avif)).to_string() }
@@ -14,9 +14,9 @@ fn app(cx: Scope) -> Element {
render! {
- (0..count).map(|_| rsx!{
+ for _ in 0..count {
drop_child {}
@@ -1,29 +1,25 @@
-use dioxus_desktop::wry::http::Response;
-use dioxus_desktop::{use_asset_handler, AssetRequest};
-use std::path::Path;
+use dioxus_desktop::{use_asset_handler, wry::http::Response};
dioxus_desktop::launch(app);
fn app(cx: Scope) -> Element {
- use_asset_handler(cx, |request: &AssetRequest| {
- let path = request.path().to_path_buf();
- async move {
- if path != Path::new("logo.png") {
- return None;
- }
- let image_data: &[u8] = include_bytes!("./assets/logo.png");
- Some(Response::new(image_data.into()))
+ use_asset_handler(cx, "logos", |request, response| {
+ // Note that the "logos" prefix is stripped from the URI
+ //
+ // However, the asset is absolute to its "virtual folder" - meaning it starts with a leading slash
+ if request.uri().path() != "/logo.png" {
+ return;
+ response.respond(Response::new(include_bytes!("./assets/logo.png").to_vec()));
});
- cx.render(rsx! {
+ render! {
- img {
- src: "logo.png"
+ img { src: "/logos/logo.png" }
@@ -22,9 +22,7 @@ fn DemoC(cx: Scope, x: i32) -> Element {
result.throw()?;
- h1 {
- "{x}"
+ h1 { "{x}" }
@@ -39,9 +39,9 @@ fn ChildWithRef(cx: Scope) -> Element {
cx.render(rsx! {
- names.read().iter().map(|f| rsx!{
- li { "hello: {f}" }
+ for name in names.read().iter() {
+ li { "hello: {name}" }
onclick: move |_| {
@@ -18,7 +18,7 @@ fn main() {
-const _STYLE: &str = mg!(file("./examples/assets/fileexplorer.css"));
+const _STYLE: &str = manganis::mg!(file("./examples/assets/fileexplorer.css"));
let files = use_ref(cx, Files::new);
@@ -28,39 +28,36 @@ fn app(cx: Scope) -> Element {
link { href:"https://fonts.googleapis.com/icon?family=Material+Icons", rel:"stylesheet", }
header {
i { class: "material-icons icon-menu", "menu" }
- h1 { "Files: ", files.read().current() }
+ h1 { "Files: ", {files.read().current()} }
span { }
i { class: "material-icons", onclick: move |_| files.write().go_up(), "logout" }
main {
- files.read().path_names.iter().enumerate().map(|(dir_id, path)| {
+ {files.read().path_names.iter().enumerate().map(|(dir_id, path)| {
let path_end = path.split('/').last().unwrap_or(path.as_str());
- let icon_type = if path_end.contains('.') {
- "description"
- } else {
- "folder"
- };
rsx! (
class: "folder",
key: "{path}",
i { class: "material-icons",
onclick: move |_| files.write().enter_dir(dir_id),
- "{icon_type}"
+ if path_end.contains('.') {
+ "description"
+ } else {
+ "folder"
p { class: "cooltip", "0 folders / 0 files" }
h1 { "{path_end}" }
)
- files.read().err.as_ref().map(|err| {
- rsx! (
- div {
- code { "{err}" }
- button { onclick: move |_| files.write().clear_err(), "x" }
- )
+ })},
+ if let Some(err) = files.read().err.as_ref() {
+ code { "{err}" }
+ button { onclick: move |_| files.write().clear_err(), "x" }
@@ -1,4 +1,5 @@
#![allow(non_snake_case)]
+use dioxus::html::HasFileData;
use tokio::time::sleep;
@@ -39,9 +40,30 @@ fn App(cx: Scope) -> Element {
},
- },
- div { "progress: {files_uploaded.read().len()}" },
+ width: "100px",
+ height: "100px",
+ border: "1px solid black",
+ prevent_default: "ondrop dragover dragenter",
+ ondrop: move |evt| {
+ to_owned![files_uploaded];
+ async move {
+ if let Some(file_engine) = &evt.files() {
+ let files = file_engine.files();
+ for file_name in &files {
+ if let Some(file) = file_engine.read_file_to_string(file_name).await{
+ files_uploaded.write().push(file);
+ },
+ ondragover: move |event: DragEvent| {
+ event.stop_propagation();
+ "Drop files here"
for file in files_uploaded.read().iter() {
@@ -66,9 +66,9 @@ fn app(cx: Scope) -> Element {
table {
tbody {
- items.read().iter().enumerate().map(|(id, item)| {
- let is_in_danger = if (*selected).map(|s| s == id).unwrap_or(false) {"danger"} else {""};
- rsx!(tr { class: "{is_in_danger}",
+ for (id, item) in items.read().iter().enumerate() {
+ tr {
+ class: if (*selected).map(|s| s == id).unwrap_or(false) { "danger" },
td { class:"col-md-1" }
td { class:"col-md-1", "{item.key}" }
td { class:"col-md-1", onclick: move |_| selected.set(Some(id)),
@@ -80,8 +80,9 @@ fn app(cx: Scope) -> Element {
td { class: "col-md-6" }
span { class: "preloadicon glyphicon glyphicon-remove", aria_hidden: "true" }
@@ -7,9 +7,9 @@ fn main() {
- cx.render(rsx! { generic_child {
- data: 0i32
- } })
+ generic_child { data: 0 }
#[derive(PartialEq, Props)]
@@ -18,9 +18,7 @@ struct GenericChildProps<T: Display + PartialEq> {
fn generic_child<T: Display + PartialEq>(cx: Scope<GenericChildProps<T>>) -> Element {
- let data = &cx.props.data;
- cx.render(rsx! { div {
- "{data}"
+ div { "{&cx.props.data}" }
@@ -5,7 +5,7 @@ fn main() {
- cx.render(rsx! (
div { "Hello, world!" }
- ))
@@ -37,7 +37,7 @@ const FIELDS: &[(&str, &str)] = &[
div { margin_left: "30px",
- select_example(cx),
+ {select_example(cx)},
// handling inputs on divs will catch all input events below
// so the value of our input event will be either huey, dewey, louie, or true/false (because of the checkboxe)
@@ -114,7 +114,7 @@ fn app(cx: Scope) -> Element {
- FIELDS.iter().map(|(field, value)| rsx! {
+ for (field, value) in FIELDS.iter() {
input {
id: "{field}",
@@ -131,7 +131,7 @@ fn app(cx: Scope) -> Element {
br {}
@@ -0,0 +1,3240 @@
+checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3"
+ "gimli",
+checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+name = "android_log-sys"
+checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
+name = "android_logger"
+checksum = "2ec2333c185d826313162cee39d3fcc6a84ba08114a839bebf53b961e7e75773"
+ "android_log-sys",
+ "env_logger 0.7.1",
+version = "1.0.72"
+checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854"
+ "event-listener",
+ "async-lock",
+ "futures-lite",
+ "polling",
+ "rustix",
+ "socket2",
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+version = "4.4.0"
+checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
+version = "0.1.72"
+checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09"
+ "syn 2.0.28",
+checksum = "39991bc421ddf72f70159011b323ff49b0f783cc676a7287c59453da2e2531cf"
+ "bitflags",
+checksum = "11ad703eb64dc058024f0e57ccfa069e15a413b98dbd50a1a950e743b7f11148"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+version = "0.3.68"
+checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12"
+ "generic-array",
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+ "async-channel",
+ "fastrand",
+version = "3.13.0"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+version = "1.13.1"
+checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
+version = "1.4.3"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+version = "0.16.7"
+checksum = "f3125b15ec28b84c238f6f476c6034016a5f6cc0221cb514ca46c532139fc97d"
+checksum = "7c48f4af05fabdcfa9658178e1326efa061853f040ce7d72e33af6885196f421"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9"
+checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
+ "foreign-types",
+checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6"
+checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+version = "0.22.3"
+checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
+checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33"
+checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+version = "0.5.8"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+version = "0.8.16"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+ "phf",
+name = "debug-cell"
+source = "git+https://github.com/Niedzwiedzw/debug-cell?rev=3352a1f8aff19f56f5e3b2018200a3338fd43d2e#3352a1f8aff19f56f5e3b2018200a3338fd43d2e"
+ "convert_case",
+ "infer",
+ "debug-cell",
+version = "0.0.3"
+checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb"
+checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
+checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f"
+ "errno-dragonfly",
+name = "errno-dragonfly"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10"
+ "memoffset",
+version = "1.0.26"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+ "foreign-types-shared",
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+version = "0.16.2"
+checksum = "aa9cb33da481c6c040404a11f8212d193889e9b435db2c14fd86987f630d3ce1"
+checksum = "c3578c60dee9d029ad86593ed88cb40f35c1b83360e12498d055022385dd9a05"
+checksum = "3092cf797a5f1210479ea38070d9ae8a5b8e9f8f1be9f32f4643c529c7d70016"
+checksum = "d76354f97a913e55b984759a997b693aa7dc71068c9e98bcce51aa167a0a5c5a"
+checksum = "4511710212ed3020b61a8622a37aa6f0dd2a84516575da92e9b96928dcbe83ba"
+checksum = "9fa2bf8b5b8c414bc5d05e48b271896d0fd3ddb57464a3108438082da61de6af"
+version = "0.2.10"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+version = "0.27.3"
+checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
+checksum = "2a1c84b4534a290a29160ef5c6eff2a9c95833111472e824fc5cb78b513dd092"
+checksum = "e9b693b8e39d042a95547fc258a7b07349b1f0b48f4b2fa3108ba3c51c0b5229"
+checksum = "16aa2475c9debed5a32832cb5ff2af5a3f9e1ab9e69df58eaadc1ab2004d6eba"
+version = "0.16.8"
+checksum = "fb1a9325847aa46f1e96ffea37611b9d51fc4827e67f79e7de502a297560a67b"
+ "heck",
+ "proc-macro-crate",
+checksum = "c61a4f46316d06bfa33a7ac22df6f0524c8be58e3db2d9ca99ccb1f357b62a65"
+checksum = "3520bb9c07ae2a12c7f2fbb24d4efc11231c8146a86956413fb1a79bb760a0f1"
+checksum = "e4d3507d43908c866c805f74c9dd593c0ce7ba5c38e576e41846639cdcd4bee6"
+checksum = "89b5f8946685d5fe44497007786600c2f368ff6b1e61a16251c89f72a97520a3"
+checksum = "096eb63c6fedf03bafe65e5924595785eaf1bcb7200dac0f2cbe9c9738f05ad8"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+version = "0.25.2"
+checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+ "itoa 1.0.9",
+version = "0.24.6"
+checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a"
+checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+ "hashbrown",
+ "hermit-abi 0.3.2",
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "110b9902c80c12bf113c432d0b71c7a94490b294a8234f326fd0abca2fac0b00"
+checksum = "98a216519a52cd941a733a0ad3f1023cfdb1cd47f3955e8e863ed56f558f916c"
+checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
+checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c"
+version = "0.3.64"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68"
+name = "kuchiki"
+checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358"
+ "cssparser",
+ "selectors",
+version = "0.2.147"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+version = "0.4.19"
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd"
+ "phf_codegen",
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+name = "mobile-demo"
+ "android_logger",
+ "env_logger 0.9.3",
+ "jni 0.19.0",
+checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
+checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97"
+checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+version = "0.31.1"
+checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
+version = "1.18.0"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+version = "2.10.0"
+checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87"
+version = "0.16.5"
+checksum = "cdff66b271861037b89d028656184059e03b0b6ccb36003820be19f7200b1e94"
+checksum = "9e134909a9a293e04d2cc31928aa95679c5e4df954d0b85483159bd20d8f047f"
+checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+ "windows-targets 0.48.1",
+version = "2.3.0"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+ "phf_macros",
+checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57"
+version = "0.3.27"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+version = "0.17.9"
+checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11"
+ "toml_edit",
+version = "1.0.66"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+version = "1.0.32"
+checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
+ "getrandom 0.2.10",
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+version = "1.9.1"
+checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575"
+ "aho-corasick",
+ "regex-automata",
+ "regex-syntax",
+checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294"
+checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
+checksum = "4fe664af397d2b6a13a8ba1d172a2b5c87c6c5149039edbf8fa122b98c9ed96f"
+ "async-io",
+ "raw-window-handle",
+ "windows",
+version = "0.37.23"
+checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06"
+ "linux-raw-sys",
+version = "1.0.15"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+ "servo_arc",
+version = "1.0.18"
+checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
+version = "1.0.180"
+checksum = "0ea67f183f058fe88a4e3ec6e2788e003840893b91bac4559cabedd00863b3ed"
+checksum = "24e744d7782b686ab3b73267ef05697159cc0e5abbed3f47f9933165e5219036"
+version = "1.0.104"
+checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c"
+checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00"
+checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
+checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
+version = "0.3.10"
+checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+checksum = "4679d6eef28b85020158619fc09769de89e90886c5de7157587d87cb72648faa"
+version = "1.11.0"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+checksum = "82bc46048125fefd69d30b32b9d263d6556c9ffe82a7a7df181a86d912da5616"
+checksum = "014bbeb1c4cdb30739dc181e8d98b7908f124d9555843afa89b5570aaf4ec62b"
+version = "2.0.28"
+checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
+version = "6.1.1"
+checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3"
+ "cfg-expr",
+ "toml",
+version = "0.19.1"
+checksum = "746ae5d0ca57ae275a792f109f6e992e0b41a443abdf3f5c6eff179ef5b3443a"
+ "jni 0.20.0",
+checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445"
+version = "0.12.11"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+version = "1.0.44"
+checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90"
+checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96"
+version = "1.29.1"
+checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542"
+version = "0.19.14"
+checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a"
+ "indexmap",
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+version = "0.3.13"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
+ "idna",
+checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+version = "2.3.3"
+checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+version = "0.2.87"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+version = "0.4.37"
+checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+checksum = "fd222aa310eb7532e3fd427a5d7db7e44bc0b0cf1c1e21139c345325511a85b6"
+ "jni 0.21.1",
+version = "0.19.2"
+checksum = "d8eea819afe15eb8dcdff4f19d8bfda540bae84d874c10e6f4b8faf2d6704bd1"
+checksum = "d0ac7a95ddd3fdfcaf83d8e513b4b1ad101b95b413b6aa6662ed95f284fc3d5b"
+version = "0.22.1"
+checksum = "11296e5daf3a653b79bf47d66c380e4143d5b9c975818871179a3bda79499562"
+checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac"
+checksum = "cde542bed28058a5b028d459689ee57f1d06685bb6c266da3b91b1be6703952f"
+ "windows-bindgen",
+ "windows-metadata",
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+version = "0.44.0"
+checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
+name = "windows-bindgen"
+checksum = "222204ecf46521382a4d88b4a1bbefca9f8855697b4ab7d20803901425e061a3"
+ "windows-tokens",
+checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6"
+checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f"
+name = "windows-metadata"
+checksum = "ee78911e3f4ce32c1ad9d3c7b0bd95389662ad8d8f1a3155688fed70bd96e2b6"
+version = "0.48.1"
+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+name = "windows-tokens"
+checksum = "fa4251900975a0d10841c5d4bde79c56681543367ef811f3fabb8d1803b0959b"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+checksum = "8bd122eb777186e60c3fdf765a58ac76e41c582f1f535fbf3314434c6b58f3f7"
+version = "0.28.3"
+checksum = "7d15f9f827d537cefe6d047be3930f5d89b238dfb85e08ba6a319153217635aa"
+ "base64",
+ "http",
+ "kuchiki",
@@ -35,7 +35,7 @@ frameworks = ["WebKit"]
[dependencies]
anyhow = "1.0.56"
log = "0.4.11"
-wry = "0.34.0"
+wry = "0.35.0"
dioxus = { path = "../../packages/dioxus" }
dioxus-desktop = { path = "../../packages/desktop", features = [
"tokio_runtime",
@@ -41,7 +41,7 @@ pub fn LogOut(cx: Scope<ClientProps>) -> Element {
Err(error) => {
rsx! {
- div { format!{"Failed to load disconnection url: {:?}", error} }
+ div { "Failed to load disconnection url: {error:?}" }
@@ -143,9 +143,9 @@ pub fn LoadClient(cx: Scope) -> Element {
+ log::info! {"Failed to load client: {:?}", error};
- div { format!{"Failed to load client: {:?}", error} }
- log::info!{"Failed to load client: {:?}", error},
+ div { "Failed to load client: {error:?}" }
Outlet::<Route> {}
@@ -184,7 +184,7 @@ pub fn AuthHeader(cx: Scope) -> Element {
Ok(email) => {
- div { email }
+ div { {email} }
LogOut { client_id: client_props.client_id, client: client_props.client }
@@ -207,7 +207,7 @@ pub fn AuthHeader(cx: Scope) -> Element {
log::info!("Other issue with token");
- div { error.to_string() }
+ div { "{error}" }
@@ -2,6 +2,9 @@ use dioxus::prelude::*;
#[component]
pub fn NotFound(cx: Scope, route: Vec<String>) -> Element {
- let routes = route.join("");
- render! {rsx! {div{routes}}}
+ div{
+ {route.join("")}
@@ -21,7 +21,7 @@ use dioxus::events::*;
use dioxus::html::MouseEvent;
-use dioxus_desktop::wry::application::dpi::LogicalSize;
+use dioxus_desktop::tao::dpi::LogicalSize;
use dioxus_desktop::{Config, WindowBuilder};
@@ -35,15 +35,17 @@ fn main() {
dioxus_desktop::launch_cfg(app, cfg);
+const STYLE: &str = include_str!("./assets/calculator.css");
let state = use_ref(cx, Calculator::new);
+ style { {STYLE} }
div { class: "calculator", onkeypress: move |evt| state.write().handle_keydown(evt),
- div { class: "calculator-display", state.read().formatted_display() }
+ div { class: "calculator-display", {state.read().formatted_display()} }
@@ -74,14 +76,14 @@ fn app(cx: Scope) -> Element {
onclick: move |_| state.write().input_dot(),
"●"
- (1..10).map(move |k| rsx!{
CalculatorKey {
key: "{k}",
onclick: move |_| state.write().input_digit(k),
@@ -130,7 +132,7 @@ fn CalculatorKey<'a>(cx: Scope<'a, CalculatorKeyProps<'a>>) -> Element {
class: "calculator-key {cx.props.name}",
onclick: move |e| cx.props.onclick.call(e),
- &cx.props.children
+ {&cx.props.children}
@@ -20,7 +20,7 @@ fn app(cx: Scope) -> Element {
h1 {"Select an option"}
- h3 { "The radio is... ", state.is_playing(), "!" }
+ h3 { "The radio is... ", {state.is_playing()}, "!" }
button { onclick: move |_| state.make_mut().reduce(PlayerAction::Pause),
"Pause"
@@ -66,7 +66,7 @@ impl FromQuery for ManualBlogQuerySegments {
fn BlogPost(cx: Scope, query_params: ManualBlogQuerySegments) -> Element {
div{"This is your blogpost with a query segment:"}
- div{format!("{:?}", query_params)}
+ div{ "{query_params:?}" }
@@ -74,7 +74,7 @@ fn BlogPost(cx: Scope, query_params: ManualBlogQuerySegments) -> Element {
fn AutomaticBlogPost(cx: Scope, name: String, surname: String) -> Element {
- div{format!("name={}&surname={}", name, surname)}
+ div{ "name={name}&surname={surname}" }
@@ -36,17 +36,17 @@ fn example(cx: Scope) -> Element {
div { id: "asd",
"your neighborhood spiderman"
- items.iter().cycle().take(5).map(|f| rsx!{
- div { "{f.a}" }
+ for item in items.iter().cycle().take(5) {
+ div { "{item.a}" }
- things_list.iter().map(|f| rsx!{
- div { "{f.a}" "{f.b}" }
+ for thing in things_list.iter() {
+ div { "{thing.a}" "{thing.b}" }
- mything_read.as_ref().map(|f| rsx! {
+ if let Some(f) = mything_read.as_ref() {
div { "{f}" }
@@ -61,7 +61,7 @@ fn App(cx: Scope) -> Element {
h1 {"Some text"}
h1 {"Some text with {formatting}"}
h1 {"Formatting basic expressions {formatting_tuple.0} and {formatting_tuple.1}"}
- h1 {"Formatting without interpolation " formatting_tuple.0 "and" formatting_tuple.1 }
+ h1 {"Formatting without interpolation " {formatting_tuple.0} "and" {formatting_tuple.1} }
h2 {
"Multiple"
"Text"
@@ -94,10 +94,10 @@ fn App(cx: Scope) -> Element {
// Expressions can be used in element position too:
- rsx!(p { "More templating!" }),
+ {rsx!(p { "More templating!" })},
// Iterators
- (0..10).map(|i| rsx!(li { "{i}" })),
+ {(0..10).map(|i| rsx!(li { "{i}" }))},
// Iterators within expressions
{
@@ -117,24 +117,25 @@ fn App(cx: Scope) -> Element {
// Conditional rendering
// Dioxus conditional rendering is based around None/Some. We have no special syntax for conditionals.
// You can convert a bool condition to rsx! with .then and .or
- true.then(|| rsx!(div {})),
+ {true.then(|| rsx!(div {}))},
// Alternatively, you can use the "if" syntax - but both branches must be resolve to Element
if false {
- rsx!(h1 {"Top text"})
+ h1 {"Top text"}
- rsx!(h1 {"Bottom text"})
+ h1 {"Bottom text"}
// Using optionals for diverging branches
- if true {
+ // Note that since this is wrapped in curlies, it's interpreted as an expression
+ {if true {
Some(rsx!(h1 {"Top text"}))
None
+ }}
// returning "None" without a diverging branch is a bit noisy... but rare in practice
- None as Option<()>,
+ {None as Option<()>},
// can also just use empty fragments
Fragment {}
@@ -169,13 +170,13 @@ fn App(cx: Scope) -> Element {
// Can pass in props directly as an expression
- let props = TallerProps {a: "hello", children: cx.render(rsx!(()))};
+ let props = TallerProps {a: "hello", children: None };
rsx!(Taller { ..props })
// Spreading can also be overridden manually
Taller {
- ..TallerProps { a: "ballin!", children: cx.render(rsx!(()) )},
+ ..TallerProps { a: "ballin!", children: None },
a: "not ballin!"
@@ -204,16 +205,16 @@ fn App(cx: Scope) -> Element {
// helper functions
// Anything that implements IntoVnode can be dropped directly into Rsx
- helper(cx, "hello world!")
+ {helper(cx, "hello world!")}
// Strings can be supplied directly
- String::from("Hello world!")
+ {String::from("Hello world!")}
// So can format_args
- format_args!("Hello {}!", "world")
+ {format_args!("Hello {}!", "world")}
// Or we can shell out to a helper function
- format_dollars(10, 50)
+ {format_dollars(10, 50)}
@@ -269,7 +270,7 @@ pub struct TallerProps<'a> {
pub fn Taller<'a>(cx: Scope<'a, TallerProps<'a>>) -> Element {
@@ -22,8 +22,10 @@ fn app(cx: Scope) -> Element {
- if let Some(header) = header_element.read().as_ref() {
- header.scroll_to(ScrollBehavior::Smooth);
+ if let Some(header) = header_element.read().as_ref().cloned() {
+ cx.spawn(async move {
+ let _ = header.scroll_to(ScrollBehavior::Smooth).await;
+ });
"Scroll to top"
@@ -51,26 +51,23 @@ pub fn App(cx: Scope) -> Element {
fn DataEditor(cx: Scope, id: usize) -> Element {
- let cool_data = use_shared_state::<CoolData>(cx).unwrap().read();
+ let data = use_shared_state::<CoolData>(cx)?;
- let my_data = &cool_data.view(id).unwrap();
- render!(p {
- "{my_data}"
+ p {
+ {data.read().view(id)?}
fn DataView(cx: Scope, id: usize) -> Element {
- let cool_data = use_shared_state::<CoolData>(cx).unwrap();
- let oninput = |e: FormEvent| cool_data.write().set(*id, e.value());
- let cool_data = cool_data.read();
- render!(input {
- oninput: oninput,
- value: "{my_data}"
+ input {
+ oninput: move |e: FormEvent| data.write().set(*id, e.value()),
+ value: data.read().view(id)?
@@ -0,0 +1,45 @@
+use dioxus::prelude::*;
+fn main() {
+ dioxus_desktop::launch(app);
+}
+fn app(cx: Scope) -> Element {
+ let a = 123;
+ let b = 456;
+ let c = 789;
+ let class = "class";
+ let id = "id";
+ // todo: i'd like it for children on elements to be inferred as the children of the element
+ // also should shorthands understand references/dereferences?
+ // ie **a, *a, &a, &mut a, etc
+ let children = render! { "Child" };
+ let onclick = move |_| println!("Clicked!");
+ div { class, id, {&children} }
+ Component { a, b, c, children, onclick }
+ Component { a, ..ComponentProps { a: 1, b: 2, c: 3, children: None, onclick: Default::default() } }
+#[component]
+fn Component<'a>(
+ cx: Scope<'a>,
+ a: i32,
+ b: i32,
+ c: i32,
+ children: Element<'a>,
+ onclick: EventHandler<'a, ()>,
+) -> Element {
+ div { "{a}" }
+ div { "{b}" }
+ div { "{c}" }
+ div { {children} }
+ onclick: move |_| onclick.call(()),
@@ -31,7 +31,7 @@ fn app(cx: Scope) -> Element {
// We can do boolean operations on the current signal value
if count.value() > 5 {
- rsx!{ h2 { "High five!" } }
+ h2 { "High five!" }
// We can cleanly map signals with iterators
@@ -41,9 +41,9 @@ fn app(cx: Scope) -> Element {
// We can also use the signal value as a slice
if let [ref first, .., ref last] = saved_values.read().as_slice() {
- rsx! { li { "First and last: {first}, {last}" } }
+ li { "First and last: {first}, {last}" }
- rsx! { "No saved values" }
+ "No saved values"
@@ -8,17 +8,17 @@ fn app(cx: Scope) -> Element {
// Use Map directly to lazily pull elements
- (0..10).map(|f| rsx! { "{f}" }),
+ {(0..10).map(|f| rsx! { "{f}" })},
// Collect into an intermediate collection if necessary, and call into_iter
- ["a", "b", "c", "d", "e", "f"]
+ {["a", "b", "c", "d", "e", "f"]
.into_iter()
.map(|f| rsx! { "{f}" })
.collect::<Vec<_>>()
- .into_iter(),
+ .into_iter()},
// Use optionals
- Some(rsx! { "Some" }),
+ {Some(rsx! { "Some" })},
// use a for loop where the body itself is RSX
for name in 0..10 {
@@ -27,7 +27,7 @@ fn app(cx: Scope) -> Element {
// Or even use an unterminated conditional
if true {
- rsx!{ "hello world!" }
+ "hello world!"
@@ -0,0 +1,36 @@
+ let mut dom = VirtualDom::new(app);
+ let _ = dom.rebuild();
+ let html = dioxus_ssr::render(&dom);
+ println!("{}", html);
+ Component {
+ width: "10px",
+ extra_data: "hello{1}",
+ extra_data2: "hello{2}",
+ height: "10px",
+ left: 1
+fn Component<'a>(cx: Scope<'a, Props<'a>>) -> Element<'a> {
+ audio { ..cx.props.attributes, "1: {cx.props.extra_data}\n2: {cx.props.extra_data2}" }
+#[derive(Props)]
+struct Props<'a> {
+ #[props(extends = GlobalAttributes)]
+ attributes: Vec<Attribute<'a>>,
+ extra_data: &'a str,
+ extra_data2: &'a str,
@@ -0,0 +1,33 @@
+use dioxus_signals::use_signal;
+use futures_util::{future, stream, Stream, StreamExt};
+use std::time::Duration;
+ let count = use_signal(cx, || 10);
+ use_future(cx, (), |_| async move {
+ let mut stream = some_stream();
+ while let Some(second) = stream.next().await {
+ count.set(second);
+ cx.render(rsx! {
+ h1 { "High-Five counter: {count}" }
+fn some_stream() -> std::pin::Pin<Box<dyn Stream<Item = i32>>> {
+ Box::pin(
+ stream::once(future::ready(0)).chain(stream::iter(1..).then(|second| async move {
+ tokio::time::sleep(Duration::from_secs(1)).await;
+ second
+ })),
+ )
@@ -97,7 +97,7 @@ pub fn Die<'a>(cx: Scope<'a, DieProps<'a>>) -> Element {
fill: "{fill}",
- dots
+ {dots}
@@ -13,6 +13,7 @@ publish = false
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
dioxus-desktop = { path = "../../packages/desktop" }
@@ -2,7 +2,7 @@
-const _STYLE: &str = mg!(file("./public/tailwind.css"));
+const _STYLE: &str = manganis::mg!(file("./public/tailwind.css"));
#[cfg(not(target_arch = "wasm32"))]
@@ -7,8 +7,6 @@ fn main() {
-const _STYLE: &str = mg!(file("./examples/assets/todomvc.css"));
#[derive(PartialEq, Eq, Clone, Copy)]
pub enum FilterState {
All,
@@ -49,33 +47,34 @@ pub fn app(cx: Scope<()>) -> Element {
section { class: "todoapp",
+ style { {include_str!("./assets/todomvc.css")} }
TodoHeader { todos: todos }
section { class: "main",
if !todos.is_empty() {
- rsx! {
- input {
- id: "toggle-all",
- class: "toggle-all",
- r#type: "checkbox",
- onchange: move |_| {
- let check = active_todo_count != 0;
- for (_, item) in todos.make_mut().iter_mut() {
- item.checked = check;
- checked: if active_todo_count == 0 { "true" } else { "false" },
- label { r#for: "toggle-all" }
+ id: "toggle-all",
+ class: "toggle-all",
+ r#type: "checkbox",
+ onchange: move |_| {
+ let check = active_todo_count != 0;
+ for (_, item) in todos.make_mut().iter_mut() {
+ item.checked = check;
+ checked: if active_todo_count == 0 { "true" } else { "false" },
+ label { r#for: "toggle-all" }
ul { class: "todo-list",
- filtered_todos.iter().map(|id| rsx!(TodoEntry {
- key: "{id}",
- id: *id,
- todos: todos,
+ for id in filtered_todos.iter() {
+ TodoEntry {
+ key: "{id}",
+ id: *id,
+ todos: todos,
- (!todos.is_empty()).then(|| rsx!(
+ if !todos.is_empty() {
ListFooter {
active_todo_count: active_todo_count,
active_todo_text: active_todo_text,
@@ -83,7 +82,7 @@ pub fn app(cx: Scope<()>) -> Element {
todos: todos,
filter: filter,
PageFooter {}
@@ -172,7 +171,7 @@ pub fn TodoEntry<'a>(cx: Scope<'a, TodoEntryProps<'a>>) -> Element {
prevent_default: "onclick"
- is_editing.then(|| rsx!{
+ if **is_editing {
class: "edit",
value: "{todo.contents}",
@@ -186,7 +185,7 @@ pub fn TodoEntry<'a>(cx: Scope<'a, TodoEntryProps<'a>>) -> Element {
@@ -220,29 +219,27 @@ pub fn ListFooter<'a>(cx: Scope<'a, ListFooterProps<'a>>) -> Element {
ul { class: "filters",
for (state , state_text , url) in [
- (FilterState::All, "All", "#/"),
- (FilterState::Active, "Active", "#/active"),
- (FilterState::Completed, "Completed", "#/completed"),
-] {
+ (FilterState::All, "All", "#/"),
+ (FilterState::Active, "Active", "#/active"),
+ (FilterState::Completed, "Completed", "#/completed"),
+ ] {
a {
href: url,
class: selected(state),
onclick: move |_| cx.props.filter.set(state),
prevent_default: "onclick",
- state_text
+ {state_text}
if cx.props.show_clear_completed {
- button {
- class: "clear-completed",
- onclick: move |_| cx.props.todos.make_mut().retain(|_, todo| !todo.checked),
- "Clear completed"
+ button {
+ class: "clear-completed",
+ onclick: move |_| cx.props.todos.make_mut().retain(|_, todo| !todo.checked),
+ "Clear completed"
@@ -3,7 +3,6 @@ use dioxus_desktop::wry::http;
use dioxus_desktop::wry::http::Response;
use dioxus_desktop::{use_asset_handler, AssetRequest};
use http::{header::*, response::Builder as ResponseBuilder, status::StatusCode};
-use std::borrow::Cow;
use std::{io::SeekFrom, path::PathBuf};
use tokio::io::AsyncReadExt;
use tokio::io::AsyncSeekExt;
@@ -31,28 +30,33 @@ fn main() {
- use_asset_handler(cx, move |request: &AssetRequest| {
- let request = request.clone();
+ use_asset_handler(cx, "videos", move |request, responder| {
+ // Using dioxus::spawn works, but is slower than a dedicated thread
+ tokio::task::spawn(async move {
let video_file = PathBuf::from(VIDEO_PATH);
let mut file = tokio::fs::File::open(&video_file).await.unwrap();
- let response: Option<Response<Cow<'static, [u8]>>> =
- match get_stream_response(&mut file, &request).await {
- Ok(response) => Some(response.map(Cow::Owned)),
- Err(err) => {
- eprintln!("Error: {}", err);
- None
- response
+ match get_stream_response(&mut file, &request).await {
+ Ok(response) => responder.respond(response),
+ Err(err) => eprintln!("Error: {}", err),
- div { video { src: "test_video.mp4", autoplay: true, controls: true, width: 640, height: 480 } }
+ video {
+ src: "/videos/test_video.mp4",
+ autoplay: true,
+ controls: true,
+ width: 640,
+ height: 480
+/// This was taken from wry's example
async fn get_stream_response(
asset: &mut (impl tokio::io::AsyncSeek + tokio::io::AsyncRead + Unpin + Send + Sync),
request: &AssetRequest,
@@ -1,7 +1,7 @@
+use dioxus_desktop::tao::event::Event as WryEvent;
use dioxus_desktop::tao::event::WindowEvent;
use dioxus_desktop::use_wry_event_handler;
-use dioxus_desktop::wry::application::event::Event as WryEvent;
use dioxus_desktop::{Config, WindowCloseBehaviour};
@@ -0,0 +1,247 @@
+{
+ "nodes": {
+ "crane": {
+ "inputs": {
+ "flake-compat": "flake-compat",
+ "flake-utils": "flake-utils",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "rust-overlay": "rust-overlay"
+ "locked": {
+ "lastModified": 1696384830,
+ "narHash": "sha256-j8ZsVqzmj5sOm5MW9cqwQJUZELFFwOislDmqDDEMl6k=",
+ "owner": "ipetkov",
+ "repo": "crane",
+ "rev": "f2143cd27f8bd09ee4f0121336c65015a2a0a19c",
+ "type": "github"
+ "original": {
+ "flake-compat": {
+ "flake": false,
+ "lastModified": 1696267196,
+ "narHash": "sha256-AAQ/2sD+0D18bb8hKuEEVpHUYD1GmO2Uh/taFamn6XQ=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "4f910c9827911b1ec2bf26b5a062cd09f8d89f85",
+ "flake-parts": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ "lastModified": 1696343447,
+ "narHash": "sha256-B2xAZKLkkeRFG5XcHHSXXcP7To9Xzr59KXeZiRf4vdQ=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "c9afaba3dfa4085dbd2ccb38dfade5141e33d9d4",
+ "flake-utils": {
+ "systems": "systems"
+ "lastModified": 1694529238,
+ "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
+ "flake-utils_2": {
+ "systems": "systems_2"
+ "lastModified": 1681202837,
+ "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
+ "rev": "cfacdce06f30d2b68473a46042957675eebb3401",
+ "nixpkgs": {
+ "lastModified": 1697009197,
+ "narHash": "sha256-viVRhBTFT8fPJTb1N3brQIpFZnttmwo3JVKNuWRVc3s=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "01441e14af5e29c9d27ace398e6dd0b293e25a54",
+ "ref": "nixpkgs-unstable",
+ "nixpkgs-lib": {
+ "dir": "lib",
+ "lastModified": 1696019113,
+ "narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
+ "owner": "NixOS",
+ "rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
+ "ref": "nixos-unstable",
+ "nixpkgs_2": {
+ "lastModified": 1681358109,
+ "narHash": "sha256-eKyxW4OohHQx9Urxi7TQlFBTDWII+F+x2hklDOQPB50=",
+ "rev": "96ba1c52e54e74c3197f4d43026b3f3d92e83ff9",
+ "root": {
+ "crane": "crane",
+ "flake-parts": "flake-parts",
+ "nixpkgs": "nixpkgs",
+ "rust-overlay": "rust-overlay_2",
+ "systems": "systems_3"
+ "rust-overlay": {
+ "flake-utils": [
+ "crane",
+ "flake-utils"
+ ]
+ "lastModified": 1696299134,
+ "narHash": "sha256-RS77cAa0N+Sfj5EmKbm5IdncNXaBCE1BSSQvUE8exvo=",
+ "owner": "oxalica",
+ "repo": "rust-overlay",
+ "rev": "611ccdceed92b4d94ae75328148d84ee4a5b462d",
+ "rust-overlay_2": {
+ "flake-utils": "flake-utils_2",
+ "nixpkgs": "nixpkgs_2"
+ "lastModified": 1697076655,
+ "narHash": "sha256-NcCtVUOd0X81srZkrdP8qoA1BMsPdO2tGtlZpsGijeU=",
+ "rev": "aa7584f5bbf5947716ad8ec14eccc0334f0d28f0",
+ "systems": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "systems_2": {
+ "systems_3": {
+ "root": "root",
+ "version": 7
@@ -0,0 +1,63 @@
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
+ flake-parts.url = "github:hercules-ci/flake-parts";
+ systems.url = "github:nix-systems/default";
+ rust-overlay.url = "github:oxalica/rust-overlay";
+ crane.url = "github:ipetkov/crane";
+ crane.inputs.nixpkgs.follows = "nixpkgs";
+ };
+ outputs = inputs:
+ inputs.flake-parts.lib.mkFlake { inherit inputs; } {
+ systems = import inputs.systems;
+ perSystem = { config, self', pkgs, lib, system, ... }:
+ let
+ rustToolchain = pkgs.rust-bin.stable.latest.default.override {
+ extensions = [
+ "rust-src"
+ "rust-analyzer"
+ "clippy"
+ ];
+ rustBuildInputs = [
+ pkgs.openssl
+ pkgs.libiconv
+ pkgs.pkg-config
+ ] ++ lib.optionals pkgs.stdenv.isDarwin (with pkgs.darwin.apple_sdk.frameworks; [
+ IOKit
+ Carbon
+ WebKit
+ Security
+ Cocoa
+ ]);
+ # This is useful when building crates as packages
+ # Note that it does require a `Cargo.lock` which this repo does not have
+ # craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rustToolchain;
+ in
+ {
+ _module.args.pkgs = import inputs.nixpkgs {
+ inherit system;
+ overlays = [
+ inputs.rust-overlay.overlays.default
+ devShells.default = pkgs.mkShell {
+ name = "dioxus-dev";
+ buildInputs = rustBuildInputs;
+ nativeBuildInputs = [
+ # Add shell dependencies here
+ rustToolchain
+ shellHook = ''
+ # For rust-analyzer 'hover' tooltips to work.
+ export RUST_SRC_PATH="${rustToolchain}/lib/rustlib/src/rust/library";
+ '';
@@ -67,7 +67,7 @@ impl Writer<'_> {
// multiline handlers bump everything down
- if attr_len > 1000 {
+ if attr_len > 1000 || self.out.indent.split_line_attributes() {
opt_level = ShortOptimization::NoOpt;
@@ -158,7 +158,7 @@ impl Writer<'_> {
while let Some(field) = field_iter.next() {
if !sameline {
- self.out.indented_tabbed_line()?;
+ self.out.indented_tabbed_line().unwrap();
let name = &field.name;
@@ -182,6 +182,9 @@ impl Writer<'_> {
s.source.as_ref().unwrap().to_token_stream()
)?;
+ ContentField::Shorthand(e) => {
+ write!(self.out, "{}", e.to_token_stream())?;
ContentField::OnHandlerRaw(exp) => {
let out = prettyplease::unparse_expr(exp);
let mut lines = out.split('\n').peekable();
@@ -206,7 +209,7 @@ impl Writer<'_> {
if let Some(exp) = manual_props {
self.write_manual_props(exp)?;
@@ -223,6 +226,7 @@ impl Writer<'_> {
.iter()
.map(|field| match &field.content {
ContentField::Formatted(s) => ifmt_to_string(s).len() ,
+ ContentField::Shorthand(e) => e.to_token_stream().to_string().len(),
ContentField::OnHandlerRaw(exp) | ContentField::ManExpr(exp) => {
let formatted = prettyplease::unparse_expr(exp);
let len = if formatted.contains('\n') {
@@ -103,7 +103,7 @@ impl Writer<'_> {
@@ -166,7 +166,7 @@ impl Writer<'_> {
fn write_attributes(
&mut self,
- attributes: &[ElementAttrNamed],
+ attributes: &[AttributeType],
key: &Option<IfmtInput>,
sameline: bool,
) -> Result {
@@ -188,7 +188,7 @@ impl Writer<'_> {
while let Some(attr) = attr_iter.next() {
self.out.indent_level += 1;
- self.write_comments(attr.attr.start())?;
+ self.write_comments(attr.start())?;
self.out.indent_level -= 1;
@@ -237,6 +237,9 @@ impl Writer<'_> {
ElementAttrValue::AttrLiteral(value) => {
write!(self.out, "{value}", value = ifmt_to_string(value))?;
+ ElementAttrValue::Shorthand(value) => {
+ write!(self.out, "{value}",)?;
ElementAttrValue::AttrExpr(value) => {
let out = prettyplease::unparse_expr(value);
@@ -262,7 +265,6 @@ impl Writer<'_> {
ElementAttrValue::EventTokens(tokens) => {
let out = self.retrieve_formatted_expr(tokens).to_string();
let first = lines.next().unwrap();
@@ -289,7 +291,14 @@ impl Writer<'_> {
Ok(())
- fn write_attribute(&mut self, attr: &ElementAttrNamed) -> Result {
+ fn write_attribute(&mut self, attr: &AttributeType) -> Result {
+ match attr {
+ AttributeType::Named(attr) => self.write_named_attribute(attr),
+ AttributeType::Spread(attr) => self.write_spread_attribute(attr),
+ fn write_named_attribute(&mut self, attr: &ElementAttrNamed) -> Result {
self.write_attribute_name(&attr.attr.name)?;
write!(self.out, ": ")?;
self.write_attribute_value(&attr.attr.value)?;
@@ -297,6 +306,13 @@ impl Writer<'_> {
+ fn write_spread_attribute(&mut self, attr: &Expr) -> Result {
+ write!(self.out, "..")?;
+ write!(self.out, "{}", prettyplease::unparse_expr(attr))?;
+ Ok(())
// make sure the comments are actually relevant to this element.
// test by making sure this element is the primary element on this line
pub fn current_span_is_primary(&self, location: Span) -> bool {
@@ -313,6 +329,10 @@ impl Writer<'_> {
beginning.is_empty()
+ pub fn is_empty_children(&self, children: &[BodyNode]) -> bool {
+ children.is_empty()
// check if the children are short enough to be on the same line
// We don't have the notion of current line depth - each line tries to be < 80 total
// returns the total line length if it's short
@@ -8,10 +8,11 @@ pub enum IndentType {
pub struct IndentOptions {
width: usize,
indent_string: String,
+ split_line_attributes: bool,
impl IndentOptions {
- pub fn new(typ: IndentType, width: usize) -> Self {
+ pub fn new(typ: IndentType, width: usize, split_line_attributes: bool) -> Self {
assert_ne!(width, 0, "Cannot have an indent width of 0");
Self {
width,
@@ -19,6 +20,7 @@ impl IndentOptions {
IndentType::Tabs => "\t".into(),
IndentType::Spaces => " ".repeat(width),
+ split_line_attributes,
@@ -62,11 +64,15 @@ impl IndentOptions {
indent
+ pub fn split_line_attributes(&self) -> bool {
+ self.split_line_attributes
impl Default for IndentOptions {
fn default() -> Self {
- Self::new(IndentType::Spaces, 4)
+ Self::new(IndentType::Spaces, 4, false)
@@ -77,31 +83,31 @@ mod tests {
#[test]
fn count_indents() {
assert_eq!(
- IndentOptions::new(IndentType::Spaces, 4).count_indents("no indentation here!"),
+ IndentOptions::new(IndentType::Spaces, 4, false).count_indents("no indentation here!"),
0
- IndentOptions::new(IndentType::Spaces, 4).count_indents(" v += 2"),
+ IndentOptions::new(IndentType::Spaces, 4, false).count_indents(" v += 2"),
1
2
- IndentOptions::new(IndentType::Spaces, 4).count_indents("\t\tv += 2"),
+ IndentOptions::new(IndentType::Spaces, 4, false).count_indents("\t\tv += 2"),
- IndentOptions::new(IndentType::Spaces, 4).count_indents("\t\t v += 2"),
+ IndentOptions::new(IndentType::Spaces, 4, false).count_indents("\t\t v += 2"),
- IndentOptions::new(IndentType::Spaces, 2).count_indents(" v += 2"),
+ IndentOptions::new(IndentType::Spaces, 2, false).count_indents(" v += 2"),
@@ -140,7 +140,9 @@ pub fn write_block_out(body: CallBody) -> Option<String> {
fn write_body(buf: &mut Writer, body: &CallBody) {
- if buf.is_short_children(&body.roots).is_some() {
+ let is_short = buf.is_short_children(&body.roots).is_some();
+ let is_empty = buf.is_empty_children(&body.roots);
+ if (is_short && !buf.out.indent.split_line_attributes()) || is_empty {
// write all the indents with spaces and commas between
for idx in 0..body.roots.len() - 1 {
let ident = &body.roots[idx];
@@ -1,11 +1,11 @@
-use dioxus_rsx::{BodyNode, ElementAttrNamed, ElementAttrValue, ForLoop};
+use dioxus_rsx::{AttributeType, BodyNode, ElementAttrValue, ForLoop, IfChain};
use proc_macro2::{LineColumn, Span};
use quote::ToTokens;
use std::{
collections::{HashMap, VecDeque},
fmt::{Result, Write},
-use syn::{spanned::Spanned, Expr, ExprIf};
+use syn::{spanned::Spanned, Expr};
use crate::buffer::Buffer;
use crate::ifmt_to_string;
@@ -142,6 +142,7 @@ impl<'a> Writer<'a> {
ElementAttrValue::AttrLiteral(lit) => ifmt_to_string(lit).len(),
ElementAttrValue::AttrExpr(expr) => expr.span().line_length(),
+ ElementAttrValue::Shorthand(expr) => expr.span().line_length(),
let location = Location::new(tokens.span().start());
@@ -165,12 +166,12 @@ impl<'a> Writer<'a> {
- pub(crate) fn is_short_attrs(&mut self, attributes: &[ElementAttrNamed]) -> usize {
+ pub(crate) fn is_short_attrs(&mut self, attributes: &[AttributeType]) -> usize {
let mut total = 0;
for attr in attributes {
- if self.current_span_is_primary(attr.attr.start()) {
- 'line: for line in self.src[..attr.attr.start().start().line - 1].iter().rev() {
+ if self.current_span_is_primary(attr.start()) {
+ 'line: for line in self.src[..attr.start().start().line - 1].iter().rev() {
match (line.trim().starts_with("//"), line.is_empty()) {
(true, _) => return 100000,
(_, true) => continue 'line,
@@ -179,16 +180,24 @@ impl<'a> Writer<'a> {
- total += match &attr.attr.name {
- dioxus_rsx::ElementAttrName::BuiltIn(name) => {
- let name = name.to_string();
- name.len()
+ AttributeType::Named(attr) => {
+ let name_len = match &attr.attr.name {
+ dioxus_rsx::ElementAttrName::BuiltIn(name) => {
+ let name = name.to_string();
+ name.len()
+ dioxus_rsx::ElementAttrName::Custom(name) => name.value().len() + 2,
+ total += name_len;
+ total += self.attr_value_len(&attr.attr.value);
+ AttributeType::Spread(expr) => {
+ let expr_len = self.retrieve_formatted_expr(expr).len();
+ total += expr_len + 3;
- dioxus_rsx::ElementAttrName::Custom(name) => name.value().len() + 2,
- total += self.attr_value_len(&attr.attr.value);
total += 6;
@@ -223,8 +232,49 @@ impl<'a> Writer<'a> {
- fn write_if_chain(&mut self, ifchain: &ExprIf) -> std::fmt::Result {
- self.write_raw_expr(ifchain.span())
+ fn write_if_chain(&mut self, ifchain: &IfChain) -> std::fmt::Result {
+ // Recurse in place by setting the next chain
+ let mut branch = Some(ifchain);
+ while let Some(chain) = branch {
+ let IfChain {
+ if_token,
+ cond,
+ then_branch,
+ else_if_branch,
+ else_branch,
+ } = chain;
+ write!(
+ self.out,
+ "{} {} {{",
+ if_token.to_token_stream(),
+ prettyplease::unparse_expr(cond)
+ )?;
+ self.write_body_indented(then_branch)?;
+ if let Some(else_if_branch) = else_if_branch {
+ // write the closing bracket and else
+ self.out.tabbed_line()?;
+ write!(self.out, "}} else ")?;
+ branch = Some(else_if_branch);
+ } else if let Some(else_branch) = else_branch {
+ write!(self.out, "}} else {{")?;
+ self.write_body_indented(else_branch)?;
+ branch = None;
+ write!(self.out, "}}")?;
@@ -12,18 +12,6 @@ rsx! {
let blah = 120;
true
- onclick: move |_| {
- let blah = 120;
- true
div { "hi" }
h2 { class: "asd" }
@@ -8,17 +8,17 @@ rsx! {
"hello world"
// Comments
- expr1,
+ {expr1},
- expr2,
+ {expr2},
- expr3,
+ {expr3},
// todo some work in here
@@ -6,7 +6,7 @@ rsx! {
show_user_menu.set(!show_user_menu.get());
evt.cancel_bubble();
- onclick: move |evt| show_user_menu.set(!show_user_menu.get()),
+ onmousedown: move |evt| show_user_menu.set(!show_user_menu.get()),
span { class: "inline-block mr-4", icons::icon_14 {} }
span { "Settings" }
@@ -18,7 +18,7 @@ rsx! {
to: "{to}",
span { class: "inline-block mr-3", icons::icon_0 {} }
span { "{name}" }
- children.is_some().then(|| rsx! {
+ {children.is_some().then(|| rsx! {
span {
class: "inline-block ml-auto hover:bg-gray-500",
onclick: move |evt| {
@@ -27,9 +27,9 @@ rsx! {
icons::icon_8 {}
+ })}
- div { class: "px-4", is_current.then(|| rsx!{ children }) }
+ div { class: "px-4", {is_current.then(|| rsx!{ children })} }
// No nesting
@@ -48,5 +48,5 @@ rsx! {
- div { asdbascasdbasd, asbdasbdabsd, asbdabsdbasdbas }
+ div { "asdbascasdbasd", "asbdasbdabsd", {asbdabsdbasdbas} }
@@ -8,6 +8,20 @@ rsx! {
// Some ifchain
if a > 10 {
//
- rsx! { div {} }
+ div {}
+ } else if a > 20 {
+ h1 {}
+ h3 {}
@@ -1,4 +1,4 @@
fn it_works() {
- cx.render(rsx!(()))
+ cx.render(rsx!({()}))
@@ -11,7 +11,7 @@ pub fn Explainer<'a>(
// pt-5 sm:pt-24 lg:pt-24
let mut right = rsx! {
- div { class: "relative w-1/2", flasher }
+ div { class: "relative w-1/2", {flasher} }
let align = match invert {
@@ -24,7 +24,7 @@ pub fn Explainer<'a>(
h2 { class: "mb-6 text-3xl leading-tight md:text-4xl md:leading-tight lg:text-3xl lg:leading-tight font-heading font-mono font-bold",
"{title}"
- content
+ {content}
@@ -34,8 +34,8 @@ pub fn Explainer<'a>(
div { class: "flex flex-wrap items-center dark:text-white py-16 border-t font-light",
- left,
- right
+ {left},
+ {right}
section { class: "body-font overflow-hidden dark:bg-ideblack",
div { class: "container px-6 mx-auto",
div { class: "-my-8 divide-y-2 divide-gray-100",
- POSTS.iter().enumerate().map(|(id, post)| rsx! { BlogPostItem { post: post, id: id } })
+ {POSTS.iter().enumerate().map(|(id, post)| rsx! { BlogPostItem { post: post, id: id } })}
@@ -4,20 +4,20 @@ rsx! {
div {}
// hi
- div { abcd, ball, s }
+ div { "abcd", "ball", "s" }
- abcd,
- ball,
- s,
+ "abcd"
+ "ball"
+ "s"
"asdasd"
- span { "Description: ", package.description.as_deref().unwrap_or("❌❌❌❌ missing") }
+ span { "Description: ", {package.description.as_deref().unwrap_or("❌❌❌❌ missing")} }
@@ -18,11 +18,11 @@ macro_rules! twoway {
-twoway!("comments-4sp" => comments_4sp (IndentOptions::new(IndentType::Spaces, 4)));
-twoway!("comments-tab" => comments_tab (IndentOptions::new(IndentType::Tabs, 4)));
+twoway!("comments-4sp" => comments_4sp (IndentOptions::new(IndentType::Spaces, 4, false)));
+twoway!("comments-tab" => comments_tab (IndentOptions::new(IndentType::Tabs, 4, false)));
-twoway!("multi-4sp" => multi_4sp (IndentOptions::new(IndentType::Spaces, 4)));
-twoway!("multi-tab" => multi_tab (IndentOptions::new(IndentType::Tabs, 4)));
+twoway!("multi-4sp" => multi_4sp (IndentOptions::new(IndentType::Spaces, 4, false)));
+twoway!("multi-tab" => multi_tab (IndentOptions::new(IndentType::Tabs, 4, false)));
-twoway!("multiexpr-4sp" => multiexpr_4sp (IndentOptions::new(IndentType::Spaces, 4)));
-twoway!("multiexpr-tab" => multiexpr_tab (IndentOptions::new(IndentType::Tabs, 4)));
+twoway!("multiexpr-4sp" => multiexpr_4sp (IndentOptions::new(IndentType::Spaces, 4, false)));
+twoway!("multiexpr-tab" => multiexpr_tab (IndentOptions::new(IndentType::Tabs, 4, false)));
@@ -1,8 +1,8 @@
fn ItWroks() {
@@ -1,5 +1,5 @@
- div { class: "flex flex-wrap items-center dark:text-white py-16 border-t font-light", left, right }
+ div { class: "flex flex-wrap items-center dark:text-white py-16 border-t font-light", {left}, {right} }
@@ -0,0 +1,4 @@
+/target
+Cargo.lock
+.DS_Store
+.idea/
@@ -0,0 +1,26 @@
+[package]
+authors = ["Jonathan Kelley"]
+edition = "2021"
+description = "Configuration for the Dioxus CLI"
+repository = "https://github.com/DioxusLabs/dioxus/"
+license = "MIT OR Apache-2.0"
+keywords = ["react", "gui", "cli", "dioxus", "wasm"]
+[dependencies]
+clap = { version = "4.2", features = ["derive"], optional = true }
+serde = { version = "1.0.136", features = ["derive"] }
+serde_json = "1.0.79"
+toml = { version = "0.5.8", optional = true }
+cargo_toml = { version = "0.16.0", optional = true }
+once_cell = "1.18.0"
+tracing.workspace = true
+# bundling
+tauri-bundler = { version = "=1.4.0", features = ["native-tls-vendored"], optional = true }
+tauri-utils = { version = "=1.5.*", optional = true }
+[features]
+default = []
+cli = ["tauri-bundler", "tauri-utils", "clap", "toml", "cargo_toml"]
@@ -0,0 +1,5 @@
+<div style="text-align: center">
+ <h1>📦✨ Dioxus CLI Configuration</h1>
+</div>
+The **dioxus-cli-config** contains the configuration for the **dioxus-cli**.
@@ -0,0 +1,260 @@
+use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
+use std::path::PathBuf;
+#[derive(Debug, Clone, Serialize, Deserialize, Default)]
+pub struct BundleConfig {
+ pub identifier: Option<String>,
+ pub publisher: Option<String>,
+ pub icon: Option<Vec<String>>,
+ pub resources: Option<Vec<String>>,
+ pub copyright: Option<String>,
+ pub category: Option<String>,
+ pub short_description: Option<String>,
+ pub long_description: Option<String>,
+ pub external_bin: Option<Vec<String>>,
+ pub deb: Option<DebianSettings>,
+ pub macos: Option<MacOsSettings>,
+ pub windows: Option<WindowsSettings>,
+#[cfg(feature = "cli")]
+impl From<BundleConfig> for tauri_bundler::BundleSettings {
+ fn from(val: BundleConfig) -> Self {
+ tauri_bundler::BundleSettings {
+ identifier: val.identifier,
+ publisher: val.publisher,
+ icon: val.icon,
+ resources: val.resources,
+ copyright: val.copyright,
+ category: val.category.and_then(|c| c.parse().ok()),
+ short_description: val.short_description,
+ long_description: val.long_description,
+ external_bin: val.external_bin,
+ deb: val.deb.map(Into::into).unwrap_or_default(),
+ macos: val.macos.map(Into::into).unwrap_or_default(),
+ windows: val.windows.map(Into::into).unwrap_or_default(),
+ ..Default::default()
+pub struct DebianSettings {
+ pub depends: Option<Vec<String>>,
+ pub files: HashMap<PathBuf, PathBuf>,
+ pub nsis: Option<NsisSettings>,
+impl From<DebianSettings> for tauri_bundler::DebianSettings {
+ fn from(val: DebianSettings) -> Self {
+ tauri_bundler::DebianSettings {
+ depends: val.depends,
+ files: val.files,
+ desktop_template: None,
+pub struct WixSettings {
+ pub language: Vec<(String, Option<PathBuf>)>,
+ pub template: Option<PathBuf>,
+ pub fragment_paths: Vec<PathBuf>,
+ pub component_group_refs: Vec<String>,
+ pub component_refs: Vec<String>,
+ pub feature_group_refs: Vec<String>,
+ pub feature_refs: Vec<String>,
+ pub merge_refs: Vec<String>,
+ pub skip_webview_install: bool,
+ pub license: Option<PathBuf>,
+ pub enable_elevated_update_task: bool,
+ pub banner_path: Option<PathBuf>,
+ pub dialog_image_path: Option<PathBuf>,
+ pub fips_compliant: bool,
+impl From<WixSettings> for tauri_bundler::WixSettings {
+ fn from(val: WixSettings) -> Self {
+ tauri_bundler::WixSettings {
+ language: tauri_bundler::bundle::WixLanguage({
+ let mut languages: Vec<_> = val
+ .language
+ .iter()
+ .map(|l| {
+ (
+ l.0.clone(),
+ tauri_bundler::bundle::WixLanguageConfig {
+ locale_path: l.1.clone(),
+ .collect();
+ if languages.is_empty() {
+ languages.push(("en-US".into(), Default::default()));
+ languages
+ }),
+ template: val.template,
+ fragment_paths: val.fragment_paths,
+ component_group_refs: val.component_group_refs,
+ component_refs: val.component_refs,
+ feature_group_refs: val.feature_group_refs,
+ feature_refs: val.feature_refs,
+ merge_refs: val.merge_refs,
+ skip_webview_install: val.skip_webview_install,
+ license: val.license,
+ enable_elevated_update_task: val.enable_elevated_update_task,
+ banner_path: val.banner_path,
+ dialog_image_path: val.dialog_image_path,
+ fips_compliant: val.fips_compliant,
+pub struct MacOsSettings {
+ pub frameworks: Option<Vec<String>>,
+ pub minimum_system_version: Option<String>,
+ pub license: Option<String>,
+ pub exception_domain: Option<String>,
+ pub signing_identity: Option<String>,
+ pub provider_short_name: Option<String>,
+ pub entitlements: Option<String>,
+ pub info_plist_path: Option<PathBuf>,
+impl From<MacOsSettings> for tauri_bundler::MacOsSettings {
+ fn from(val: MacOsSettings) -> Self {
+ tauri_bundler::MacOsSettings {
+ frameworks: val.frameworks,
+ minimum_system_version: val.minimum_system_version,
+ exception_domain: val.exception_domain,
+ signing_identity: val.signing_identity,
+ provider_short_name: val.provider_short_name,
+ entitlements: val.entitlements,
+ info_plist_path: val.info_plist_path,
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct WindowsSettings {
+ pub digest_algorithm: Option<String>,
+ pub certificate_thumbprint: Option<String>,
+ pub timestamp_url: Option<String>,
+ pub tsp: bool,
+ pub wix: Option<WixSettings>,
+ pub icon_path: Option<PathBuf>,
+ pub webview_install_mode: WebviewInstallMode,
+ pub webview_fixed_runtime_path: Option<PathBuf>,
+ pub allow_downgrades: bool,
+impl From<WindowsSettings> for tauri_bundler::WindowsSettings {
+ fn from(val: WindowsSettings) -> Self {
+ tauri_bundler::WindowsSettings {
+ digest_algorithm: val.digest_algorithm,
+ certificate_thumbprint: val.certificate_thumbprint,
+ timestamp_url: val.timestamp_url,
+ tsp: val.tsp,
+ wix: val.wix.map(Into::into),
+ icon_path: val.icon_path.unwrap_or("icons/icon.ico".into()),
+ webview_install_mode: val.webview_install_mode.into(),
+ webview_fixed_runtime_path: val.webview_fixed_runtime_path,
+ allow_downgrades: val.allow_downgrades,
+ nsis: val.nsis.map(Into::into),
+pub struct NsisSettings {
+ pub header_image: Option<PathBuf>,
+ pub sidebar_image: Option<PathBuf>,
+ pub installer_icon: Option<PathBuf>,
+ pub install_mode: NSISInstallerMode,
+ pub languages: Option<Vec<String>>,
+ pub custom_language_files: Option<HashMap<String, PathBuf>>,
+ pub display_language_selector: bool,
+impl From<NsisSettings> for tauri_bundler::NsisSettings {
+ fn from(val: NsisSettings) -> Self {
+ tauri_bundler::NsisSettings {
+ header_image: val.header_image,
+ sidebar_image: val.sidebar_image,
+ installer_icon: val.installer_icon,
+ install_mode: val.install_mode.into(),
+ languages: val.languages,
+ display_language_selector: val.display_language_selector,
+ custom_language_files: None,
+ template: None,
+ compression: None,
+pub enum NSISInstallerMode {
+ CurrentUser,
+ PerMachine,
+ Both,
+impl From<NSISInstallerMode> for tauri_utils::config::NSISInstallerMode {
+ fn from(val: NSISInstallerMode) -> Self {
+ match val {
+ NSISInstallerMode::CurrentUser => tauri_utils::config::NSISInstallerMode::CurrentUser,
+ NSISInstallerMode::PerMachine => tauri_utils::config::NSISInstallerMode::PerMachine,
+ NSISInstallerMode::Both => tauri_utils::config::NSISInstallerMode::Both,
+pub enum WebviewInstallMode {
+ Skip,
+ DownloadBootstrapper { silent: bool },
+ EmbedBootstrapper { silent: bool },
+ OfflineInstaller { silent: bool },
+ FixedRuntime { path: PathBuf },
+impl WebviewInstallMode {
+ fn into(self) -> tauri_utils::config::WebviewInstallMode {
+ match self {
+ Self::Skip => tauri_utils::config::WebviewInstallMode::Skip,
+ Self::DownloadBootstrapper { silent } => {
+ tauri_utils::config::WebviewInstallMode::DownloadBootstrapper { silent }
+ Self::EmbedBootstrapper { silent } => {
+ tauri_utils::config::WebviewInstallMode::EmbedBootstrapper { silent }
+ Self::OfflineInstaller { silent } => {
+ tauri_utils::config::WebviewInstallMode::OfflineInstaller { silent }
+ Self::FixedRuntime { path } => {
+ tauri_utils::config::WebviewInstallMode::FixedRuntime { path }
+impl Default for WebviewInstallMode {
+ fn default() -> Self {
+ Self::OfflineInstaller { silent: false }
@@ -1,12 +1,33 @@
//! Utilities for working with cargo and rust files
-use crate::error::{Error, Result};
+use std::error::Error;
- env, fs,
+ env,
+ fmt::{Display, Formatter},
+ fs,
path::{Path, PathBuf},
process::Command,
str,
+#[derive(Debug, Clone)]
+pub struct CargoError {
+ msg: String,
+impl CargoError {
+ pub fn new(msg: String) -> Self {
+ Self { msg }
+impl Display for CargoError {
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+ write!(f, "CargoError: {}", self.msg)
+impl Error for CargoError {}
/// How many parent folders are searched for a `Cargo.toml`
const MAX_ANCESTORS: u32 = 10;
@@ -19,7 +40,7 @@ pub struct Metadata {
/// Returns the root of the crate that the command is run from
///
/// If the command is run from the workspace root, this will return the top-level Cargo.toml
-pub fn crate_root() -> Result<PathBuf> {
+pub fn crate_root() -> Result<PathBuf, CargoError> {
// From the current directory we work our way up, looking for `Cargo.toml`
env::current_dir()
.ok()
@@ -35,7 +56,7 @@ pub fn crate_root() -> Result<PathBuf> {
.ok_or_else(|| {
- Error::CargoError("Failed to find directory containing Cargo.toml".to_string())
+ CargoError::new("Failed to find directory containing Cargo.toml".to_string())
@@ -53,11 +74,11 @@ fn contains_manifest(path: &Path) -> bool {
impl Metadata {
/// Returns the struct filled from `cargo metadata` output
/// TODO @Jon, find a different way that doesn't rely on the cargo metadata command (it's slow)
- pub fn get() -> Result<Self> {
+ pub fn get() -> Result<Self, CargoError> {
let output = Command::new("cargo")
.args(["metadata"])
.output()
- .map_err(|_| Error::CargoError("Manifset".to_string()))?;
+ .map_err(|_| CargoError::new("Manifset".to_string()))?;
if !output.status.success() {
let mut msg = str::from_utf8(&output.stderr).unwrap().trim();
@@ -65,22 +86,22 @@ impl Metadata {
msg = &msg[7..];
- return Err(Error::CargoError(msg.to_string()));
+ return Err(CargoError::new(msg.to_string()));
let stdout = str::from_utf8(&output.stdout).unwrap();
if let Some(line) = stdout.lines().next() {
let meta: serde_json::Value = serde_json::from_str(line)
- .map_err(|_| Error::CargoError("InvalidOutput".to_string()))?;
+ .map_err(|_| CargoError::new("InvalidOutput".to_string()))?;
let workspace_root = meta["workspace_root"]
.as_str()
- .ok_or_else(|| Error::CargoError("InvalidOutput".to_string()))?
+ .ok_or_else(|| CargoError::new("InvalidOutput".to_string()))?
.into();
let target_directory = meta["target_directory"]
return Ok(Self {
@@ -89,6 +110,6 @@ impl Metadata {
- Err(Error::CargoError("InvalidOutput".to_string()))
+ Err(CargoError::new("InvalidOutput".to_string()))
@@ -0,0 +1,492 @@
+use crate::BundleConfig;
+use crate::CargoError;
+use core::fmt::{Display, Formatter};
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Debug)]
+#[cfg_attr(feature = "cli", derive(clap::ValueEnum))]
+pub enum Platform {
+ #[cfg_attr(feature = "cli", clap(name = "web"))]
+ #[serde(rename = "web")]
+ Web,
+ #[cfg_attr(feature = "cli", clap(name = "desktop"))]
+ #[serde(rename = "desktop")]
+ Desktop,
+ #[cfg_attr(feature = "cli", clap(name = "fullstack"))]
+ #[serde(rename = "fullstack")]
+ Fullstack,
+pub struct DioxusConfig {
+ pub application: ApplicationConfig,
+ pub web: WebConfig,
+ #[serde(default)]
+ pub bundle: BundleConfig,
+ #[cfg(feature = "cli")]
+ #[serde(default = "default_plugin")]
+ pub plugin: toml::Value,
+fn default_plugin() -> toml::Value {
+ toml::Value::Boolean(true)
+pub struct LoadDioxusConfigError {
+ location: String,
+ error: String,
+impl std::fmt::Display for LoadDioxusConfigError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{} {}", self.location, self.error)
+impl std::error::Error for LoadDioxusConfigError {}
+#[derive(Debug)]
+pub enum CrateConfigError {
+ Cargo(CargoError),
+ Io(std::io::Error),
+ Toml(toml::de::Error),
+ LoadDioxusConfig(LoadDioxusConfigError),
+impl From<CargoError> for CrateConfigError {
+ fn from(err: CargoError) -> Self {
+ Self::Cargo(err)
+impl From<std::io::Error> for CrateConfigError {
+ fn from(err: std::io::Error) -> Self {
+ Self::Io(err)
+impl From<toml::de::Error> for CrateConfigError {
+ fn from(err: toml::de::Error) -> Self {
+ Self::Toml(err)
+impl From<LoadDioxusConfigError> for CrateConfigError {
+ fn from(err: LoadDioxusConfigError) -> Self {
+ Self::LoadDioxusConfig(err)
+impl Display for CrateConfigError {
+ Self::Cargo(err) => write!(f, "{}", err),
+ Self::Io(err) => write!(f, "{}", err),
+ Self::Toml(err) => write!(f, "{}", err),
+ Self::LoadDioxusConfig(err) => write!(f, "{}", err),
+impl std::error::Error for CrateConfigError {}
+impl DioxusConfig {
+ /// Load the dioxus config from a path
+ pub fn load(bin: Option<PathBuf>) -> Result<Option<DioxusConfig>, CrateConfigError> {
+ let crate_dir = crate::cargo::crate_root();
+ let crate_dir = match crate_dir {
+ Ok(dir) => {
+ if let Some(bin) = bin {
+ dir.join(bin)
+ dir
+ Err(_) => return Ok(None),
+ let crate_dir = crate_dir.as_path();
+ let Some(dioxus_conf_file) = acquire_dioxus_toml(crate_dir) else {
+ return Ok(None);
+ let dioxus_conf_file = dioxus_conf_file.as_path();
+ let cfg = toml::from_str::<DioxusConfig>(&std::fs::read_to_string(dioxus_conf_file)?)
+ .map_err(|err| {
+ let error_location = dioxus_conf_file
+ .strip_prefix(crate_dir)
+ .unwrap_or(dioxus_conf_file)
+ .display();
+ CrateConfigError::LoadDioxusConfig(LoadDioxusConfigError {
+ location: error_location.to_string(),
+ error: err.to_string(),
+ .map(Some);
+ match cfg {
+ Ok(Some(mut cfg)) => {
+ let name = cfg.application.name.clone();
+ if cfg.bundle.identifier.is_none() {
+ cfg.bundle.identifier = Some(format!("io.github.{name}"));
+ if cfg.bundle.publisher.is_none() {
+ cfg.bundle.publisher = Some(name);
+ Ok(Some(cfg))
+ cfg => cfg,
+fn acquire_dioxus_toml(dir: &std::path::Path) -> Option<PathBuf> {
+ // prefer uppercase
+ let uppercase_conf = dir.join("Dioxus.toml");
+ if uppercase_conf.is_file() {
+ return Some(uppercase_conf);
+ // lowercase is fine too
+ let lowercase_conf = dir.join("dioxus.toml");
+ if lowercase_conf.is_file() {
+ return Some(lowercase_conf);
+ None
+impl Default for DioxusConfig {
+ let name = default_name();
+ Self {
+ application: ApplicationConfig {
+ name: name.clone(),
+ default_platform: default_platform(),
+ out_dir: out_dir_default(),
+ asset_dir: asset_dir_default(),
+ tools: Default::default(),
+ sub_package: None,
+ web: WebConfig {
+ app: WebAppConfig {
+ title: default_title(),
+ base_path: None,
+ proxy: vec![],
+ watcher: Default::default(),
+ resource: WebResourceConfig {
+ dev: WebDevResourceConfig {
+ style: vec![],
+ script: vec![],
+ style: Some(vec![]),
+ script: Some(vec![]),
+ https: WebHttpsConfig {
+ enabled: None,
+ mkcert: None,
+ key_path: None,
+ cert_path: None,
+ bundle: BundleConfig {
+ identifier: Some(format!("io.github.{name}")),
+ publisher: Some(name),
+ plugin: toml::Value::Table(toml::map::Map::new()),
+pub struct ApplicationConfig {
+ #[serde(default = "default_name")]
+ pub name: String,
+ #[serde(default = "default_platform")]
+ pub default_platform: Platform,
+ #[serde(default = "out_dir_default")]
+ pub out_dir: PathBuf,
+ #[serde(default = "asset_dir_default")]
+ pub asset_dir: PathBuf,
+ pub tools: std::collections::HashMap<String, toml::Value>,
+ pub sub_package: Option<String>,
+fn default_name() -> String {
+ "name".into()
+fn default_platform() -> Platform {
+ Platform::Web
+fn asset_dir_default() -> PathBuf {
+ PathBuf::from("public")
+fn out_dir_default() -> PathBuf {
+ PathBuf::from("dist")
+pub struct WebConfig {
+ pub app: WebAppConfig,
+ pub proxy: Vec<WebProxyConfig>,
+ pub watcher: WebWatcherConfig,
+ pub resource: WebResourceConfig,
+ pub https: WebHttpsConfig,
+pub struct WebAppConfig {
+ #[serde(default = "default_title")]
+ pub title: String,
+ pub base_path: Option<String>,
+impl Default for WebAppConfig {
+fn default_title() -> String {
+ "dioxus | ⛺".into()
+pub struct WebProxyConfig {
+ pub backend: String,
+pub struct WebWatcherConfig {
+ #[serde(default = "watch_path_default")]
+ pub watch_path: Vec<PathBuf>,
+ pub reload_html: bool,
+ #[serde(default = "true_bool")]
+ pub index_on_404: bool,
+impl Default for WebWatcherConfig {
+ watch_path: watch_path_default(),
+ reload_html: false,
+ index_on_404: true,
+fn watch_path_default() -> Vec<PathBuf> {
+ vec![PathBuf::from("src"), PathBuf::from("examples")]
+#[derive(Default, Debug, Clone, Serialize, Deserialize)]
+pub struct WebResourceConfig {
+ pub dev: WebDevResourceConfig,
+ pub style: Option<Vec<PathBuf>>,
+ pub script: Option<Vec<PathBuf>>,
+pub struct WebDevResourceConfig {
+ pub style: Vec<PathBuf>,
+ pub script: Vec<PathBuf>,
+#[derive(Debug, Default, Clone, Serialize, Deserialize)]
+pub struct WebHttpsConfig {
+ pub enabled: Option<bool>,
+ pub mkcert: Option<bool>,
+ pub key_path: Option<String>,
+ pub cert_path: Option<String>,
+pub struct CrateConfig {
+ pub crate_dir: PathBuf,
+ pub workspace_dir: PathBuf,
+ pub target_dir: PathBuf,
+ pub manifest: cargo_toml::Manifest<cargo_toml::Value>,
+ pub executable: ExecutableType,
+ pub dioxus_config: DioxusConfig,
+ pub release: bool,
+ pub hot_reload: bool,
+ pub cross_origin_policy: bool,
+ pub verbose: bool,
+ pub custom_profile: Option<String>,
+ pub features: Option<Vec<String>>,
+ pub target: Option<String>,
+ pub cargo_args: Vec<String>,
+pub enum ExecutableType {
+ Binary(String),
+ Lib(String),
+ Example(String),
+impl CrateConfig {
+ pub fn new(bin: Option<PathBuf>) -> Result<Self, CrateConfigError> {
+ let dioxus_config = DioxusConfig::load(bin.clone())?.unwrap_or_default();
+ let crate_root = crate::crate_root()?;
+ let crate_dir = if let Some(package) = &dioxus_config.application.sub_package {
+ crate_root.join(package)
+ } else if let Some(bin) = bin {
+ crate_root.join(bin)
+ crate_root
+ let meta = crate::Metadata::get()?;
+ let workspace_dir = meta.workspace_root;
+ let target_dir = meta.target_directory;
+ let out_dir = crate_dir.join(&dioxus_config.application.out_dir);
+ let cargo_def = &crate_dir.join("Cargo.toml");
+ let asset_dir = crate_dir.join(&dioxus_config.application.asset_dir);
+ let manifest = cargo_toml::Manifest::from_path(cargo_def).unwrap();
+ let mut output_filename = String::from("dioxus_app");
+ if let Some(package) = &manifest.package.as_ref() {
+ output_filename = match &package.default_run {
+ Some(default_run_target) => default_run_target.to_owned(),
+ None => manifest
+ .bin
+ .find(|b| b.name == manifest.package.as_ref().map(|pkg| pkg.name.clone()))
+ .or(manifest
+ .find(|b| b.path == Some("src/main.rs".to_owned())))
+ .or(manifest.bin.first())
+ .or(manifest.lib.as_ref())
+ .and_then(|prod| prod.name.clone())
+ .unwrap_or(String::from("dioxus_app")),
+ let executable = ExecutableType::Binary(output_filename);
+ let release = false;
+ let hot_reload = false;
+ let verbose = false;
+ let custom_profile = None;
+ let features = None;
+ let target = None;
+ let cargo_args = vec![];
+ Ok(Self {
+ out_dir,
+ crate_dir,
+ workspace_dir,
+ target_dir,
+ asset_dir,
+ manifest,
+ executable,
+ release,
+ dioxus_config,
+ hot_reload,
+ cross_origin_policy: false,
+ custom_profile,
+ features,
+ verbose,
+ target,
+ cargo_args,
+ pub fn as_example(&mut self, example_name: String) -> &mut Self {
+ self.executable = ExecutableType::Example(example_name);
+ self
+ pub fn with_release(&mut self, release: bool) -> &mut Self {
+ self.release = release;
+ pub fn with_hot_reload(&mut self, hot_reload: bool) -> &mut Self {
+ self.hot_reload = hot_reload;
+ pub fn with_cross_origin_policy(&mut self, cross_origin_policy: bool) -> &mut Self {
+ self.cross_origin_policy = cross_origin_policy;
+ pub fn with_verbose(&mut self, verbose: bool) -> &mut Self {
+ self.verbose = verbose;
+ pub fn set_profile(&mut self, profile: String) -> &mut Self {
+ self.custom_profile = Some(profile);
+ pub fn set_features(&mut self, features: Vec<String>) -> &mut Self {
+ self.features = Some(features);
+ pub fn set_target(&mut self, target: String) -> &mut Self {
+ self.target = Some(target);
+ pub fn set_cargo_args(&mut self, cargo_args: Vec<String>) -> &mut Self {
+ self.cargo_args = cargo_args;
+fn true_bool() -> bool {
+ true
@@ -0,0 +1,58 @@
+#![doc = include_str!("../README.md")]
+#![doc(html_logo_url = "https://avatars.githubusercontent.com/u/79236386")]
+#![doc(html_favicon_url = "https://avatars.githubusercontent.com/u/79236386")]
+mod config;
+pub use config::*;
+mod bundle;
+pub use bundle::*;
+mod cargo;
+pub use cargo::*;
+#[doc(hidden)]
+pub mod __private {
+ use crate::CrateConfig;
+ pub const CONFIG_ENV: &str = "DIOXUS_CONFIG";
+ pub fn save_config(config: &CrateConfig) -> CrateConfigDropGuard {
+ std::env::set_var(CONFIG_ENV, serde_json::to_string(config).unwrap());
+ CrateConfigDropGuard
+ /// A guard that removes the config from the environment when dropped.
+ pub struct CrateConfigDropGuard;
+ impl Drop for CrateConfigDropGuard {
+ fn drop(&mut self) {
+ std::env::remove_var(CONFIG_ENV);
+/// An error that occurs when the dioxus CLI was not used to build the application.
+pub struct DioxusCLINotUsed;
+impl std::fmt::Display for DioxusCLINotUsed {
+ f.write_str("dioxus CLI was not used to build the application")
+impl std::error::Error for DioxusCLINotUsed {}
+/// The current crate's configuration.
+pub static CURRENT_CONFIG: once_cell::sync::Lazy<
+ Result<crate::config::CrateConfig, DioxusCLINotUsed>,
+> = once_cell::sync::Lazy::new(|| {
+ CURRENT_CONFIG_JSON
+ .and_then(|config| serde_json::from_str(config).ok())
+ .ok_or_else(|| {
+ tracing::error!("A library is trying to access the crate's configuration, but the dioxus CLI was not used to build the application.");
+ DioxusCLINotUsed
+});
+pub const CURRENT_CONFIG_JSON: Option<&str> = std::option_env!("DIOXUS_CONFIG");
@@ -14,6 +14,7 @@ clap = { version = "4.2", features = ["derive"] }
wasm-bindgen-cli-support = "0.2"
colored = "2.0.0"
+dioxus-cli-config = { workspace = true, features = ["cli"] }
# features
log = "0.4.14"
@@ -72,10 +73,10 @@ cargo-generate = "0.18"
toml_edit = "0.19.11"
# bundling
-tauri-bundler = { version = "=1.3.0", features = ["native-tls-vendored"] }
-tauri-utils = "=1.4.*"
+tauri-bundler = { version = "=1.4.*", features = ["native-tls-vendored"] }
+tauri-utils = "=1.5.*"
-manganis-cli-support= { git = "https://github.com/DioxusLabs/collect-assets", features = ["webp", "html"] }
+manganis-cli-support = { workspace = true, features = ["webp", "html"] }
dioxus-autofmt = { workspace = true }
dioxus-check = { workspace = true }
@@ -35,13 +35,13 @@ cargo install --path . --debug
## Get started
-Use `dx create project-name` to initialize a new Dioxus project.
+Use `dx create` to initialize a new Dioxus project.
It will be cloned from the [dioxus-template](https://github.com/DioxusLabs/dioxus-template) repository.
Alternatively, you can specify the template path:
```shell
-dx create hello --template gh:dioxuslabs/dioxus-template
+dx create --template gh:dioxuslabs/dioxus-template
```
Run `dx --help` for a list of all the available commands.
@@ -5,14 +5,9 @@ use std::{env, path::PathBuf, process::Command};
set_rerun();
set_commit_info();
- if option_env!("CFG_RELEASE").is_none() {
- println!("cargo:rustc-env=POKE_RA_DEVS=1");
fn set_rerun() {
- println!("cargo:rerun-if-env-changed=CFG_RELEASE");
let mut manifest_dir = PathBuf::from(
env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` is always set by cargo."),
@@ -0,0 +1,57 @@
+use std::{fs::File, io::Write, path::PathBuf};
+use crate::Result;
+use dioxus_cli_config::CrateConfig;
+use manganis_cli_support::{AssetManifest, AssetManifestExt};
+pub fn asset_manifest(crate_config: &CrateConfig) -> AssetManifest {
+ AssetManifest::load_from_path(
+ crate_config.crate_dir.join("Cargo.toml"),
+ crate_config.workspace_dir.join("Cargo.lock"),
+/// Create a head file that contains all of the imports for assets that the user project uses
+pub fn create_assets_head(config: &CrateConfig, manifest: &AssetManifest) -> Result<()> {
+ let mut file = File::create(config.out_dir.join("__assets_head.html"))?;
+ file.write_all(manifest.head().as_bytes())?;
+/// Process any assets collected from the binary
+pub(crate) fn process_assets(config: &CrateConfig, manifest: &AssetManifest) -> anyhow::Result<()> {
+ let static_asset_output_dir = PathBuf::from(
+ config
+ .dioxus_config
+ .web
+ .app
+ .base_path
+ .clone()
+ .unwrap_or_default(),
+ );
+ let static_asset_output_dir = config.out_dir.join(static_asset_output_dir);
+ manifest.copy_static_assets_to(static_asset_output_dir)?;
+/// A guard that sets up the environment for the web renderer to compile in. This guard sets the location that assets will be served from
+pub(crate) struct WebAssetConfigDropGuard;
+impl WebAssetConfigDropGuard {
+ pub fn new() -> Self {
+ // Set up the collect asset config
+ manganis_cli_support::Config::default()
+ .with_assets_serve_location("/")
+ .save();
+ Self {}
+impl Drop for WebAssetConfigDropGuard {
+ // Reset the config
+ manganis_cli_support::Config::default().save();
@@ -1,16 +1,18 @@
use crate::{
- config::{CrateConfig, ExecutableType},
+ assets::{asset_manifest, create_assets_head, process_assets, WebAssetConfigDropGuard},
error::{Error, Result},
tools::Tool,
use cargo_metadata::{diagnostic::Diagnostic, Message};
+use dioxus_cli_config::crate_root;
+use dioxus_cli_config::ExecutableType;
use indicatif::{ProgressBar, ProgressStyle};
use lazy_static::lazy_static;
-use manganis_cli_support::AssetManifestExt;
-use serde::Serialize;
+use manganis_cli_support::{AssetManifest, ManganisSupportGuard};
fs::{copy, create_dir_all, File},
- io::{Read, Write},
+ io::Read,
panic,
path::PathBuf,
time::Duration,
@@ -21,10 +23,11 @@ lazy_static! {
static ref PROGRESS_BARS: indicatif::MultiProgress = indicatif::MultiProgress::new();
-#[derive(Serialize, Debug, Clone)]
pub struct BuildResult {
pub warnings: Vec<Diagnostic>,
pub elapsed_time: u128,
+ pub assets: Option<AssetManifest>,
pub fn build(config: &CrateConfig, _: bool, skip_assets: bool) -> Result<BuildResult> {
@@ -45,12 +48,14 @@ pub fn build(config: &CrateConfig, _: bool, skip_assets: bool) -> Result<BuildRe
..
} = config;
- let _gaurd = WebAssetConfigDropGuard::new();
+ let _guard = WebAssetConfigDropGuard::new();
+ let _manganis_support = ManganisSupportGuard::default();
// start to build the assets
let ignore_files = build_assets(config)?;
let t_start = std::time::Instant::now();
+ let _guard = dioxus_cli_config::__private::save_config(config);
// [1] Build the .wasm module
log::info!("🚅 Running build command...");
@@ -152,7 +157,7 @@ pub fn build(config: &CrateConfig, _: bool, skip_assets: bool) -> Result<BuildRe
// check binaryen:wasm-opt tool
- let dioxus_tools = dioxus_config.application.tools.clone().unwrap_or_default();
+ let dioxus_tools = dioxus_config.application.tools.clone();
if dioxus_tools.contains_key("binaryen") {
let info = dioxus_tools.get("binaryen").unwrap();
let binaryen = crate::tools::Tool::Binaryen;
@@ -258,13 +263,18 @@ pub fn build(config: &CrateConfig, _: bool, skip_assets: bool) -> Result<BuildRe
- if !skip_assets {
- process_assets(config)?;
+ let assets = if !skip_assets {
+ let assets = asset_manifest(config);
+ process_assets(config, &assets)?;
+ Some(assets)
Ok(BuildResult {
warnings: warning_messages,
elapsed_time: t_start.elapsed().as_millis(),
+ assets,
@@ -277,6 +287,8 @@ pub fn build_desktop(
let mut cmd = subprocess::Exec::cmd("cargo")
.env("CARGO_TARGET_DIR", &config.target_dir)
@@ -312,9 +324,9 @@ pub fn build_desktop(
cmd = cmd.args(&config.cargo_args);
let cmd = match &config.executable {
- crate::ExecutableType::Binary(name) => cmd.arg("--bin").arg(name),
- crate::ExecutableType::Lib(name) => cmd.arg("--lib").arg(name),
- crate::ExecutableType::Example(name) => cmd.arg("--example").arg(name),
+ ExecutableType::Binary(name) => cmd.arg("--bin").arg(name),
+ ExecutableType::Lib(name) => cmd.arg("--lib").arg(name),
+ ExecutableType::Example(name) => cmd.arg("--example").arg(name),
let warning_messages = prettier_build(cmd)?;
@@ -326,7 +338,7 @@ pub fn build_desktop(
let file_name: String;
let mut res_path = match &config.executable {
- crate::ExecutableType::Binary(name) | crate::ExecutableType::Lib(name) => {
+ ExecutableType::Binary(name) | ExecutableType::Lib(name) => {
file_name = name.clone();
config
.target_dir
@@ -334,7 +346,7 @@ pub fn build_desktop(
.join(release_type)
.join(name)
- crate::ExecutableType::Example(name) => {
+ ExecutableType::Example(name) => {
@@ -390,22 +402,20 @@ pub fn build_desktop(
// Collect assets
// Create the __assets_head.html file for bundling
- create_assets_head(config)?;
+ create_assets_head(config, &assets)?;
log::info!(
"🚩 Build completed: [./{}]",
- config
- .dioxus_config
- .application
- .out_dir
- .clone()
- .unwrap_or_else(|| PathBuf::from("dist"))
- .display()
+ config.dioxus_config.application.out_dir.clone().display()
println!("build desktop done");
@@ -413,16 +423,10 @@ pub fn build_desktop(
-fn create_assets_head(config: &CrateConfig) -> Result<()> {
- let manifest = config.asset_manifest();
- let mut file = File::create(config.out_dir.join("__assets_head.html"))?;
- file.write_all(manifest.head().as_bytes())?;
- Ok(())
-}
fn prettier_build(cmd: subprocess::Exec) -> anyhow::Result<Vec<Diagnostic>> {
let mut warning_messages: Vec<Diagnostic> = vec![];
@@ -479,10 +483,10 @@ fn prettier_build(cmd: subprocess::Exec) -> anyhow::Result<Vec<Diagnostic>> {
Ok(warning_messages)
-pub fn gen_page(config: &CrateConfig, serve: bool, skip_assets: bool) -> String {
+pub fn gen_page(config: &CrateConfig, manifest: Option<&AssetManifest>, serve: bool) -> String {
let _gaurd = WebAssetConfigDropGuard::new();
- let crate_root = crate::cargo::crate_root().unwrap();
+ let crate_root = crate_root().unwrap();
let custom_html_file = crate_root.join("index.html");
let mut html = if custom_html_file.is_file() {
let mut buf = String::new();
@@ -502,8 +506,8 @@ pub fn gen_page(config: &CrateConfig, serve: bool, skip_assets: bool) -> String
let mut script_list = resources.script.unwrap_or_default();
if serve {
- let mut dev_style = resources.dev.style.clone().unwrap_or_default();
- let mut dev_script = resources.dev.script.unwrap_or_default();
+ let mut dev_style = resources.dev.style.clone();
+ let mut dev_script = resources.dev.script.clone();
style_list.append(&mut dev_style);
script_list.append(&mut dev_script);
@@ -520,13 +524,11 @@ pub fn gen_page(config: &CrateConfig, serve: bool, skip_assets: bool) -> String
.application
.tools
.clone()
- .unwrap_or_default()
.contains_key("tailwindcss")
style_str.push_str("<link rel=\"stylesheet\" href=\"/{base_path}/tailwind.css\">\n");
+ if let Some(manifest) = manifest {
style_str.push_str(&manifest.head());
@@ -577,13 +579,7 @@ pub fn gen_page(config: &CrateConfig, serve: bool, skip_assets: bool) -> String
- let title = config
- .web
- .app
- .title
- .unwrap_or_else(|| "dioxus | ⛺".into());
+ let title = config.dioxus_config.web.app.title.clone();
replace_or_insert_before("{app_title}", &title, "</title", &mut html);
@@ -610,7 +606,7 @@ fn build_assets(config: &CrateConfig) -> Result<Vec<PathBuf>> {
let mut result = vec![];
let dioxus_config = &config.dioxus_config;
// check sass tool state
let sass = Tool::Sass;
@@ -748,42 +744,3 @@ fn build_assets(config: &CrateConfig) -> Result<Vec<PathBuf>> {
Ok(result)
-/// Process any assets collected from the binary
-fn process_assets(config: &CrateConfig) -> anyhow::Result<()> {
- let static_asset_output_dir = PathBuf::from(
- .base_path
- .unwrap_or_default(),
- );
- let static_asset_output_dir = config.out_dir.join(static_asset_output_dir);
- manifest.copy_static_assets_to(static_asset_output_dir)?;
-pub(crate) struct WebAssetConfigDropGuard;
-impl WebAssetConfigDropGuard {
- pub fn new() -> Self {
- // Set up the collect asset config
- manganis_cli_support::Config::default()
- .with_assets_serve_location("/")
- .save();
- Self {}
-impl Drop for WebAssetConfigDropGuard {
- fn drop(&mut self) {
- // Reset the config
- manganis_cli_support::Config::default().save();
@@ -22,23 +22,33 @@ pub struct Autoformat {
/// Input file
#[clap(short, long)]
pub file: Option<String>,
+ /// Split attributes in lines or not
+ #[clap(short, long, default_value = "false")]
+ pub split_line_attributes: bool,
impl Autoformat {
// Todo: autoformat the entire crate
pub async fn autoformat(self) -> Result<()> {
- let Autoformat { check, raw, file } = self;
+ let Autoformat {
+ check,
+ raw,
+ file,
+ ..
+ } = self;
// Default to formatting the project
if raw.is_none() && file.is_none() {
- if let Err(e) = autoformat_project(check).await {
+ if let Err(e) = autoformat_project(check, split_line_attributes).await {
eprintln!("error formatting project: {}", e);
exit(1);
if let Some(raw) = raw {
- let indent = indentation_for(".")?;
+ let indent = indentation_for(".", self.split_line_attributes)?;
if let Some(inner) = dioxus_autofmt::fmt_block(&raw, 0, indent) {
println!("{}", inner);
@@ -50,15 +60,15 @@ impl Autoformat {
// Format single file
if let Some(file) = file {
- refactor_file(file)?;
+ refactor_file(file, split_line_attributes)?;
-fn refactor_file(file: String) -> Result<(), Error> {
+fn refactor_file(file: String, split_line_attributes: bool) -> Result<(), Error> {
+ let indent = indentation_for(".", split_line_attributes)?;
let file_content = if file == "-" {
let mut contents = String::new();
std::io::stdin().read_to_string(&mut contents)?;
@@ -138,8 +148,8 @@ async fn format_file(
/// Runs using Tokio for multithreading, so it should be really really fast
/// Doesn't do mod-descending, so it will still try to format unreachable files. TODO.
-async fn autoformat_project(check: bool) -> Result<()> {
- let crate_config = crate::CrateConfig::new(None)?;
+async fn autoformat_project(check: bool, split_line_attributes: bool) -> Result<()> {
+ let crate_config = dioxus_cli_config::CrateConfig::new(None)?;
let files_to_format = get_project_files(&crate_config);
@@ -147,7 +157,7 @@ async fn autoformat_project(check: bool) -> Result<()> {
return Ok(());
- let indent = indentation_for(&files_to_format[0])?;
+ let indent = indentation_for(&files_to_format[0], split_line_attributes)?;
let counts = files_to_format
@@ -181,7 +191,10 @@ async fn autoformat_project(check: bool) -> Result<()> {
-fn indentation_for(file_or_dir: impl AsRef<Path>) -> Result<IndentOptions> {
+fn indentation_for(
+ file_or_dir: impl AsRef<Path>,
+) -> Result<IndentOptions> {
let out = std::process::Command::new("cargo")
.args(["fmt", "--", "--print-config", "current"])
.arg(file_or_dir.as_ref())
@@ -221,6 +234,7 @@ fn indentation_for(file_or_dir: impl AsRef<Path>) -> Result<IndentOptions> {
IndentType::Spaces
tab_spaces,
@@ -253,10 +267,10 @@ async fn test_auto_fmt() {
let test_rsx = r#"
@@ -269,6 +283,7 @@ async fn test_auto_fmt() {
check: false,
raw: Some(test_rsx),
file: None,
+ split_line_attributes: false,
fmt.autoformat().await.unwrap();
@@ -1,8 +1,9 @@
+use crate::assets::WebAssetConfigDropGuard;
#[cfg(feature = "plugin")]
use crate::plugin::PluginManager;
use crate::server::fullstack::FullstackServerEnvGuard;
use crate::server::fullstack::FullstackWebEnvGuard;
-use crate::{cfg::Platform, WebAssetConfigDropGuard};
+use dioxus_cli_config::Platform;
use super::*;
@@ -16,7 +17,7 @@ pub struct Build {
impl Build {
pub fn build(self, bin: Option<PathBuf>, target_dir: Option<&std::path::Path>) -> Result<()> {
- let mut crate_config = crate::CrateConfig::new(bin)?;
+ let mut crate_config = dioxus_cli_config::CrateConfig::new(bin)?;
if let Some(target_dir) = target_dir {
crate_config.target_dir = target_dir.to_path_buf();
@@ -51,12 +52,10 @@ impl Build {
// #[cfg(feature = "plugin")]
// let _ = PluginManager::on_build_start(&crate_config, &platform);
- match platform {
- Platform::Web => {
- crate::builder::build(&crate_config, false, self.build.skip_assets)?;
+ let build_result = match platform {
+ Platform::Web => crate::builder::build(&crate_config, false, self.build.skip_assets)?,
Platform::Desktop => {
- crate::builder::build_desktop(&crate_config, false, self.build.skip_assets)?;
+ crate::builder::build_desktop(&crate_config, false, self.build.skip_assets)?
Platform::Fullstack => {
// Fullstack mode must be built with web configs on the desktop (server) binary as well as the web binary
@@ -86,24 +85,17 @@ impl Build {
let _gaurd =
FullstackServerEnvGuard::new(self.build.force_debug, self.build.release);
- crate::builder::build_desktop(&desktop_config, false, self.build.skip_assets)?;
+ crate::builder::build_desktop(&desktop_config, false, self.build.skip_assets)?
- let temp = gen_page(&crate_config, false, self.build.skip_assets);
+ let temp = gen_page(&crate_config, build_result.assets.as_ref(), false);
let mut file = std::fs::File::create(
crate_config
.crate_dir
- .join(
- crate_config
- .unwrap_or_else(|| PathBuf::from("dist")),
+ .join(crate_config.dioxus_config.application.out_dir.clone())
.join("index.html"),
file.write_all(temp.as_bytes())?;
use core::panic;
use std::{fs::create_dir_all, str::FromStr};
use tauri_bundler::{BundleSettings, PackageSettings, SettingsBuilder};
@@ -62,7 +63,7 @@ impl From<PackageType> for tauri_bundler::PackageType {
impl Bundle {
pub fn bundle(self, bin: Option<PathBuf>) -> Result<()> {
// change the release state.
crate_config.with_release(self.build.release);
@@ -89,9 +90,9 @@ impl Bundle {
let package = crate_config.manifest.package.unwrap();
let mut name: PathBuf = match &crate_config.executable {
- crate::ExecutableType::Binary(name)
- | crate::ExecutableType::Lib(name)
- | crate::ExecutableType::Example(name) => name,
+ ExecutableType::Binary(name)
+ | ExecutableType::Lib(name)
+ | ExecutableType::Example(name) => name,
if cfg!(windows) {
@@ -1,5 +1,4 @@
-use clap::ValueEnum;
@@ -154,19 +153,6 @@ pub struct ConfigOptsServe {
pub cargo_args: Vec<String>,
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Serialize, Deserialize, Debug)]
-pub enum Platform {
- #[clap(name = "web")]
- #[serde(rename = "web")]
- Web,
- #[clap(name = "desktop")]
- #[serde(rename = "desktop")]
- Desktop,
- #[clap(name = "fullstack")]
- #[serde(rename = "fullstack")]
- Fullstack,
/// Config options for the bundling system.
#[derive(Clone, Debug, Default, Deserialize, Parser)]
pub struct ConfigOptsBundle {
@@ -47,7 +47,7 @@ async fn check_file_and_report(path: PathBuf) -> Result<()> {
/// Doesn't do mod-descending, so it will still try to check unreachable files. TODO.
async fn check_project_and_report() -> Result<()> {
let mut files_to_check = vec![];
collect_rs_files(&crate_config.crate_dir, &mut files_to_check);
@@ -7,7 +7,7 @@ pub struct Clean {}
impl Clean {
pub fn clean(self, bin: Option<PathBuf>) -> Result<()> {
- let crate_config = crate::CrateConfig::new(bin)?;
+ let crate_config = dioxus_cli_config::CrateConfig::new(bin)?;
.arg("clean")
@@ -19,11 +19,7 @@ impl Clean {
return custom_error!("Cargo clean failed.");
- let out_dir = crate_config
- .unwrap_or_else(|| PathBuf::from("dist"));
+ let out_dir = crate_config.dioxus_config.application.out_dir;
if crate_config.crate_dir.join(&out_dir).is_dir() {
remove_dir_all(crate_config.crate_dir.join(&out_dir))?;
@@ -1,3 +1,5 @@
/// Dioxus config file controls
@@ -26,7 +28,7 @@ pub enum Config {
impl Config {
pub fn config(self) -> Result<()> {
- let crate_root = crate::cargo::crate_root()?;
+ let crate_root = crate_root()?;
match self {
Config::Init {
name,
@@ -48,7 +50,10 @@ impl Config {
log::info!("🚩 Init config file completed.");
Config::FormatPrint {} => {
- println!("{:#?}", crate::CrateConfig::new(None)?.dioxus_config);
+ println!(
+ "{:#?}",
+ dioxus_cli_config::CrateConfig::new(None)?.dioxus_config
Config::CustomHtml {} => {
let html_path = crate_root.join("index.html");
@@ -15,9 +15,10 @@ use crate::{
cfg::{ConfigOptsBuild, ConfigOptsServe},
custom_error,
error::Result,
- gen_page, server, CrateConfig, Error,
+ gen_page, server, Error,
use clap::{Parser, Subcommand};
use html_parser::Dom;
use serde::Deserialize;
@@ -1,3 +1,6 @@
+use manganis_cli_support::AssetManifest;
use std::{fs::create_dir_all, io::Write, path::PathBuf};
@@ -11,7 +14,7 @@ pub struct Serve {
impl Serve {
pub async fn serve(self, bin: Option<PathBuf>) -> Result<()> {
let serve_cfg = self.serve.clone();
// change the relase state.
@@ -32,9 +35,6 @@ impl Serve {
crate_config.set_features(self.serve.features.unwrap());
- // Subdirectories don't work with the server
- crate_config.dioxus_config.web.app.base_path = None;
if let Some(target) = self.serve.target {
crate_config.set_target(target);
@@ -47,10 +47,7 @@ impl Serve {
.unwrap_or(crate_config.dioxus_config.application.default_platform);
match platform {
- cfg::Platform::Web => {
- // generate dev-index page
- Serve::regen_dev_page(&crate_config, self.serve.skip_assets)?;
+ Platform::Web => {
// start the develop server
server::web::startup(
self.serve.port,
@@ -60,27 +57,25 @@ impl Serve {
.await?;
- cfg::Platform::Desktop => {
+ Platform::Desktop => {
server::desktop::startup(crate_config.clone(), &serve_cfg).await?;
- cfg::Platform::Fullstack => {
+ Platform::Fullstack => {
server::fullstack::startup(crate_config.clone(), &serve_cfg).await?;
- pub fn regen_dev_page(crate_config: &CrateConfig, skip_assets: bool) -> Result<()> {
- let serve_html = gen_page(crate_config, true, skip_assets);
+ pub fn regen_dev_page(
+ crate_config: &CrateConfig,
+ manifest: Option<&AssetManifest>,
+ ) -> anyhow::Result<()> {
+ let serve_html = gen_page(crate_config, manifest, true);
- let dist_path = crate_config.crate_dir.join(
+ let dist_path = crate_config
+ .crate_dir
+ .join(crate_config.dioxus_config.application.out_dir.clone());
if !dist_path.is_dir() {
create_dir_all(&dist_path)?;
@@ -49,7 +49,7 @@ impl fmt::Display for VersionInfo {
/// Returns information about cargo's version.
pub const fn version() -> VersionInfo {
- let version = match option_env!("CFG_RELEASE") {
+ let version = match option_env!("CARGO_PKG_VERSION") {
Some(x) => x,
None => "0.0.0",
@@ -1,607 +0,0 @@
-use crate::{cfg::Platform, error::Result};
-use manganis_cli_support::AssetManifest;
-use serde::{Deserialize, Serialize};
-use std::{
- collections::HashMap,
- path::{Path, PathBuf},
-};
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct DioxusConfig {
- pub application: ApplicationConfig,
- pub web: WebConfig,
- #[serde(default)]
- pub bundle: BundleConfig,
- #[serde(default = "default_plugin")]
- pub plugin: toml::Value,
-fn default_plugin() -> toml::Value {
- toml::Value::Boolean(true)
-impl DioxusConfig {
- pub fn load(bin: Option<PathBuf>) -> crate::error::Result<Option<DioxusConfig>> {
- let crate_dir = crate::cargo::crate_root();
- let crate_dir = match crate_dir {
- Ok(dir) => {
- if let Some(bin) = bin {
- dir.join(bin)
- dir
- Err(_) => return Ok(None),
- let crate_dir = crate_dir.as_path();
- let Some(dioxus_conf_file) = acquire_dioxus_toml(crate_dir) else {
- return Ok(None);
- let dioxus_conf_file = dioxus_conf_file.as_path();
- let cfg = toml::from_str::<DioxusConfig>(&std::fs::read_to_string(dioxus_conf_file)?)
- .map_err(|err| {
- let error_location = dioxus_conf_file
- .strip_prefix(crate_dir)
- .unwrap_or(dioxus_conf_file)
- .display();
- crate::Error::Unique(format!("{error_location} {err}"))
- .map(Some);
- match cfg {
- Ok(Some(mut cfg)) => {
- let name = cfg.application.name.clone();
- if cfg.bundle.identifier.is_none() {
- cfg.bundle.identifier = Some(format!("io.github.{name}"));
- if cfg.bundle.publisher.is_none() {
- cfg.bundle.publisher = Some(name);
- Ok(Some(cfg))
- cfg => cfg,
-fn acquire_dioxus_toml(dir: &Path) -> Option<PathBuf> {
- // prefer uppercase
- let uppercase_conf = dir.join("Dioxus.toml");
- if uppercase_conf.is_file() {
- return Some(uppercase_conf);
- // lowercase is fine too
- let lowercase_conf = dir.join("dioxus.toml");
- if lowercase_conf.is_file() {
- return Some(lowercase_conf);
-impl Default for DioxusConfig {
- fn default() -> Self {
- let name = "name";
- Self {
- application: ApplicationConfig {
- name: name.into(),
- default_platform: Platform::Web,
- out_dir: Some(PathBuf::from("dist")),
- asset_dir: Some(PathBuf::from("public")),
- tools: None,
- sub_package: None,
- web: WebConfig {
- app: WebAppConfig {
- title: Some("dioxus | ⛺".into()),
- base_path: None,
- proxy: Some(vec![]),
- watcher: WebWatcherConfig {
- watch_path: Some(vec![PathBuf::from("src"), PathBuf::from("examples")]),
- reload_html: Some(false),
- index_on_404: Some(true),
- resource: WebResourceConfig {
- dev: WebDevResourceConfig {
- style: Some(vec![]),
- script: Some(vec![]),
- https: WebHttpsConfig {
- enabled: None,
- mkcert: None,
- key_path: None,
- cert_path: None,
- bundle: BundleConfig {
- identifier: Some(format!("io.github.{name}")),
- publisher: Some(name.into()),
- ..Default::default()
- plugin: toml::Value::Table(toml::map::Map::new()),
-pub struct ApplicationConfig {
- pub name: String,
- pub default_platform: Platform,
- pub out_dir: Option<PathBuf>,
- pub asset_dir: Option<PathBuf>,
- pub tools: Option<HashMap<String, toml::Value>>,
- pub sub_package: Option<String>,
-pub struct WebConfig {
- pub app: WebAppConfig,
- pub proxy: Option<Vec<WebProxyConfig>>,
- pub watcher: WebWatcherConfig,
- pub resource: WebResourceConfig,
- pub https: WebHttpsConfig,
-pub struct WebAppConfig {
- pub title: Option<String>,
- pub base_path: Option<String>,
-pub struct WebProxyConfig {
- pub backend: String,
-pub struct WebWatcherConfig {
- pub watch_path: Option<Vec<PathBuf>>,
- pub reload_html: Option<bool>,
- pub index_on_404: Option<bool>,
-pub struct WebResourceConfig {
- pub dev: WebDevResourceConfig,
- pub style: Option<Vec<PathBuf>>,
- pub script: Option<Vec<PathBuf>>,
-pub struct WebDevResourceConfig {
-#[derive(Debug, Default, Clone, Serialize, Deserialize)]
-pub struct WebHttpsConfig {
- pub enabled: Option<bool>,
- pub mkcert: Option<bool>,
- pub key_path: Option<String>,
- pub cert_path: Option<String>,
-#[derive(Debug, Clone)]
-pub struct CrateConfig {
- pub out_dir: PathBuf,
- pub crate_dir: PathBuf,
- pub workspace_dir: PathBuf,
- pub target_dir: PathBuf,
- pub asset_dir: PathBuf,
- pub manifest: cargo_toml::Manifest<cargo_toml::Value>,
- pub executable: ExecutableType,
- pub dioxus_config: DioxusConfig,
- pub release: bool,
- pub hot_reload: bool,
- pub cross_origin_policy: bool,
- pub verbose: bool,
- pub custom_profile: Option<String>,
- pub features: Option<Vec<String>>,
- pub target: Option<String>,
- pub cargo_args: Vec<String>,
-pub enum ExecutableType {
- Binary(String),
- Lib(String),
- Example(String),
-impl CrateConfig {
- pub fn new(bin: Option<PathBuf>) -> Result<Self> {
- let dioxus_config = DioxusConfig::load(bin.clone())?.unwrap_or_default();
- let crate_dir = if let Some(package) = &dioxus_config.application.sub_package {
- crate_root.join(package)
- } else if let Some(bin) = bin {
- crate_root.join(bin)
- crate_root
- let meta = crate::cargo::Metadata::get()?;
- let workspace_dir = meta.workspace_root;
- let target_dir = meta.target_directory;
- let out_dir = match dioxus_config.application.out_dir {
- Some(ref v) => crate_dir.join(v),
- None => crate_dir.join("dist"),
- let cargo_def = &crate_dir.join("Cargo.toml");
- let asset_dir = match dioxus_config.application.asset_dir {
- None => crate_dir.join("public"),
- let manifest = cargo_toml::Manifest::from_path(cargo_def).unwrap();
- let mut output_filename = String::from("dioxus_app");
- if let Some(package) = &manifest.package.as_ref() {
- output_filename = match &package.default_run {
- Some(default_run_target) => default_run_target.to_owned(),
- None => manifest
- .bin
- .iter()
- .find(|b| b.name == manifest.package.as_ref().map(|pkg| pkg.name.clone()))
- .or(manifest
- .find(|b| b.path == Some("src/main.rs".to_owned())))
- .or(manifest.bin.first())
- .or(manifest.lib.as_ref())
- .and_then(|prod| prod.name.clone())
- .unwrap_or(String::from("dioxus_app")),
- let executable = ExecutableType::Binary(output_filename);
- let release = false;
- let hot_reload = false;
- let verbose = false;
- let custom_profile = None;
- let features = None;
- let target = None;
- let cargo_args = vec![];
- Ok(Self {
- out_dir,
- crate_dir,
- workspace_dir,
- target_dir,
- asset_dir,
- manifest,
- executable,
- release,
- dioxus_config,
- hot_reload,
- cross_origin_policy: false,
- custom_profile,
- features,
- verbose,
- target,
- cargo_args,
- pub fn asset_manifest(&self) -> AssetManifest {
- AssetManifest::load_from_path(
- self.crate_dir.join("Cargo.toml"),
- self.workspace_dir.join("Cargo.lock"),
- pub fn as_example(&mut self, example_name: String) -> &mut Self {
- self.executable = ExecutableType::Example(example_name);
- self
- pub fn with_release(&mut self, release: bool) -> &mut Self {
- self.release = release;
- pub fn with_hot_reload(&mut self, hot_reload: bool) -> &mut Self {
- self.hot_reload = hot_reload;
- pub fn with_cross_origin_policy(&mut self, cross_origin_policy: bool) -> &mut Self {
- self.cross_origin_policy = cross_origin_policy;
- pub fn with_verbose(&mut self, verbose: bool) -> &mut Self {
- self.verbose = verbose;
- pub fn set_profile(&mut self, profile: String) -> &mut Self {
- self.custom_profile = Some(profile);
- pub fn set_features(&mut self, features: Vec<String>) -> &mut Self {
- self.features = Some(features);
- pub fn set_target(&mut self, target: String) -> &mut Self {
- self.target = Some(target);
- pub fn set_cargo_args(&mut self, cargo_args: Vec<String>) -> &mut Self {
- self.cargo_args = cargo_args;
-#[derive(Debug, Clone, Serialize, Deserialize, Default)]
-pub struct BundleConfig {
- pub identifier: Option<String>,
- pub publisher: Option<String>,
- pub icon: Option<Vec<String>>,
- pub resources: Option<Vec<String>>,
- pub copyright: Option<String>,
- pub category: Option<String>,
- pub short_description: Option<String>,
- pub long_description: Option<String>,
- pub external_bin: Option<Vec<String>>,
- pub deb: Option<DebianSettings>,
- pub macos: Option<MacOsSettings>,
- pub windows: Option<WindowsSettings>,
-impl From<BundleConfig> for tauri_bundler::BundleSettings {
- fn from(val: BundleConfig) -> Self {
- tauri_bundler::BundleSettings {
- identifier: val.identifier,
- publisher: val.publisher,
- icon: val.icon,
- resources: val.resources,
- copyright: val.copyright,
- category: val.category.and_then(|c| c.parse().ok()),
- short_description: val.short_description,
- long_description: val.long_description,
- external_bin: val.external_bin,
- deb: val.deb.map(Into::into).unwrap_or_default(),
- macos: val.macos.map(Into::into).unwrap_or_default(),
- windows: val.windows.map(Into::into).unwrap_or_default(),
-pub struct DebianSettings {
- pub depends: Option<Vec<String>>,
- pub files: HashMap<PathBuf, PathBuf>,
- pub nsis: Option<NsisSettings>,
-impl From<DebianSettings> for tauri_bundler::DebianSettings {
- fn from(val: DebianSettings) -> Self {
- tauri_bundler::DebianSettings {
- depends: val.depends,
- files: val.files,
- desktop_template: None,
-pub struct WixSettings {
- pub language: Vec<(String, Option<PathBuf>)>,
- pub template: Option<PathBuf>,
- pub fragment_paths: Vec<PathBuf>,
- pub component_group_refs: Vec<String>,
- pub component_refs: Vec<String>,
- pub feature_group_refs: Vec<String>,
- pub feature_refs: Vec<String>,
- pub merge_refs: Vec<String>,
- pub skip_webview_install: bool,
- pub license: Option<PathBuf>,
- pub enable_elevated_update_task: bool,
- pub banner_path: Option<PathBuf>,
- pub dialog_image_path: Option<PathBuf>,
- pub fips_compliant: bool,
-impl From<WixSettings> for tauri_bundler::WixSettings {
- fn from(val: WixSettings) -> Self {
- tauri_bundler::WixSettings {
- language: tauri_bundler::bundle::WixLanguage({
- let mut languages: Vec<_> = val
- .language
- .map(|l| {
- (
- l.0.clone(),
- tauri_bundler::bundle::WixLanguageConfig {
- locale_path: l.1.clone(),
- .collect();
- if languages.is_empty() {
- languages.push(("en-US".into(), Default::default()));
- languages
- template: val.template,
- fragment_paths: val.fragment_paths,
- component_group_refs: val.component_group_refs,
- component_refs: val.component_refs,
- feature_group_refs: val.feature_group_refs,
- feature_refs: val.feature_refs,
- merge_refs: val.merge_refs,
- skip_webview_install: val.skip_webview_install,
- license: val.license,
- enable_elevated_update_task: val.enable_elevated_update_task,
- banner_path: val.banner_path,
- dialog_image_path: val.dialog_image_path,
- fips_compliant: val.fips_compliant,
-pub struct MacOsSettings {
- pub frameworks: Option<Vec<String>>,
- pub minimum_system_version: Option<String>,
- pub license: Option<String>,
- pub exception_domain: Option<String>,
- pub signing_identity: Option<String>,
- pub provider_short_name: Option<String>,
- pub entitlements: Option<String>,
- pub info_plist_path: Option<PathBuf>,
-impl From<MacOsSettings> for tauri_bundler::MacOsSettings {
- fn from(val: MacOsSettings) -> Self {
- tauri_bundler::MacOsSettings {
- frameworks: val.frameworks,
- minimum_system_version: val.minimum_system_version,
- exception_domain: val.exception_domain,
- signing_identity: val.signing_identity,
- provider_short_name: val.provider_short_name,
- entitlements: val.entitlements,
- info_plist_path: val.info_plist_path,
-pub struct WindowsSettings {
- pub digest_algorithm: Option<String>,
- pub certificate_thumbprint: Option<String>,
- pub timestamp_url: Option<String>,
- pub tsp: bool,
- pub wix: Option<WixSettings>,
- pub icon_path: Option<PathBuf>,
- pub webview_install_mode: WebviewInstallMode,
- pub webview_fixed_runtime_path: Option<PathBuf>,
- pub allow_downgrades: bool,
-impl From<WindowsSettings> for tauri_bundler::WindowsSettings {
- fn from(val: WindowsSettings) -> Self {
- tauri_bundler::WindowsSettings {
- digest_algorithm: val.digest_algorithm,
- certificate_thumbprint: val.certificate_thumbprint,
- timestamp_url: val.timestamp_url,
- tsp: val.tsp,
- wix: val.wix.map(Into::into),
- icon_path: val.icon_path.unwrap_or("icons/icon.ico".into()),
- webview_install_mode: val.webview_install_mode.into(),
- webview_fixed_runtime_path: val.webview_fixed_runtime_path,
- allow_downgrades: val.allow_downgrades,
- nsis: val.nsis.map(Into::into),
-pub struct NsisSettings {
- pub header_image: Option<PathBuf>,
- pub sidebar_image: Option<PathBuf>,
- pub installer_icon: Option<PathBuf>,
- pub install_mode: NSISInstallerMode,
- pub languages: Option<Vec<String>>,
- pub custom_language_files: Option<HashMap<String, PathBuf>>,
- pub display_language_selector: bool,
-impl From<NsisSettings> for tauri_bundler::NsisSettings {
- fn from(val: NsisSettings) -> Self {
- tauri_bundler::NsisSettings {
- header_image: val.header_image,
- sidebar_image: val.sidebar_image,
- installer_icon: val.installer_icon,
- install_mode: val.install_mode.into(),
- languages: val.languages,
- display_language_selector: val.display_language_selector,
- custom_language_files: None,
- template: None,
-pub enum NSISInstallerMode {
- CurrentUser,
- PerMachine,
- Both,
-impl From<NSISInstallerMode> for tauri_utils::config::NSISInstallerMode {
- fn from(val: NSISInstallerMode) -> Self {
- match val {
- NSISInstallerMode::CurrentUser => tauri_utils::config::NSISInstallerMode::CurrentUser,
- NSISInstallerMode::PerMachine => tauri_utils::config::NSISInstallerMode::PerMachine,
- NSISInstallerMode::Both => tauri_utils::config::NSISInstallerMode::Both,
-pub enum WebviewInstallMode {
- Skip,
- DownloadBootstrapper { silent: bool },
- EmbedBootstrapper { silent: bool },
- OfflineInstaller { silent: bool },
- FixedRuntime { path: PathBuf },
-impl WebviewInstallMode {
- fn into(self) -> tauri_utils::config::WebviewInstallMode {
- match self {
- Self::Skip => tauri_utils::config::WebviewInstallMode::Skip,
- Self::DownloadBootstrapper { silent } => {
- tauri_utils::config::WebviewInstallMode::DownloadBootstrapper { silent }
- Self::EmbedBootstrapper { silent } => {
- tauri_utils::config::WebviewInstallMode::EmbedBootstrapper { silent }
- Self::OfflineInstaller { silent } => {
- tauri_utils::config::WebviewInstallMode::OfflineInstaller { silent }
- Self::FixedRuntime { path } => {
- tauri_utils::config::WebviewInstallMode::FixedRuntime { path }
-impl Default for WebviewInstallMode {
- Self::OfflineInstaller { silent: false }
@@ -72,6 +72,24 @@ impl From<hyper::Error> for Error {
+impl From<dioxus_cli_config::LoadDioxusConfigError> for Error {
+ fn from(e: dioxus_cli_config::LoadDioxusConfigError) -> Self {
+ Self::RuntimeError(e.to_string())
+impl From<dioxus_cli_config::CargoError> for Error {
+ fn from(e: dioxus_cli_config::CargoError) -> Self {
+ Self::CargoError(e.to_string())
+impl From<dioxus_cli_config::CrateConfigError> for Error {
+ fn from(e: dioxus_cli_config::CrateConfigError) -> Self {
#[macro_export]
macro_rules! custom_error {
($msg:literal $(,)?) => {
@@ -4,21 +4,16 @@
pub const DIOXUS_CLI_VERSION: &str = "0.4.1";
+mod assets;
pub mod builder;
pub mod server;
pub mod tools;
pub use builder::*;
-pub mod cargo;
-pub use cargo::*;
pub mod cli;
pub use cli::*;
-pub mod config;
-pub use config::*;
pub mod error;
pub use error::*;
@@ -1,3 +1,4 @@
+use dioxus_cli_config::DioxusConfig;
use std::path::PathBuf;
use anyhow::anyhow;
@@ -48,7 +49,7 @@ async fn main() -> anyhow::Result<()> {
let _dioxus_config = DioxusConfig::load(Some(bin.clone()))
.map_err(|e| anyhow!("Failed to load Dioxus config because: {e}"))?
.unwrap_or_else(|| {
- log::warn!("You appear to be creating a Dioxus project from scratch; we will use the default config");
+ log::info!("You appear to be creating a Dioxus project from scratch; we will use the default config");
DioxusConfig::default()
@@ -5,8 +5,11 @@ use crate::{
output::{print_console_info, PrettierOptions},
setup_file_watcher,
- BuildResult, CrateConfig, Result,
+ BuildResult, Result,
use dioxus_hot_reload::HotReloadMsg;
use dioxus_html::HtmlCtx;
use dioxus_rsx::hot_reload::*;
@@ -215,9 +218,9 @@ fn start_desktop(config: &CrateConfig, skip_assets: bool) -> Result<(RAIIChild,
let result = crate::builder::build_desktop(config, true, skip_assets)?;
match &config.executable {
- | crate::ExecutableType::Example(name) => {
+ | ExecutableType::Example(name) => {
let mut file = config.out_dir.join(name);
file.set_extension("exe");
@@ -1,6 +1,9 @@
+ assets::WebAssetConfigDropGuard,
- CrateConfig, Result, WebAssetConfigDropGuard,
+ Result,
use super::{desktop, Platform};
@@ -86,7 +89,7 @@ fn build_web(serve: ConfigOptsServe, target_directory: &std::path::Path) -> Resu
None => web_config.features = Some(vec![web_feature]),
- web_config.platform = Some(crate::cfg::Platform::Web);
+ web_config.platform = Some(dioxus_cli_config::Platform::Web);
let _gaurd = FullstackWebEnvGuard::new(&web_config);
crate::cli::build::Build { build: web_config }.build(None, Some(target_directory))
@@ -1,14 +1,12 @@
-use crate::{cfg::ConfigOptsServe, BuildResult, CrateConfig, Result};
+use crate::{cfg::ConfigOptsServe, BuildResult, Result};
use cargo_metadata::diagnostic::Diagnostic;
use dioxus_core::Template;
use notify::{RecommendedWatcher, Watcher};
- path::PathBuf,
- sync::{Arc, Mutex},
+use std::sync::{Arc, Mutex};
use tokio::sync::broadcast::{self};
mod output;
@@ -27,13 +25,7 @@ async fn setup_file_watcher<F: Fn() -> Result<BuildResult> + Send + 'static>(
let mut last_update_time = chrono::Local::now().timestamp();
// file watcher: check file change
- let allow_watch_path = config
- .watcher
- .watch_path
- .unwrap_or_else(|| vec![PathBuf::from("src"), PathBuf::from("examples")]);
+ let allow_watch_path = config.dioxus_config.web.watcher.watch_path.clone();
let watcher_config = config.clone();
let mut watcher = notify::recommended_watcher(move |info: notify::Result<notify::Event>| {
@@ -1,6 +1,7 @@
use crate::server::Diagnostic;
-use crate::CrateConfig;
use colored::Colorize;
use std::process::Command;
@@ -43,25 +44,19 @@ pub fn print_console_info(
profile = config.custom_profile.as_ref().unwrap().to_string();
let hot_reload = if config.hot_reload { "RSX" } else { "Normal" };
let custom_html_file = if crate_root.join("index.html").is_file() {
"Custom [index.html]"
"Default"
- let url_rewrite = if config
- .index_on_404
- .unwrap_or(false)
- {
+ let url_rewrite = if config.dioxus_config.web.watcher.index_on_404 {
"True"
"False"
- let proxies = config.dioxus_config.web.proxy.as_ref();
+ let proxies = &config.dioxus_config.web.proxy;
if options.changed.is_empty() {
println!(
@@ -109,12 +104,10 @@ pub fn print_console_info(
println!();
println!("\t> Profile : {}", profile.green());
println!("\t> Hot Reload : {}", hot_reload.cyan());
- if let Some(proxies) = proxies {
- if !proxies.is_empty() {
- println!("\t> Proxies :");
- for proxy in proxies {
- println!("\t\t- {}", proxy.backend.blue());
+ if !proxies.is_empty() {
+ println!("\t> Proxies :");
+ for proxy in proxies {
+ println!("\t\t- {}", proxy.backend.blue());
println!("\t> Index Template : {}", custom_html_file.green());
@@ -5,7 +5,7 @@ use crate::{
output::{print_console_info, PrettierOptions, WebServerInfo},
setup_file_watcher, HotReloadState,
- BuildResult, CrateConfig, Result, WebHttpsConfig,
use axum::{
body::{Full, HttpBody},
@@ -20,6 +20,8 @@ use axum::{
Router,
use axum_server::tls_rustls::RustlsConfig;
+use dioxus_cli_config::WebHttpsConfig;
@@ -109,6 +111,9 @@ pub async fn serve(
) -> Result<()> {
let first_build_result = crate::builder::build(&config, false, skip_assets)?;
+ // generate dev-index page
+ Serve::regen_dev_page(&config, first_build_result.assets.as_ref())?;
log::info!("🚀 Starting development server...");
// WS Reload Watching
@@ -277,12 +282,7 @@ async fn setup_router(
.override_response_header(HeaderName::from_static("cross-origin-opener-policy"), coop)
.and_then(
move |response: Response<ServeFileSystemResponseBody>| async move {
- let mut response = if file_service_config
+ let mut response = if file_service_config.dioxus_config.web.watcher.index_on_404
&& response.status() == StatusCode::NOT_FOUND
let body = Full::from(
@@ -321,7 +321,7 @@ async fn setup_router(
let mut router = Router::new().route("/_dioxus/ws", get(ws_handler));
// Setup proxy
- for proxy_config in config.dioxus_config.web.proxy.unwrap_or_default() {
+ for proxy_config in config.dioxus_config.web.proxy {
router = proxy::add_proxy(router, &proxy_config)?;
@@ -335,6 +335,18 @@ async fn setup_router(
));
+ router = if let Some(base_path) = config.dioxus_config.web.app.base_path.clone() {
+ let base_path = format!("/{}", base_path.trim_matches('/'));
+ Router::new()
+ .nest(&base_path, axum::routing::any_service(router))
+ .fallback(get(move || {
+ let base_path = base_path.clone();
+ async move { format!("Outside of the base path: {}", base_path) }
+ }))
+ router
// Setup routes
router = router
.route("/_dioxus/hot_reload", get(hot_reload_handler))
@@ -438,14 +450,8 @@ fn build(config: &CrateConfig, reload_tx: &Sender<()>, skip_assets: bool) -> Res
let result = builder::build(config, true, skip_assets)?;
// change the websocket reload state to true;
// the page will auto-reload.
- if config
- .reload_html
- let _ = Serve::regen_dev_page(config, skip_assets);
+ if config.dioxus_config.web.watcher.reload_html {
+ let _ = Serve::regen_dev_page(config, result.assets.as_ref());
let _ = reload_tx.send(());