[
  {
    "path": ".github/workflows/binary-cache.yaml",
    "content": "name: Binary cache\non:\n  push:\n    branches:\n      - main\n\n  workflow_run:\n    workflows:\n      - update\n    types:\n      - completed\n    branches:\n      - main\n\npermissions:\n  contents: read\n\njobs:\n  populate:\n    name: Build and push binary cache\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Install Nix\n        uses: cachix/install-nix-action@v24\n      - name: Setup Cachix\n        uses: cachix/cachix-action@v13\n        with:\n          name: nocargo\n          authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'\n          pushFilter: '(-source$|\\.tar\\.gz)'\n\n      - name: Build cached crates\n        run: nix build .#cache --show-trace --no-update-lock-file\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "name: CI\non:\n  pull_request:\n  push:\n\n  workflow_run:\n    workflows:\n      - update\n    types:\n      - completed\n    branches:\n      - main\n\npermissions:\n  contents: read\n\njobs:\n  flake-check:\n    name: Flake check (locked)\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Install Nix\n        uses: cachix/install-nix-action@v24\n      - run: nix flake check --show-trace --no-update-lock-file\n"
  },
  {
    "path": ".github/workflows/update.yaml",
    "content": "name: Update registry\non:\n  schedule:\n    - cron: '0 3 * * *' # *-*-* 03:00:00 UTC\n\n  workflow_dispatch:\n\nenv:\n  BRANCH: main\n\npermissions:\n  contents: write\n\njobs:\n  update:\n    name: Update registry\n    runs-on: ubuntu-latest\n    env:\n      CRATES_TOML_DIR: ./crates-toml\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          rev: ${{ env.BRANCH }}\n          token: ${{ secrets.GITHUB_TOKEN }}\n      - name: Install Nix\n        uses: cachix/install-nix-action@v24\n        with:\n          nix_path: nixpkgs=channel:nixpkgs-unstable\n\n      - name: Cache fetched Cargo.toml files\n        uses: actions/cache@v3\n        with:\n          path: ${{ env.CRATES_TOML_DIR }}\n          key: crates-toml\n\n      - name: Sync crates.io database\n        run: ./scripts/cratesio-utils.py sync\n      - name: Update proc-macro crates\n        run: ./scripts/cratesio-utils.py update-proc-macro-crates\n      - name: Update lockfile of popular crates\n        run: ./scripts/cratesio-utils.py update-popular-crates\n\n      # This should be the last. So the registry locked is not earlier than references.\n      - name: Update flake\n        run: nix flake update\n\n      - name: Flake check\n        run: nix flake check --show-trace --no-update-lock-file\n\n      - name: Push changes\n        run: |\n          git config user.name github-actions\n          git config user.email github-actions@github.com\n          git add flake.lock crates-io-override/proc-macro.nix cache/Cargo.{lock,toml}\n          git commit -m \"registry: update\"\n          git push HEAD:${{ env.BRANCH }}\n"
  },
  {
    "path": ".gitignore",
    "content": "result\nresult-*\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Permission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# nocargo: Cargo in Nix\n\n🚧 *This project is under development and is not ready for production yet. APIs are subjects to change.*\n\nBuild Rust crates with *Nix Build System*.\n- **No IFDs** (import-from-derivation). See [meme](https://gist.github.com/oxalica/d3b1251eb29d10e6f3cb2005167ddcd9).\n- No `cargo` dependency during building. Only `rustc`.\n- No need for hash prefetching or code generation[^no-code-gen].\n- Crate level caching, globally shared.\n- [nixpkgs] integration for non-Rust dependencies.\n\n[^no-code-gen]: Initial template generation and `Cargo.lock` updatin don't count for \"code generation\". The former is optional, and the latter is indeed not \"code\".\n\n<details>\n<summary>Feature checklist</summary>\n\n- Binary cache\n  - [x] Top 256 popular crate versions with default features\n- Nix library\n  - [ ] Non-flake support.\n  - [x] `[workspace]`\n    - [x] `members`\n    - [ ] Auto-`members`\n    - [x] `excludes`\n      FIXME: Buggy.\n  - [ ] `resolver`\n        Currently has custom resolution algorithm, more like v2.\n  - [x] `links`\n  - [x] `[profile]`\n  - [x] `[{,dev-,build-}dependencies]`\n  - [x] `[features]`\n    - [x] Overriding API\n  - [x] `[target.<cfg>.dependencies]`\n  - [x] `[patch]`\n        Automatically supported. Since the dependency graph `Cargo.lock` currently relies on `cargo`'s generation.\n  - [ ] Cross-compilation.\n        FIXME: Buggy with proc-macros.\n- `noc` helper\n  - [x] `noc init`: Initial template `flake.nix` generation\n    - Dependency kinds\n      - [ ] `registry`\n      - [x] `registry-index`\n      - [x] `git`\n      - [x] `path` inside workspace\n      - [ ] `path` outside workspace\n    - Target detection\n      - [ ] Library\n            FIXME: Assume to always exist.\n      - [x] Binary\n      - [ ] Test\n      - [ ] Bench\n      - [ ] Example\n  - [ ] `Cargo.lock` generation and updating\n\n</details>\n\n## Start with Nix flake\n\n1. (Optional) Add binary substituters for pre-built popular crates, by either\n   - Install `cachix` and run `cachix use nocargo` ([see more detail about `cachix`](https://app.cachix.org/cache/nocargo)), or\n   - Manually add substituter `https://nocargo.cachix.org` with public key `nocargo.cachix.org-1:W6jkp5htZBA1tUdU8XHLaD7zBrIFnor0MsLhHgrJeHk=`\n1. Enter the root directory of your rust workspace or package. Currently, you should have `Cargo.lock` already created by `cargo`.\n1. Run `nix run github:oxalica/nocargo init` to generate `flake.nix`. Or write it by hand by following [the next section](#example-flake.nix-structure).\n1. Check flake outputs with `nix flake show`. Typically, the layout would be like,\n   ```\n   └───packages\n       └───x86_64-linux\n           ├───default: package 'rust_mypkg1-0.1.0'           # The \"default\" package. For workspace, it's the top-level one if exists.\n           ├───mypkg1: package 'rust_mypkg1-0.1.0'            # Crate `mypkg1` with `release` profile.\n           ├───mypkg1-dev: package 'rust_mypkg1-debug-0.1.0'  # Crate `mypkg1` with `dev` profile.\n           ├───mypkg2: package 'rust_mypkg2-0.1.0'            # etc.\n           └───mypkg2-dev: package 'rust_mypkg2-debug-0.1.0'\n   ```\n1. Run `nix build .#<pkgname>` to build your package. Built binaries (if any) will be placed in `./result/bin`, and the library will be in `./result/lib`.\n1. Have fun!\n\n## Example `flake.nix` structure for reference \n\nA template `flake.nix` with common setup are below. It's mostly the same as the generated one, except that the helper `noc` will scan the workspace and discover all external registries and git dependencies for you.\n\n```nix\n{\n  description = \"My Rust packages\";\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs\";\n    flake-utils.url = \"github:numtide/flake-utils\";\n    nocargo = {\n      url = \"github:oxalica/nocargo\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n\n      # See below.\n      # inputs.registry-crates-io.follows = \"registry-crates-io\";\n    };\n\n    # Optionally, you can explicitly import crates.io-index here.\n    # So you can `nix flake update` at any time to get cutting edge version of crates,\n    # instead of waiting `nocargo` to dump its dependency.\n    # Otherwise, you can simply omit this to use the locked registry from `nocargo`,\n    # which is updated periodically.\n    # registry-crates-io = { url = \"github:rust-lang/crates.io-index\"; flake = false; };\n  };\n\n  outputs = { nixpkgs, flake-utils, nocargo, ... }@inputs:\n    flake-utils.lib.eachSystem [ \"x86_64-linux\" ] (system:\n      let\n        # The entry API to make Nix derivations from your Rust workspace or package.\n        # The output of it consists of profile names, like `release` or `dev`, each of which is\n        # a attrset of all member package derivations keyed by their package names.\n        ws = nocargo.lib.${system}.mkRustPackageOrWorkspace {\n          # The root directory, which contains `Cargo.lock` and top-level `Cargo.toml`\n          # (the one containing `[workspace]` for workspace).\n          src = ./.;\n\n          # If you use registries other than crates.io, they should be imported in flake inputs,\n          # and specified here. Note that registry should be initialized via `mkIndex`,\n          # with an optional override.\n          extraRegistries = {\n            # \"https://example-registry.org\" = nocargo.lib.${system}.mkIndex inputs.example-registry {};\n          };\n\n          # If you use crates from git URLs, they should be imported in flake inputs,\n          # and specified here.\n          gitSrcs = {\n            # \"https://github.com/some/repo\" = inputs.example-git-source;\n          };\n\n          # If some crates in your dependency closure require packages from nixpkgs.\n          # You can override the argument for `stdenv.mkDerivation` to add them.\n          #\n          # Popular `-sys` crates overrides are maintained in `./crates-io-override/default.nix`\n          # to make them work out-of-box. PRs are welcome.\n          buildCrateOverrides = with nixpkgs.legacyPackages.${system}; {\n            # Use package id format `pkgname version (registry)` to reference a direct or transitive dependency.\n            \"zstd-sys 2.0.1+zstd.1.5.2 (registry+https://github.com/rust-lang/crates.io-index)\" = old: {\n              nativeBuildInputs = [ pkg-config ];\n              propagatedBuildInputs = [ zstd ];\n            };\n\n            # Use package name to reference local crates.\n            \"mypkg1\" = old: {\n              nativeBuildInputs = [ git ];\n            };\n          };\n\n          # We use the rustc from nixpkgs by default.\n          # But you can override it, for example, with a nightly version from https://github.com/oxalica/rust-overlay\n          # rustc = rust-overlay.packages.${system}.rust-nightly_2022-07-01;\n        };\n      in rec {\n        # For convenience, we hoist derivations of `release` and `dev` profile for easy access,\n        # with `dev` packages postfixed by `-dev`.\n        # You can export different packages of your choice.\n        packages = ws.release\n          // nixpkgs.lib.mapAttrs' (name: value: { name = \"${name}-dev\"; inherit value; }) ws.dev\n          // {\n            # The \"default\" features are turned on by default.\n            # You can `override` the library derivation to enable a different set of features.\n            # Explicit overriding will disable \"default\", unless you manually include it.\n            mypkg1-with-custom-features = (ws.release.mypkg1.override {\n              # Enables two features (and transitive ones), and disables \"default\".\n              features = [ \"feature1\" \"feature2\" ]; \n            }).bin;\n          };\n      });\n}\n```\n\n## FAQ\n\n### Comparison with [cargo2nix] and [naersk]?\n\nMain differences are already clarified [on the top](#nocargo%3A-cargo-in-nix).\n\n`nocargo` is inspired by `cargo2nix` and `buildRustCrate` in `nixpkgs`. We are more like `cargo2nix` while the generation part is implemented by pure Nix, but less like `naersk` which is a wrapper to call `cargo` to build the package inside derivations.\n\nIn other words, we and `cargo2nix` use Nix as a *Build System*, while `nearsk` use Nix as a *Package Manager* or *Packager*.\n\n<details>\n<summary>\nDetail comparison of nocargo, cargo2nix/buildRustCrate, naersk and buildRustPackage\n\n</summary>\n\n| | nocargo | [cargo2nix]/`buildRustCrate` | [naersk] | `buildRustPackage` |\n|-|-|-|-|-|\n| Depend on `cargo` | Updating `Cargo.lock` | Updating & generating & building | Updating & vendoring & building | Building |\n| Derivation granularity | Per crate | Per crate | Per package + one dependency closure | All in one |\n| Crate level sharing | ✔️ | ✔️ | ✖ | ✖ |\n| Binary substitution per crate | ✔️ | Not implemented | ✖ | ✖ |\n| Code generation | ✖ | ✔️ | ✖ | ✖ |\n| Edit workspace & rebuild | Rebuild leaf crates | Rebuild leaf crates | Rebuild leaf crates | Refetch and rebuild all crates |\n| Edit dependencies & rebuild | Rebuild changed crates (refetch if needed) | Refetch, regenerate and rebuild changed crates | Refetch and rebuild all crates | Refetch and rebuild all crates |\n| Offline rebuild as long as | Not adding unfetched crate dependency | Not adding unfetched crate dependency | Not changing any dependencies | ✖ |\n\n</details>\n\n### But why pure Nix build system?\n\n- Sharing through fine-grained derivations between all projects, not just in one workspace.\n- Binary substitution per crate.\n  No need for global `target_dir`/`CARGO_TARGET_DIR` or [sccache].\n- Easy `nixpkgs` integration for non-Rust package dependencies, cross-compilation (planned) and package overriding.\n- More customizability: per-crate `rustc` flags tweaking, arbitrary crate patching, force dynamic linking and more.\n\n### Can I really throw away `cargo`?\n\nSorry, currently no. :crying_cat_face: Updating of `Cargo.lock` still relies on `cargo`.\nThis can happen when creating a new project or changing dependencies.\nWe are mainly using `cargo`'s SAT solver to pin down the dependency graph.\n\nIt's *possible* to implement it ourselves, but not yet, due to the complexity.\n\n## License\n\nMIT Licensed.\n\n[nixpkgs]: https://github.com/NixOS/nixpkgs\n[naersk]: https://github.com/nix-community/naersk\n[cargo2nix]: https://github.com/cargo2nix/cargo2nix\n[sccache]: https://github.com/mozilla/sccache\n"
  },
  {
    "path": "build-rust-crate/builder-bin.sh",
    "content": "source $stdenv/setup\nsource $builderCommon\n\ndeclare -A buildFlagsMap\ndeclare -A binPathMap\n\ndontInstall=1\n\naddBin() {\n    local name=\"$1\" path=\"$2\" binEdition=\"$3\"\n    local -a pathCandidates\n\n    if [[ -z \"$name\" ]]; then\n        echo \"Name of the binary target is not specified\"\n        exit 1\n    fi\n\n    if [[ -n \"$path\" ]]; then\n        pathCandidates=(\"$path\")\n    else\n        pathCandidates=()\n        if [[ -f \"src/bin/$name.rs\" ]]; then\n            pathCandidates+=(\"src/bin/$name.rs\")\n        fi\n        if [[ -f \"src/bin/$name/main.rs\" ]]; then\n            pathCandidates+=(\"src/bin/$name/main.rs\")\n        fi\n        if [[ \"$name\" == \"$pkgName\" && -f \"src/main.rs\" ]]; then\n            pathCandidates+=(\"src/main.rs\")\n        fi\n    fi\n\n    case ${#pathCandidates[@]} in\n        0)\n            echo \"Cannot guess path of binary target\"\n            exit 1\n            ;;\n        1)\n            path=\"${pathCandidates[0]}\"\n            ;;\n        *)\n            echo \"Ambiguous binary target, candidate paths: ${pathCandidates[*]}\"\n            exit 1\n            ;;\n    esac\n\n    printf \"Found binary %q at %q\\n\" \"$name\" \"$path\"\n    binPathMap[\"$path\"]=1\n\n    # TODO: Other flags.\n    buildFlagsMap[\"$name\"]=\"$path --crate-name ${name//-/_} -C metadata=$rustcMeta-$name\"\n    if [[ -n \"${binEdition:=$globalEdition}\" ]]; then\n        buildFlagsMap[\"$name\"]+=\" --edition $binEdition\"\n    fi\n}\n\nconfigurePhase() {\n    runHook preConfigure\n\n    convertCargoToml\n\n    globalEdition=\"$(jq --raw-output '.package.edition // \"\"' \"$cargoTomlJson\")\"\n    pkgName=\"$(jq --raw-output '.package.name // \"\"' \"$cargoTomlJson\")\"\n\n    # For packages with the 2015 edition, the default for auto-discovery is false if at least one target is\n    # manually defined in Cargo.toml. Beginning with the 2018 edition, the default is always true.\n    # See: https://doc.rust-lang.org/cargo/reference/cargo-targets.html#target-auto-discovery\n    autoDiscovery=\n    if [[\n        \"$(jq --raw-output '.package.autobins' \"$cargoTomlJson\")\" != false &&\n        ( \"${globalEdition:-2015}\" != 2015 || ${#buildFlagsMap[@]} = 0 )\n    ]]; then\n        autoDiscovery=1\n    fi\n\n    local binsStr\n    while read -r name; do\n        read -r path\n        read -r binEdition\n        addBin \"$name\" \"$path\" \"$binEdition\"\n        # Don't strip whitespace.\n    done < <(jq --raw-output '.bin // [] | .[] | .name // \"\", .path // \"\", .edition // \"\"' \"$cargoTomlJson\")\n\n    if [[ -n \"$autoDiscovery\" ]]; then\n        if [[ -f src/main.rs && -z ${binPathMap[src/main.rs]} ]]; then\n            addBin \"$pkgName\" src/main.rs \"\"\n        fi\n        local f name\n        for f in src/bin/*; do\n            name=\"${f##*/}\"\n            if [[ \"$f\" = *.rs && -f \"$f\" ]]; then\n                [[ -n \"${binPathMap[\"$f\"]}\" ]] || addBin \"${name%.rs}\" \"$f\" \"\"\n            elif [[ -f \"$f/main.rs\" ]]; then\n                [[ -n \"${binPathMap[\"$f/main.rs\"]}\" ]] || addBin \"$name\" \"$f/main.rs\" \"\"\n            fi\n        done\n    fi\n\n    if [[ ${#buildFlagsMap[@]} = 0 ]]; then\n        echo \"No binaries to be built\"\n        mkdir $out\n        exit 0\n    fi\n\n    # Implicitly link library of current crate, if exists.\n    if [[ -e \"$libDevDrv\"/lib ]]; then\n        addExternFlags buildFlagsArray link \"::$libOutDrv:$libDevDrv\"\n    fi\n\n    # Actually unused.\n    declare -a cdylibBuildFlagsArray\n\n    addExternFlags buildFlagsArray link $dependencies\n    addFeatures buildFlagsArray $features\n    importBuildOut buildFlagsArray cdylibBuildFlagsArray \"$buildDrv\"\n    setCargoCommonBuildEnv\n\n    depsClosure=\"$(mktemp -d)\"\n    collectTransDeps \"$depsClosure\" $dependencies\n    buildFlagsArray+=(-Ldependency=\"$depsClosure\")\n\n    runHook postConfigure\n}\n\nbuildPhase() {\n    runHook preBuild\n\n    mkdir -p $out/bin\n\n    local binName\n    for binName in \"${!buildFlagsMap[@]}\"; do\n        export CARGO_CRATE_NAME=\"$binName\"\n        export CARGO_BIN_NAME=\"$binName\"\n        runRustc \"Building binary $binName\" \\\n            ${buildFlagsMap[\"$binName\"]} \\\n            --crate-type bin \\\n            --out-dir $out/bin \\\n            $buildFlags \\\n            \"${buildFlagsArray[@]}\"\n    done\n\n    runHook postBuild\n}\n\ngenericBuild\n"
  },
  {
    "path": "build-rust-crate/builder-build-script.sh",
    "content": "source $stdenv/setup\nsource $builderCommon\nshopt -s nullglob\n\npreInstallPhases+=\"runBuildScriptPhase \"\n\nbuildFlagsArray+=( -Cmetadata=\"$rustcMeta\" )\n\nconfigurePhase() {\n    runHook preConfigure\n\n    convertCargoToml\n\n    buildScriptSrc=\"$(jq --raw-output '.package.build // \"\"' \"$cargoTomlJson\")\"\n    if [[ -z \"$buildScriptSrc\" && -e build.rs ]]; then\n        buildScriptSrc=build.rs\n    elif [[ -z \"$buildScriptSrc\" ]]; then\n        echo \"No build script, doing nothing\"\n        mkdir -p $out\n        exit 0\n    fi\n\n    edition=\"$(jq --raw-output '.package.edition // \"\"' \"$cargoTomlJson\")\"\n    if [[ -n \"$edition\" ]]; then\n        buildFlagsArray+=(--edition=\"$edition\")\n    fi\n\n    addFeatures buildFlagsArray $features\n    addExternFlags buildFlagsArray link $dependencies\n    setCargoCommonBuildEnv\n\n    depsClosure=\"$(mktemp -d)\"\n    collectTransDeps \"$depsClosure\" $dependencies\n    buildFlagsArray+=(-Ldependency=\"$depsClosure\")\n\n    runHook postConfigure\n}\n\nbuildPhase() {\n    runHook preBuild\n\n    mkdir -p $out/bin\n\n    runRustc \"Building build script\" \\\n        \"$buildScriptSrc\" \\\n        --out-dir=\"$out/bin\" \\\n        --crate-name=\"build_script_build\" \\\n        --crate-type=bin \\\n        --emit=link \\\n        -Cembed-bitcode=no \\\n        $buildScriptBuildFlags \\\n        \"${buildFlagsArray[@]}\"\n\n    runHook postBuild\n}\n\nrunBuildScriptPhase() {\n    runHook preRunBuildScript\n\n    export CARGO_MANIFEST_DIR=\"$(pwd)\"\n    if [[ -n \"$links\" ]]; then\n        export CARGO_MANIFEST_LINKS=\"$links\"\n    fi\n\n    for feat in $features; do\n        feat_uppercase=\"${feat^^}\"\n        export \"CARGO_FEATURE_${feat_uppercase//-/_}\"=1\n    done\n\n    export OUT_DIR=\"$out/rust-support/out-dir\"\n    export NUM_JOBS=$NIX_BUILD_CORES\n    export RUSTC_BACKTRACE=1 # Make debugging easier.\n\n    local buildOut\n    for buildOut in $linksDependencies; do\n        if [[ -e \"$buildOut/rust-support/links-metadata\" ]]; then\n            source \"$buildOut/rust-support/links-metadata\"\n        fi\n    done\n\n    # Other flags are set outside.\n    # - CARGO_CFG_<cfg>\n    # - HOST\n    # - TARGET\n    # - RUSTC\n    # - CARGO\n    # - RUSTDOC\n\n    mkdir -p \"$out/rust-support\" \"$OUT_DIR\"\n\n    echo \"Running build script\"\n    stdoutFile=\"$out/rust-support/build-stdout\"\n    \"$out/bin/build_script_build\" | tee \"$stdoutFile\"\n\n    runHook postRunBuildScript\n}\n\ninstallPhase() {\n    runHook preInstall\n\n    # https://doc.rust-lang.org/1.61.0/cargo/reference/build-scripts.html#outputs-of-the-build-script\n    local line rhs\n    while read -r line; do\n        rhs=\"${line#*=}\"\n        case \"$line\" in\n            cargo:rerun-if-changed=*|cargo:rerun-if-env-changed=*)\n                # Ignored due to the sandbox.\n                ;;\n            cargo:rustc-link-arg=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-link-args\"\n                ;;\n            cargo:rustc-link-arg-bin=*)\n                if [[ \"$rhs\" != *=* ]]; then\n                    echo \"Missing binary name: $line\"\n                    exit 1\n                fi\n                echo \"-Clink-arg=${rhs%%=*}\" >>\"$out/rust-support/rustc-link-args-bin-${rhs#*=}\"\n                ;;\n            cargo:rustc-link-arg-bins=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-link-args-bins\"\n                ;;\n            cargo:rustc-link-arg-tests=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-link-args-tests\"\n                ;;\n            cargo:rustc-link-arg-examples=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-link-args-examples\"\n                ;;\n            cargo:rustc-link-arg-benches=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-link-args-benches\"\n                ;;\n            cargo:rustc-link-lib=*)\n                if [[ -z \"$rhs\" ]]; then\n                    echo \"Empty link path: $line\"\n                    exit 1\n                fi\n                echo \"-l$rhs\" >>\"$out/rust-support/rustc-flags\"\n                ;;\n            cargo:rustc-link-search=*)\n                if [[ -z \"$rhs\" ]]; then\n                    echo \"Empty link path: $line\"\n                    exit 1\n                fi\n                echo \"-L$rhs\" >>\"$out/rust-support/rustc-flags\"\n                ;;\n            cargo:rustc-flags=*)\n                local flags i flag\n                read -r -a flags <<<\"$rhs\"\n                for (( i = 0; i < ${#flags[@]}; i++ )); do\n                    flag=\"${flags[i]}\"\n                    if [[ \"$flag\" = -[lL] ]]; then\n                        (( i++ ))\n                        flag+=\"${flags[i]}\"\n                    elif [[ \"$flag\" != -[lL]* ]]; then\n                        echo \"Only -l and -L are allowed from build script: $line\"\n                        exit 1\n                    fi\n                    if [[ ${#flag} == 2 ]]; then\n                        echo \"Empty link path: $line\"\n                        exit 1\n                    fi\n                    echo \"$flag\" >>\"$out/rust-support/rustc-flags\"\n                done\n                ;;\n            cargo:rustc-cfg=*)\n                echo \"--cfg=$rhs\" >>\"$out/rust-support/rustc-flags\"\n                ;;\n            cargo:rustc-env=*=*)\n                printf 'export %q=%q\\n' \"${rhs%%=*}\" \"${rhs#*=}\" >>\"$out/rust-support/rustc-env\"\n                ;;\n            cargo:rustc-cdylib-link-arg=*)\n                echo \"-Clink-arg=$rhs\" >>\"$out/rust-support/rustc-cdylib-flags\"\n                ;;\n            cargo:warning=*)\n                printf \"\\033[0;1;33mWarning\\033[0m: %s\\n\" \"$rhs\"\n                ;;\n            cargo:*=*)\n                if [[ -n \"${links:-}\" ]]; then\n                    rhs=\"${line#*:}\"\n                    local k=\"DEP_${links}_${rhs%%=*}\" v=\"${rhs#*=}\"\n                    k=\"${k^^}\"\n                    k=\"${k//-/_}\"\n                    printf 'export %q=%q\\n' \"$k\" \"$v\" >>\"$out/rust-support/links-metadata\"\n                else\n                    printf \"\\033[0;1;33mWarning\\033[0m: no 'links' defined in Cargo.toml, ignoring %s\" \"$line\"\n                fi\n                ;;\n            cargo:*)\n                echo \"Unknown or wrong output line: $line\"\n                exit 1\n                ;;\n            *)\n                ;;\n        esac\n    done <\"$stdoutFile\"\n\n    local file\n    for file in \"$out\"/rust-support/{rustc-*,links-metadata*}; do\n        sort \"$file\" -o \"$file\"\n    done\n\n    runHook postInstall\n}\n\ngenericBuild\n"
  },
  {
    "path": "build-rust-crate/builder-common.sh",
    "content": "declare -a buildFlagsArray\nbuildFlagsArray+=( --color=always )\n\n# Collect all transitive dependencies (symlinks).\ncollectTransDeps() {\n    local collectDir=\"$1\" line rename procMacro depOut depDev\n    mkdir -p \"$collectDir\"\n    shift\n    for line in \"$@\"; do\n        IFS=: read -r rename procMacro depOut depDev <<<\"$line\"\n        # May be empty.\n        cp --no-dereference --no-clobber -t $collectDir $depDev/rust-support/deps-closure/* 2>/dev/null || true\n    done\n}\n\naddExternFlags() {\n    local var=\"$1\" kind=\"$2\" line rename procMacro depOut depDev paths\n    shift 2\n    for line in \"$@\"; do\n        IFS=: read -r rename procMacro depOut depDev <<<\"$line\"\n\n        if [[ -n \"$procMacro\" ]]; then\n            paths=(\"$depOut\"/lib/*\"$sharedLibraryExt\")\n        elif [[ \"$kind\" == meta ]]; then\n            paths=(\"$depDev\"/lib/*.rmeta)\n        else\n            # FIXME: Currently we only link rlib.\n            paths=(\"$depOut\"/lib/*.rlib)\n        fi\n\n        if (( ${#paths[@]} == 0 )); then\n            echo \"No dependent library found for $line\"\n            exit 1\n        elif (( ${#paths[@]} > 1 )); then\n            echo \"Multiple candidate found for dependent library $line, found: ${paths[*]}\"\n            exit 1\n        fi\n        if [[ -z \"$rename\" ]]; then\n            if [[ \"${paths[0]##*/}\" =~ ^lib(.*)(-.*)(\\.rmeta|\\.rlib|\"$sharedLibraryExt\")$ ]]; then\n                rename=\"${BASH_REMATCH[1]}\"\n            else\n                echo \"Invalid library name: ${paths[0]}\"\n                exit 1\n            fi\n        fi\n        eval \"$var\"'+=(--extern=\"$rename=${paths[0]}\")'\n    done\n}\n\naddFeatures() {\n    local var=\"$1\" feat\n    shift\n    for feat in \"$@\"; do\n        eval \"$var\"'+=(--cfg=\"feature=\\\"$feat\\\"\")'\n    done\n}\n\nimportBuildOut() {\n    local var=\"$1\" cvar=\"$2\" drv=\"$3\" flags\n    [[ ! -e \"$drv/rust-support/build-stdout\" ]] && return\n\n    echo export OUT_DIR=\"$drv/rust-support/out-dir\"\n    export OUT_DIR=\"$drv/rust-support/out-dir\"\n\n    if [[ -e \"$drv/rust-support/rustc-env\" ]]; then\n        cat \"$drv/rust-support/rustc-env\"\n        source \"$drv/rust-support/rustc-env\"\n    fi\n\n    if [[ -e \"$drv/rust-support/rustc-flags\" ]]; then\n        mapfile -t flags <\"$drv/rust-support/rustc-flags\"\n        eval \"$var\"'+=(\"${flags[@]}\")'\n    fi\n\n    if [[ -e \"$drv/rust-support/rustc-cdylib-flags\" ]]; then\n        mapfile -t flags <\"$drv/rust-support/rustc-cdylib-flags\"\n        eval \"$cvar\"'+=(\"${flags[@]}\")'\n    fi\n}\n\nrunRustc() {\n    local msg=\"$1\"\n    shift\n    echo \"$msg: RUSTC ${*@Q}\"\n    $RUSTC \"$@\"\n}\n\nconvertCargoToml() {\n    local cargoToml=\"${1:-\"$(pwd)/Cargo.toml\"}\"\n    cargoTomlJson=\"$(mktemp \"$(dirname \"$cargoToml\")/Cargo.json.XXX\")\"\n    toml2json <\"$cargoToml\" >\"$cargoTomlJson\"\n}\n\n# https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-crates\nsetCargoCommonBuildEnv() {\n    # CARGO_CRATE_NAME is set outside since targets have individual crate names.\n\n    # export CARGO=\n    CARGO_MANIFEST_DIR=\"$(dirname \"$cargoTomlJson\")\"\n    export CARGO_MANIFEST_DIR\n\n    CARGO_PKG_NAME=\"$(jq --raw-output '.package.name // \"\"' \"$cargoTomlJson\")\"\n    CARGO_PKG_VERSION=\"$(jq --raw-output '.package.version // \"\"' \"$cargoTomlJson\")\"\n    if [[ -z \"CARGO_PKG_NAME\" ]]; then\n        echo \"Package name must be set\"\n        exit 1\n    fi\n    if [[ -z \"CARGO_PKG_VERSION\" ]]; then\n        echo \"Package version must be set\"\n        exit 1\n    fi\n\n    CARGO_PKG_AUTHORS=\"$(jq --raw-output '.package.authors // [] | join(\":\")' \"$cargoTomlJson\")\"\n    CARGO_PKG_DESCRIPTION=\"$(jq --raw-output '.package.description // \"\"' \"$cargoTomlJson\")\"\n    CARGO_PKG_HOMEPAGE=\"$(jq --raw-output '.package.homepage // \"\"' \"$cargoTomlJson\")\"\n    CARGO_PKG_LICENSE=\"$(jq --raw-output '.package.license // \"\"' \"$cargoTomlJson\")\"\n    CARGO_PKG_LICENSE_FILE=\"$(jq --raw-output '.package.\"license-file\" // \"\"' \"$cargoTomlJson\")\"\n    export CARGO_PKG_NAME CARGO_PKG_VERSION CARGO_PKG_AUTHORS CARGO_PKG_DESCRIPTION \\\n        CARGO_PKG_HOMEPAGE CARGO_PKG_LICENSE CARGO_PKG_LICENSE_FILE\n\n    if [[ \"$version\" =~ ^([0-9]+)\\.([0-9]+)\\.([0-9]+)(-([A-Za-z0-9.-]+))?(\\+.*)?$ ]]; then\n        export CARGO_PKG_VERSION_MAJOR=\"${BASH_REMATCH[1]}\"\n        export CARGO_PKG_VERSION_MINOR=\"${BASH_REMATCH[2]}\"\n        export CARGO_PKG_VERSION_PATCH=\"${BASH_REMATCH[3]}\"\n        export CARGO_PKG_VERSION_PRE=\"${BASH_REMATCH[4]}\"\n    else\n        echo \"Invalid version: $version\"\n    fi\n}\n"
  },
  {
    "path": "build-rust-crate/builder-lib.sh",
    "content": "source $stdenv/setup\nsource $builderCommon\nshopt -s nullglob\n\nbuildFlagsArray+=( -Cmetadata=\"$rustcMeta\" )\n\nconfigurePhase() {\n    runHook preConfigure\n\n    convertCargoToml\n\n    libSrc=\"$(jq --raw-output '.lib.path // \"\"' \"$cargoTomlJson\")\"\n    if [[ -z \"$libSrc\" && -e src/lib.rs ]]; then\n        libSrc=src/lib.rs\n    fi\n    if [[ ! -e \"$libSrc\" ]]; then\n        echo \"No library to be built\"\n        mkdir $out $dev\n        exit 0\n    fi\n\n    crateName=\"$(jq --raw-output '.lib.name // (.package.name // \"\" | gsub(\"-\"; \"_\"))' \"$cargoTomlJson\")\"\n    if [[ -z \"$crateName\" ]]; then\n        echo \"Package name must be set\"\n        exit 1\n    fi\n\n    edition=\"$(jq --raw-output '.package.edition // .lib.edition // \"\"' \"$cargoTomlJson\")\"\n    if [[ -n \"$edition\" ]]; then\n        buildFlagsArray+=(--edition=\"$edition\")\n    fi\n\n    mapfile -t crateTypes < <(jq --raw-output '.lib.\"crate-type\" // [\"lib\"] | .[]' \"$cargoTomlJson\")\n    cargoTomlIsProcMacro=\"$(jq --raw-output 'if .lib.\"proc-macro\" then \"1\" else \"\" end' \"$cargoTomlJson\")\"\n    if [[ \"$cargoTomlIsProcMacro\" != \"$procMacro\" ]]; then\n        echo \"Cargo.toml says proc-macro = ${cargoTomlIsProcMacro:-0} but it is built with procMacro = ${procMacro:-0}\"\n        exit 1\n    fi\n    if [[ -n \"$procMacro\" ]]; then\n        # Override crate type.\n        crateTypes=(\"proc-macro\")\n        buildFlagsArray+=(--extern=proc_macro)\n    fi\n\n    needLinkDeps=\n    buildCdylib=\n    for crateType in \"${crateTypes[@]}\"; do\n        case \"$crateType\" in\n            lib|rlib)\n                ;;\n            dylib|staticlib|proc-macro|bin)\n                needLinkDeps=1\n                ;;\n            cdylib)\n                buildCdylib=1\n                ;;\n            *)\n                echo \"Unsupported crate-type: $crateType\"\n                exit 1\n                ;;\n        esac\n    done\n    if [[ -n \"$needLinkDeps\" ]]; then\n        addExternFlags buildFlagsArray link $dependencies\n    else\n        addExternFlags buildFlagsArray meta $dependencies\n    fi\n\n    declare -a cdylibBuildFlagsArray\n    importBuildOut buildFlagsArray cdylibBuildFlagsArray \"$buildDrv\"\n    # FIXME: cargo include cdylib flags for all crate-types once cdylib is included.\n    buildFlagsArray+=( \"${cdylibBuildFlagsArray[@]}\" )\n\n    addFeatures buildFlagsArray $features\n    setCargoCommonBuildEnv\n    export CARGO_CRATE_NAME=\"$crateName\"\n\n    collectTransDeps $dev/rust-support/deps-closure $dependencies\n    buildFlagsArray+=(-Ldependency=\"$dev/rust-support/deps-closure\")\n\n    runHook postConfigure\n}\n\nbuildPhase() {\n    runHook preBuild\n\n    local crateTypesCommaSep\n    printf -v crateTypesCommaSep '%s,' \"${crateTypes[@]}\"\n    crateTypesCommaSep=\"${crateTypesCommaSep%,}\"\n\n    mkdir -p $out/lib\n    runRustc \"Building lib\" \\\n        \"$libSrc\" \\\n        --out-dir=\"$out/lib\" \\\n        --crate-name=\"$crateName\" \\\n        --crate-type=\"$crateTypesCommaSep\" \\\n        --emit=metadata,link \\\n        -Cextra-filename=\"-$rustcMeta\" \\\n        $buildFlags \\\n        \"${buildFlagsArray[@]}\"\n\n    runHook postBuild\n}\n\ninstallPhase() {\n    runHook preInstall\n\n    mkdir -p $out $bin $dev/lib $dev/rust-support/deps-closure\n\n    # May be empty.\n    mv -t $dev/lib $out/lib/*.rmeta 2>/dev/null || true\n    ln -sft $dev/rust-support/deps-closure $out/lib/* $dev/lib/* 2>/dev/null || true\n\n    runHook postInstall\n}\n\ngenericBuild\n"
  },
  {
    "path": "build-rust-crate/default.nix",
    "content": "{ lib, nocargo-lib, stdenv, buildPackages, rust, toml2json, jq }:\n{ pname\n, version\n, src\n, rustc ? buildPackages.rustc\n, links ? null\n# [ { rename = \"foo\" /* or null */; drv = <derivation>; } ]\n, dependencies ? []\n# Normal dependencies with non empty `links`, which will propagate `DEP_<LINKS>_<META>` environments to build script.\n, linksDependencies ? dependencies\n, buildDependencies ? []\n, features ? []\n, profile ? {}\n, capLints ? null\n, buildFlags ? []\n, buildScriptBuildFlags ? []\n, procMacro ? false\n\n, nativeBuildInputs ? []\n, propagatedBuildInputs ? []\n, ...\n}@args:\nlet\n  inherit (nocargo-lib.target-cfg) platformToCfgAttrs;\n\n  mkRustcMeta = dependencies: features: let\n    deps = lib.concatMapStrings (dep: dep.drv.rustcMeta) dependencies;\n    feats = lib.concatStringsSep \";\" features;\n    final = \"${pname} ${version} ${feats} ${deps}\";\n  in\n    lib.substring 0 16 (builtins.hashString \"sha256\" final);\n\n  buildRustcMeta = mkRustcMeta buildDependencies [];\n  rustcMeta = mkRustcMeta dependencies [];\n\n  # TODO: Pass target binary paths instead of drv here?\n  mkDeps = map ({ rename, drv, ... }: lib.concatStringsSep \":\" [\n    (toString rename)\n    (toString drv.procMacro)\n    drv.out\n    drv.dev\n  ]);\n  toDevDrvs = map ({ drv, ... }: drv.dev);\n\n  buildDeps = mkDeps buildDependencies;\n  libDeps = mkDeps dependencies;\n\n  builderCommon = ./builder-common.sh;\n\n  convertBool = f: t: x:\n    if x == true then t\n    else if x == false then f\n    else x;\n\n  # https://doc.rust-lang.org/cargo/reference/profiles.html\n  profileToRustcFlags = p:\n    []\n    ++ lib.optional (p.opt-level or 0 != 0) \"-Copt-level=${toString p.opt-level}\"\n    ++ lib.optional (p.debug or false != false) \"-Cdebuginfo=${if p.debug == true then \"2\" else toString p.debug}\"\n    # TODO: `-Cstrip` is not handled since stdenv will always strip them.\n    ++ lib.optional (p ? debug-assertions) \"-Cdebug-assertions=${convertBool \"no\" \"yes\" p.debug-assertions}\"\n    ++ lib.optional (p ? overflow-checks) \"-Coverflow-checks=${convertBool \"no\" \"yes\" p.debug-assertions}\"\n    ++ lib.optional (!procMacro && p.lto or false != false) \"-Clto=${if p.lto == true then \"fat\" else p.lto}\"\n    ++ lib.optional (p.panic or \"unwind\" != \"unwind\") \"-Cpanic=${p.panic}\"\n    # `incremental` is not useful since Nix builds in a sandbox.\n    ++ lib.optional (p ? codegen-units) \"-Ccodegen-units=${toString p.codegen-units}\"\n    ++ lib.optional (p.rpath or false) \"-Crpath\"\n\n    ++ lib.optional (p.lto or false == false) \"-Cembed-bitcode=no\"\n    ;\n\n  convertProfile = p: {\n    buildFlags =\n      profileToRustcFlags p\n      ++ lib.optional (capLints != null) \"--cap-lints=${capLints}\"\n      ++ buildFlags;\n\n    buildScriptBuildFlags =\n      profileToRustcFlags (p.build-override or {})\n      ++ buildScriptBuildFlags;\n\n    # Build script environments.\n    PROFILE = p.name or null;\n    OPT_LEVEL = p.opt-level or 0;\n    DEBUG = p.debug or 0 != 0;\n  };\n\n  profile' = convertProfile profile;\n  buildProfile' = convertProfile (profile.build-override or {});\n\n  commonArgs = {\n    inherit pname version src;\n\n    nativeBuildInputs = [ toml2json jq ] ++ nativeBuildInputs;\n\n    sharedLibraryExt = stdenv.hostPlatform.extensions.sharedLibrary;\n\n    inherit capLints;\n\n    RUSTC = \"${rustc}/bin/rustc\";\n  } // removeAttrs args [\n    \"pname\"\n    \"version\"\n    \"src\"\n    \"rustc\"\n    \"links\"\n    \"dependencies\"\n    \"linksDependencies\"\n    \"buildDependencies\"\n    \"features\"\n    \"profile\"\n    \"capLints\"\n    \"buildFlags\"\n    \"buildScriptBuildFlags\"\n    \"procMacro\"\n    \"nativeBuildInputs\"\n    \"propagatedBuildInputs\"\n  ];\n\n  cargoCfgs = lib.mapAttrs' (key: value: {\n    name = \"CARGO_CFG_${lib.toUpper key}\";\n    value = if lib.isList value then lib.concatStringsSep \",\" value\n      else if value == true then \"\"\n      else value;\n  }) (platformToCfgAttrs stdenv.hostPlatform);\n\n  buildDrv = stdenv.mkDerivation ({\n    name = \"rust_${pname}-${version}-build\";\n    builder = ./builder-build-script.sh;\n    inherit propagatedBuildInputs builderCommon features links;\n    rustcMeta = buildRustcMeta;\n    dependencies = buildDeps;\n\n    linksDependencies = map (dep: dep.drv.buildDrv) linksDependencies;\n\n    HOST = rust.toRustTarget stdenv.buildPlatform;\n    TARGET = rust.toRustTarget stdenv.hostPlatform;\n\n    # This drv links for `build_script_build`.\n    # So include transitively propagated upstream `-sys` crates' ld dependencies.\n    buildInputs = toDevDrvs dependencies;\n\n    # Build script may produce object files and static libraries which should not be modified.\n    dontFixup = true;\n\n  } // commonArgs // cargoCfgs // buildProfile');\n\n  libDrv = stdenv.mkDerivation ({\n    name = \"rust_${pname}-${version}\";\n\n    builder = ./builder-lib.sh;\n    outputs = [ \"out\" \"dev\" ];\n    inherit builderCommon buildDrv features rustcMeta procMacro;\n\n    # Transitively propagate upstream `-sys` crates' ld dependencies.\n    # Since `rlib` doesn't link.\n    propagatedBuildInputs = toDevDrvs dependencies ++ propagatedBuildInputs;\n\n    dependencies = libDeps;\n\n  } // commonArgs // profile');\n\n  binDrv = stdenv.mkDerivation ({\n    name = \"rust_${pname}-${version}-bin\";\n    builder = ./builder-bin.sh;\n    inherit propagatedBuildInputs builderCommon buildDrv features rustcMeta;\n\n    libOutDrv = libDrv.out;\n    libDevDrv = libDrv.dev;\n\n    # This requires linking.\n    # Include transitively propagated upstream `-sys` crates' ld dependencies.\n    buildInputs = toDevDrvs dependencies;\n\n    dependencies = libDeps;\n  } // commonArgs // profile');\n\nin\n  libDrv // {\n    build = buildDrv;\n    bin = binDrv;\n  }\n"
  },
  {
    "path": "cache/Cargo.toml",
    "content": "[package]\nname = \"cache\"\nversion = \"0.0.0\"\ndescription = \"Virtual package to reference all popular crates to be cached\"\n\n# N.B. We cannot use `={version}` since cargo doesn't allow two compatible versions of\n# the same crate appears in the dependency tree, eg. getrandom 0.2.6 and getrandom@0.2.7.\n# So we use carpet specifiers to allow merging compatible versions to the highest one currently.\n[dependencies]\naddr2line = \"0.17\"\nadler = \"1\"\nahash = \"0.7\"\naho-corasick = \"0.7\"\nansi_term = \"0.12\"\nanyhow = \"1\"\narrayref = \"0.3\"\narrayvec = \"0.7\"\narrayvec-2 = { package = \"arrayvec\", version = \"0.5\" }\nasync-stream = \"0.3\"\nasync-stream-impl = \"0.3\"\nasync-trait = \"0.1\"\natty = \"0.2\"\nautocfg = \"1\"\nbase64 = \"0.13\"\nbincode = \"1\"\nbitflags = \"1\"\nblock-buffer = \"0.10\"\nblock-buffer-2 = { package = \"block-buffer\", version = \"0.9\" }\nbstr = \"0.2\"\nbyteorder = \"1\"\nbytes = \"1\"\ncc = \"1\"\ncfg-if = \"1\"\ncfg-if-2 = { package = \"cfg-if\", version = \"0.1\" }\nchrono = \"0.4\"\nclap = \"2\"\nclap_lex = \"0.2\"\nconstant_time_eq = \"0.1\"\nconvert_case = \"0.4\"\ncore-foundation-sys = \"0.8\"\ncpufeatures = \"0.2\"\ncrc32fast = \"1\"\ncrossbeam-channel = \"0.5\"\ncrossbeam-deque = \"0.8\"\ncrossbeam-utils = \"0.8\"\ncrunchy = \"0.2\"\ncrypto-common = \"0.1\"\ncsv = \"1\"\ncsv-core = \"0.1\"\ndarling_macro = \"0.13\"\ndata-encoding = \"2\"\nderivative = \"2\"\nderive_more = \"0.99\"\ndigest = \"0.10\"\ndigest-2 = { package = \"digest\", version = \"0.9\" }\ndirs-next = \"2\"\ndirs-sys = \"0.3\"\ndirs-sys-next = \"0.1\"\neither = \"1\"\nencoding_rs = \"0.8\"\nenv_logger = \"0.9\"\nfallible-iterator = \"0.2\"\nfastrand = \"1\"\nflate2 = \"1\"\nfnv = \"1\"\nforeign-types = \"0.3\"\nforeign-types-shared = \"0.1\"\nform_urlencoded = \"1\"\nfutures = \"0.3\"\nfutures-channel = \"0.3\"\nfutures-core = \"0.3\"\nfutures-executor = \"0.3\"\nfutures-io = \"0.3\"\nfutures-macro = \"0.3\"\nfutures-sink = \"0.3\"\nfutures-task = \"0.3\"\nfutures-util = \"0.3\"\ngeneric-array = \"0.14\"\ngetrandom = \"0.2\"\ngetrandom-2 = { package = \"getrandom\", version = \"0.1\" }\ngimli = \"0.26\"\nglob = \"0.3\"\nh2 = \"0.3\"\nhalf = \"1\"\nhashbrown = \"0.12\"\nhashbrown-2 = { package = \"hashbrown\", version = \"0.11\" }\nheck = \"0.4\"\nheck-2 = { package = \"heck\", version = \"0.3\" }\nhermit-abi = \"0.1\"\nhex = \"0.4\"\nhmac = \"0.12\"\nhostname = \"0.3\"\nhttp = \"0.2\"\nhttp-body = \"0.4\"\nhttparse = \"1\"\nhttpdate = \"1\"\nhumantime = \"2\"\nhyper = \"0.14\"\nhyper-tls = \"0.5\"\nident_case = \"1\"\nidna = \"0.2\"\nindexmap = \"1\"\ninstant = \"0.1\"\nipnet = \"2\"\nitertools = \"0.10\"\nitoa = \"1\"\nitoa-2 = { package = \"itoa\", version = \"0.4\" }\njobserver = \"0.1\"\nlazy_static = \"1\"\nlazycell = \"1\"\nlibc = \"0.2\"\nlibloading = \"0.7\"\nlinked-hash-map = \"0.5\"\nlock_api = \"0.4\"\nlog = \"0.4\"\nmaplit = \"1\"\nmatch_cfg = \"0.1\"\nmatchers = \"0.1\"\nmatches = \"0.1\"\nmemchr = \"2\"\nmemoffset = \"0.6\"\nmime = \"0.3\"\nminimal-lexical = \"0.2\"\nminiz_oxide = \"0.5\"\nminiz_oxide-2 = { package = \"miniz_oxide\", version = \"0.4\" }\nmio = \"0.8\"\nmultimap = \"0.8\"\nnative-tls = \"0.2\"\nnom = \"7\"\nnum-bigint = \"0.4\"\nnum-integer = \"0.1\"\nnum-iter = \"0.1\"\nnum-traits = \"0.2\"\nnum_cpus = \"1\"\nnum_threads = \"0.1\"\nobject = \"0.29\"\nonce_cell = \"1\"\noorandom = \"11\"\nopaque-debug = \"0.3\"\nopenssl-macros = \"0.1\"\nopenssl-probe = \"0.1\"\nopenssl-sys = \"0.9\"\nparking_lot = \"0.12\"\nparking_lot-2 = { package = \"parking_lot\", version = \"0.11\" }\nparking_lot_core = \"0.9\"\nparking_lot_core-2 = { package = \"parking_lot_core\", version = \"0.8\" }\npeeking_take_while = \"0.1\"\npercent-encoding = \"2\"\nphf_shared = \"0.10\"\npin-project-lite = \"0.2\"\npin-utils = \"0.1\"\npkg-config = \"0.3\"\nppv-lite86 = \"0.2\"\nproc-macro-error = \"1\"\nproc-macro-error-attr = \"1\"\nproc-macro-hack = \"0.5\"\nproc-macro2 = \"1\"\nquick-error = \"1\"\nquote = \"1\"\nrand = \"0.8\"\nrand-2 = { package = \"rand\", version = \"0.7\" }\nrand_chacha = \"0.3\"\nrand_chacha-2 = { package = \"rand_chacha\", version = \"0.2\" }\nrand_core = \"0.6\"\nrand_core-2 = { package = \"rand_core\", version = \"0.5\" }\nrayon = \"1\"\nrayon-core = \"1\"\nregex = \"1\"\nregex-automata = \"0.1\"\nregex-syntax = \"0.6\"\nremove_dir_all = \"0.5\"\nreqwest = \"0.11\"\nring = \"0.16\"\nrustc-demangle = \"0.1\"\nrustc-hash = \"1\"\nrustc_version = \"0.4\"\nrustc_version-2 = { package = \"rustc_version\", version = \"0.2\" }\nrustls = \"0.20\"\nryu = \"1\"\nsame-file = \"1\"\nscopeguard = \"1\"\nsct = \"0.7\"\nsemver = \"0.9\"\nsemver-parser = \"0.7\"\nserde = \"1\"\nserde_cbor = \"0.11\"\nserde_derive = \"1\"\nserde_json = \"1\"\nserde_urlencoded = \"0.7\"\nsha-1 = \"0.10\"\nsha2 = \"0.10\"\nsha2-2 = { package = \"sha2\", version = \"0.9\" }\nsharded-slab = \"0.1\"\nshlex = \"1\"\nsignal-hook-registry = \"1\"\nsiphasher = \"0.3\"\nslab = \"0.4\"\nsmallvec = \"1\"\nsocket2 = \"0.4\"\nspin = \"0.5\"\nstable_deref_trait = \"1\"\nstatic_assertions = \"1\"\nstrsim = \"0.10\"\nstrsim-2 = { package = \"strsim\", version = \"0.8\" }\nsubtle = \"2\"\nsyn = \"1\"\nsynstructure = \"0.12\"\ntempfile = \"3\"\ntermcolor = \"1\"\nterminal_size = \"0.1\"\ntextwrap = \"0.15\"\ntextwrap-2 = { package = \"textwrap\", version = \"0.11\" }\nthiserror = \"1\"\nthiserror-impl = \"1\"\nthread_local = \"1\"\ntime = \"0.1\"\ntime-macros = \"0.2\"\ntinyvec = \"1\"\ntinyvec_macros = \"0.1\"\ntokio-macros = \"1\"\ntokio-native-tls = \"0.3\"\ntokio-rustls = \"0.23\"\ntokio-stream = \"0.1\"\ntokio-util = \"0.7\"\ntoml = \"0.5\"\ntower-layer = \"0.3\"\ntower-service = \"0.3\"\ntracing = \"0.1\"\ntracing-attributes = \"0.1\"\ntracing-core = \"0.1\"\ntracing-futures = \"0.2\"\ntracing-log = \"0.1\"\ntry-lock = \"0.2\"\ntypenum = \"1\"\nunicase = \"2\"\nunicode-bidi = \"0.3\"\nunicode-ident = \"1\"\nunicode-normalization = \"0.1\"\nunicode-segmentation = \"1\"\nunicode-width = \"0.1\"\nunicode-xid = \"0.2\"\nuntrusted = \"0.7\"\nurl = \"2\"\nuuid = \"1\"\nuuid-2 = { package = \"uuid\", version = \"0.8\" }\nvcpkg = \"0.2\"\nvec_map = \"0.8\"\nversion_check = \"0.9\"\nvoid = \"1\"\nwalkdir = \"2\"\nwant = \"0.3\"\nwasi = \"0.11\"\nwebpki = \"0.22\"\nwhich = \"4\"\nwinapi = \"0.3\"\nwinapi-i686-pc-windows-gnu = \"0.4\"\nwinapi-util = \"0.1\"\nwinapi-x86_64-pc-windows-gnu = \"0.4\"\nwindows-sys = \"0.36\"\nwindows_aarch64_msvc = \"0.36\"\nwindows_i686_gnu = \"0.36\"\nwindows_i686_msvc = \"0.36\"\nwindows_x86_64_gnu = \"0.36\"\nwindows_x86_64_msvc = \"0.36\"\nyaml-rust = \"0.4\"\n"
  },
  {
    "path": "cache/default.nix",
    "content": "{ writeText, mkRustPackageOrWorkspace }:\nlet\n  ws = mkRustPackageOrWorkspace {\n    src = ./.;\n  };\nin\nwriteText \"cache-paths\"\n  (toString (ws.dev.cache.dependencies ++ ws.release.cache.dependencies))\n"
  },
  {
    "path": "cache/src/lib.rs",
    "content": ""
  },
  {
    "path": "crates-io-override/default.nix",
    "content": "{ lib, pkgs }:\nlet\n  inherit (lib) optionalAttrs listToAttrs;\n  inherit (builtins) compareVersions;\n  procMacroOverrides =\n    listToAttrs\n      (map (name: {\n        inherit name;\n        value = _: { procMacro = true; };\n      }) (import ./proc-macro.nix));\nin\nwith pkgs;\nprocMacroOverrides //\n{\n  libz-sys = { features, ... }: optionalAttrs (!(features ? static)) {\n    nativeBuildInputs = [ pkg-config ];\n    propagatedBuildInputs = [ zlib ];\n  };\n\n  openssl-sys = { features, ... }: optionalAttrs (!(features ? vendored)) {\n    nativeBuildInputs = [ pkg-config ];\n    propagatedBuildInputs = [ openssl ];\n  };\n\n  proc-macro-hack = { version, ... }: {\n    procMacro = compareVersions version \"0.5.0\" >= 0;\n  };\n}\n"
  },
  {
    "path": "crates-io-override/proc-macro.nix",
    "content": "[\n\"a2kit_macro_derive\"\n\"a2lmacros\"\n\"aa-regex\"\n\"abi_stable_derive\"\n\"ability\"\n\"abistr-macros\"\n\"abomonation_derive\"\n\"abscissa_derive\"\n\"accel-derive\"\n\"accessors\"\n\"accessors-rs\"\n\"accio\"\n\"accursed-unutterable-type-id-derive\"\n\"acme-derive\"\n\"acme-macros\"\n\"act-zero-macro\"\n\"actionable-macros\"\n\"activitypub_federation_derive\"\n\"activitystreams-derive\"\n\"actix-admin-macros\"\n\"actix-auth\"\n\"actix-default-responder\"\n\"actix-easy-multipart-derive\"\n\"actix-grants-proc-macro\"\n\"actix-handler-macro\"\n\"actix-json-responder\"\n\"actix-jwt-auth-middleware-derive\"\n\"actix-macros\"\n\"actix-multipart-derive-impl\"\n\"actix-multipart-extract-derive\"\n\"actix-proc-macros\"\n\"actix-signal-derive\"\n\"actix-telegram-derive\"\n\"actix-web-codegen\"\n\"actix-web-cute-codegen\"\n\"actix-web-error-derive\"\n\"actix-web-lab-derive\"\n\"actix-web-macros\"\n\"actix_derive\"\n\"actix_header\"\n\"actix_responder_macro\"\n\"actix_telepathy_derive\"\n\"actix_validated_forms_derive\"\n\"actori-macros\"\n\"actori-web-codegen\"\n\"actori_derive\"\n\"actors-macros\"\n\"actyx_sdk_macros\"\n\"actyxos_sdk_macros\"\n\"add_getters_setters\"\n\"address-cmp\"\n\"address-literal\"\n\"adhoc_derive\"\n\"adminix_macro\"\n\"admiral-derive\"\n\"adom\"\n\"adorn\"\n\"adsabs-macro\"\n\"aegir_compile\"\n\"aegir_derive\"\n\"aeiou-macros\"\n\"aeon_derive\"\n\"af-core-proc-macros\"\n\"af-proc-macros\"\n\"af_path\"\n\"affix\"\n\"afmt\"\n\"ag-grid-derive\"\n\"agb_image_converter\"\n\"agb_macros\"\n\"agb_sound_converter\"\n\"agnostik-attributes\"\n\"agpu-macro\"\n\"agui_macros\"\n\"ahecha_macro\"\n\"aide-macros\"\n\"aingle_middleware_bytes_derive\"\n\"ak-codegen\"\n\"akin\"\n\"akita_derive\"\n\"aktrs-macros\"\n\"alacritty_config_derive\"\n\"alass-ffi-macros\"\n\"alchemy-macros\"\n\"alder-derive\"\n\"aleo-std-time\"\n\"aleo-std-timed\"\n\"alga_derive\"\n\"algorithmia-entrypoint\"\n\"alipay_derive\"\n\"alipay_macros\"\n\"aliri_braid_impl\"\n\"alkahest-proc\"\n\"alloc_counter_macro\"\n\"allochronic-util-macros\"\n\"alpaca-lexer-derive\"\n\"alphabet-macro\"\n\"alt_serde_derive\"\n\"amadeus-derive\"\n\"amadeus-parquet-derive\"\n\"ambassador\"\n\"amethyst-inspector-derive\"\n\"amethyst_derive\"\n\"amitu_macros\"\n\"amper_mac\"\n\"amplify_derive\"\n\"anansi-macros\"\n\"anchor-attribute-access-control\"\n\"anchor-attribute-account\"\n\"anchor-attribute-constant\"\n\"anchor-attribute-error\"\n\"anchor-attribute-event\"\n\"anchor-attribute-interface\"\n\"anchor-attribute-program\"\n\"anchor-attribute-state\"\n\"anchor-cereal-derive\"\n\"anchor-derive-accounts\"\n\"anchor-gen\"\n\"anchor-generate-cpi-crate\"\n\"anchor-generate-cpi-interface\"\n\"anchored-macros\"\n\"anim-derive\"\n\"annotation-rs-codegen\"\n\"ansi-colors-macro\"\n\"ansiform\"\n\"anthill-di-derive\"\n\"anu-macros\"\n\"any_ref_macro\"\n\"anyint_macros\"\n\"anykind\"\n\"anystring_macro\"\n\"aoc-runner-derive\"\n\"aoc-toolbox-derive\"\n\"aoc_codegen\"\n\"aoc_macros\"\n\"aopt-macro\"\n\"aorist_concept\"\n\"aorist_derive\"\n\"aorist_paste\"\n\"apache-avro-derive\"\n\"apdu-derive\"\n\"apecs-derive\"\n\"aper_derive\"\n\"app_route_derive\"\n\"appkit-derive\"\n\"aptos-crypto-derive\"\n\"aptos-log-derive\"\n\"aquamarine\"\n\"aquatic_toml_config_derive\"\n\"ar_pe_ce_macro\"\n\"aragog-macros\"\n\"arangoq_derive\"\n\"arbitrary-model-tests\"\n\"arcdps_codegen\"\n\"arcon_macros\"\n\"arctk-attr\"\n\"arctk-proc\"\n\"arel_macro\"\n\"arg-derive\"\n\"arg_enum_proc_macro\"\n\"argh_derive\"\n\"argio-macro\"\n\"argmin_codegen\"\n\"argopt-impl\"\n\"argser-macros\"\n\"ark-api-macros\"\n\"ark-ff-asm\"\n\"ark-ff-macros\"\n\"ark-serialize-derive\"\n\"arm7tdmi_aeabi\"\n\"arma-rs-proc\"\n\"armature-macro\"\n\"armour-derive\"\n\"arr_macro_impl\"\n\"array-const-fn-init\"\n\"array_map_derive\"\n\"arraygen\"\n\"arraygen-docfix\"\n\"arrow2_convert_derive\"\n\"artemis-codegen-proc-macro\"\n\"as-dyn-trait\"\n\"as_tuple_derive\"\n\"ascent_macro\"\n\"ascii-literal-impl\"\n\"askama-enum\"\n\"askama_derive\"\n\"asn1-rs-derive\"\n\"asn1-rs-impl\"\n\"asn1_codecs_derive\"\n\"asn1_der_derive\"\n\"asn1_derive\"\n\"asn1rs-macros\"\n\"asn_codecs_derive\"\n\"assay-proc-macro\"\n\"assemble-macros\"\n\"assemblylift-core-guest-macros\"\n\"assert-parse-register-assert-macro\"\n\"assert2-macros\"\n\"assert2ify-macros\"\n\"assert_fn\"\n\"asserter-macros\"\n\"assertify_proc_macros\"\n\"assets_manager_macros\"\n\"associated-derive\"\n\"ast2str-derive\"\n\"ast_node\"\n\"asteracea_proc-macro-definitions\"\n\"asterix-derive\"\n\"async-attributes\"\n\"async-coap-uri-macros\"\n\"async-debug-derive\"\n\"async-ecs-derive\"\n\"async-entry\"\n\"async-graphql-derive\"\n\"async-graphql-relay-derive\"\n\"async-injector-derive\"\n\"async-log-attributes\"\n\"async-metronome-attributes\"\n\"async-proto-derive\"\n\"async-recursion\"\n\"async-reply-derive\"\n\"async-std-test\"\n\"async-stream-impl\"\n\"async-test-derive\"\n\"async-trait\"\n\"async-trait-ext\"\n\"async-trait-fn\"\n\"async-trait-static\"\n\"async-trait-with-sync\"\n\"async-xml-derive\"\n\"async-zmq-derive\"\n\"async_auto_traits\"\n\"async_event_streams_derive\"\n\"async_fn-proc_macros\"\n\"async_for\"\n\"async_init\"\n\"async_object_derive\"\n\"async_static\"\n\"async_t_internal\"\n\"async_trait_proto\"\n\"ataraxy-macros\"\n\"atat_derive\"\n\"atomecs-derive\"\n\"atomic_enum\"\n\"atomic_hooks_macros\"\n\"atomic_macro\"\n\"atomig-macro\"\n\"atomize-macro\"\n\"attempted\"\n\"attribute-derive-macro\"\n\"attributes\"\n\"attribution-macros\"\n\"attrsets\"\n\"aurum_actors_macros\"\n\"autd3-traits\"\n\"authorized_derive\"\n\"auto-add-lifetimes-to-impl\"\n\"auto-args-derive\"\n\"auto-diff-macros\"\n\"auto-enum\"\n\"auto-impl-ops\"\n\"auto-trait\"\n\"auto-version\"\n\"auto_enums_core\"\n\"auto_enums_derive\"\n\"auto_from\"\n\"auto_impl\"\n\"auto_ref\"\n\"autocorrect-derive\"\n\"autocxx-macro\"\n\"autodefault\"\n\"autodiff_injector_core_derive\"\n\"autodo_helper\"\n\"autoerror\"\n\"autograph_derive\"\n\"autoimpl-derive\"\n\"autoincrement_derive\"\n\"autoload\"\n\"autolog\"\n\"automate-derive\"\n\"automato\"\n\"automato_sync\"\n\"automato_sync_non_mut\"\n\"automod\"\n\"autorand-derive\"\n\"autowired-derive\"\n\"auxtools-impl\"\n\"avalanche-macro\"\n\"avantis-utils-derive\"\n\"aversion-macros\"\n\"avocado_derive\"\n\"avr-device-macros\"\n\"awesome-glib\"\n\"awf-codegen\"\n\"awint_macros\"\n\"awmpde_derive\"\n\"awred\"\n\"aws-smt-ir-derive\"\n\"awto-macros\"\n\"axum-debug\"\n\"axum-debug-macros\"\n\"axum-derive-error\"\n\"axum-macros\"\n\"axum-route\"\n\"axum_client_derive\"\n\"ay\"\n\"azalea-block-macros\"\n\"azalea-buf-macros\"\n\"azalea-protocol-macros\"\n\"azalea-registry-macros\"\n\"azul-peek-poke-derive\"\n\"azure-functions-codegen\"\n\"azure-functions-shared-codegen\"\n\"baburu-macros\"\n\"bachue-auto_impl\"\n\"bae\"\n\"baker\"\n\"bakery-derive\"\n\"bakkesmod-macros\"\n\"banjin\"\n\"baroque\"\n\"bart_derive\"\n\"bash_builtins_macro\"\n\"basic-text-literals\"\n\"batbox-derive\"\n\"batch-codegen\"\n\"bdk-macros\"\n\"bdk-testutils-macros\"\n\"be-generust\"\n\"beamcode_derive\"\n\"bean-macro\"\n\"bearings-proc\"\n\"bee-common-derive\"\n\"below_derive\"\n\"bencher-macro\"\n\"benvolio\"\n\"bern-kernel-macros\"\n\"bern-test-macros\"\n\"beserial_derive\"\n\"best_macros\"\n\"better-bae-macros\"\n\"better-macro\"\n\"better_typeid_derive\"\n\"bevy-contrib-inspector-derive\"\n\"bevy-crevice-derive\"\n\"bevy-inspector-egui-derive\"\n\"bevy_aseprite_derive\"\n\"bevy_asset_loader_derive\"\n\"bevy_console_derive\"\n\"bevy_derive\"\n\"bevy_dioxus_macro\"\n\"bevy_discovery\"\n\"bevy_ecs_ldtk_macros\"\n\"bevy_ecs_macros\"\n\"bevy_editor_iris_derive\"\n\"bevy_encase_derive\"\n\"bevy_fallible_derive\"\n\"bevy_hecs_macros\"\n\"bevy_mod_check_filter_macros\"\n\"bevy_mod_scripting_derive\"\n\"bevy_mod_sysfail_macros\"\n\"bevy_property_derive\"\n\"bevy_proto_derive\"\n\"bevy_reflect_derive\"\n\"bevy_render_macros\"\n\"bevy_state_macros\"\n\"bevycheck\"\n\"bf-impl\"\n\"bian-proc\"\n\"big_enum_set_derive\"\n\"bigbang_derive\"\n\"bigml_derive\"\n\"bin-layout-derive\"\n\"bin_codec_derive\"\n\"binary_enclave_macro\"\n\"binary_macros_impl\"\n\"bincode-grpc-macro\"\n\"bincode_derive\"\n\"bind_it\"\n\"bindata-derive\"\n\"bindata-impl\"\n\"bingen\"\n\"binhoc_macros\"\n\"binprot_derive\"\n\"binread_derive\"\n\"binreader-macros\"\n\"binrw_derive\"\n\"binser-derive\"\n\"binserde_derive\"\n\"binver_derive\"\n\"binverse_derive\"\n\"binwrite_derive\"\n\"bio-seq-derive\"\n\"bird-machine-macros\"\n\"bird-protocol-derive\"\n\"biscuit-quote\"\n\"bit-by-bit\"\n\"bit_collection_derive\"\n\"bit_manager_derive\"\n\"bitaccess_macros\"\n\"bitbag_derive\"\n\"bitbar-derive\"\n\"bitbash-macros\"\n\"bitbuffer_derive\"\n\"bitbybit\"\n\"bitcoin-cash-code\"\n\"bitcoin-cash-script-macro\"\n\"bitcoin-script\"\n\"bitf\"\n\"bitfield-derive\"\n\"bitfield-register-macro\"\n\"bitfield-struct\"\n\"bitmask-enum\"\n\"bitmatch\"\n\"bitmath_macros\"\n\"bitpattern\"\n\"bitpatterns-proc-macro\"\n\"bitrange_plugin\"\n\"bitregions-impl\"\n\"bitset-const-macros\"\n\"bitsparrow-derive\"\n\"bitstream_reader_derive\"\n\"bitstruct_derive\"\n\"bittwiddler\"\n\"bitwrap_derive\"\n\"bitwrap_derive_extra\"\n\"bk2d-macro\"\n\"bl602-macros\"\n\"black_marlin-macros\"\n\"blackbox_derive\"\n\"blanket\"\n\"blaze-proc\"\n\"block_effects\"\n\"block_on_proc\"\n\"blocked\"\n\"blockz_derive\"\n\"bloom42_diesel_as_jsonb\"\n\"blpapi-derive\"\n\"bm-le-derive\"\n\"bma-benchmark-proc\"\n\"bmart-derive\"\n\"bmw-derive\"\n\"bointer-derive\"\n\"bolero-generator-derive\"\n\"bolt-client-macros\"\n\"bolt-proto-derive\"\n\"bondrewd-derive\"\n\"bonfida-macros\"\n\"bonsaidb-macros\"\n\"boolenum\"\n\"boomerang_derive\"\n\"border-derive\"\n\"borsh-derive\"\n\"bot-rs-core-derive\"\n\"botanist_codegen\"\n\"boulder_derive\"\n\"bounce-macros\"\n\"bounded-integer-macro\"\n\"bounded-static-derive\"\n\"box_shorthand\"\n\"boxext_derive\"\n\"bpaf_derive\"\n\"bpf-rs-macros\"\n\"bpxe-internal-macros\"\n\"brain_fuck\"\n\"bronze_derive\"\n\"brush_contracts_derive\"\n\"brush_lang_macro\"\n\"bruteforce-macros\"\n\"bstring_macros_hack\"\n\"bstringify\"\n\"btmgmt-packet-macros\"\n\"buffalo_macro\"\n\"buffering_nocopy_macro\"\n\"build-features\"\n\"build-info-proc\"\n\"build-time\"\n\"build-trie\"\n\"build_cfg_macros\"\n\"build_timestamp\"\n\"builder-pattern-macro\"\n\"buildstructor\"\n\"bullet_macros\"\n\"bunt-macros\"\n\"burn-derive\"\n\"butane_codegen\"\n\"butcher_proc_macro\"\n\"buttplug_derive\"\n\"bve-derive\"\n\"byewlma-macros\"\n\"bystr-impl\"\n\"byte-enum-derive\"\n\"byte-slab-derive\"\n\"byte-strings-proc-macro\"\n\"byte-strings-proc_macros\"\n\"byte_eater\"\n\"byte_struct_derive\"\n\"bytecheck_derive\"\n\"byteme\"\n\"bytemuck_derive\"\n\"bytepack_derive\"\n\"bytes-cast-derive\"\n\"bytes-lit\"\n\"bytestream_derive\"\n\"bytey_derive\"\n\"bytify-impl\"\n\"c-like-concat\"\n\"c2rs\"\n\"c2rust-bitfields-derive\"\n\"c2rust-macros\"\n\"c3-lang-macro\"\n\"c3p0_diesel_macro\"\n\"c_api_prefix\"\n\"c_import\"\n\"c_macros\"\n\"cache-macro\"\n\"cached_proc_macro\"\n\"cached_property\"\n\"cagra-parser\"\n\"cain\"\n\"cairo-svgpath\"\n\"calcite_proc_macros\"\n\"calculagraph\"\n\"call-trace-macro\"\n\"caller_modpath_macros\"\n\"calmio_filters\"\n\"cameleon-impl-macros\"\n\"camelpaste\"\n\"camo-derive\"\n\"can-bit-timings-proc-macro\"\n\"canadensis_derive_register_block\"\n\"canadensis_macro\"\n\"canary-macro\"\n\"candid_derive\"\n\"canonical_derive\"\n\"canrun_codegen\"\n\"cantor_macros\"\n\"capsule-macros\"\n\"captures\"\n\"carapax-codegen\"\n\"carbide_derive\"\n\"cardparse_derive\"\n\"cargho_derive\"\n\"cargo-kconfig\"\n\"cargo-snippet\"\n\"cargo-up-derive\"\n\"cargo_equip_marker\"\n\"cargo_meta_proc\"\n\"carrier-pigeon-netmsg-derive\"\n\"cascading-wasm-language\"\n\"casey\"\n\"casper-node-macros\"\n\"casper_types_derive\"\n\"cassandra_macro_derive\"\n\"casserole-derive\"\n\"cast_trait_object_macros\"\n\"castflip_derive\"\n\"castle_macro\"\n\"catalytic_macro\"\n\"catch_panic_macros\"\n\"catchr\"\n\"catinator_macros\"\n\"cbor_enhanced_derive_protocol\"\n\"cbordata-derive\"\n\"cbored-derive\"\n\"cdbc-macro\"\n\"cdds_derive\"\n\"cde_codegen\"\n\"cdefines\"\n\"cdr-encoding-size-derive\"\n\"cdrs-tokio-helpers-derive\"\n\"cdrs_helpers_derive\"\n\"cdrs_helpers_derive_temp\"\n\"celery-codegen\"\n\"celeste_derive\"\n\"cell-map-macro\"\n\"cenum\"\n\"cenum-derive\"\n\"ceres-derive\"\n\"cex_derive\"\n\"cffi-impl\"\n\"cfg-derive\"\n\"cglue-macro\"\n\"chain-cmp\"\n\"chalk-derive\"\n\"channel-server-derive\"\n\"char-lex-macro\"\n\"charify\"\n\"chassis\"\n\"chazi_macros\"\n\"checked_decimal_macro_core\"\n\"checked_expr\"\n\"checkers-macros\"\n\"checkout_server_derive\"\n\"chekov_macros\"\n\"cherry-derive\"\n\"chia_streamable_macro\"\n\"chikatetsu-macros\"\n\"choices-derive\"\n\"chrome-native-macros\"\n\"chronobreak_derive\"\n\"chrony-candm-derive\"\n\"circus_test\"\n\"citerne-derive\"\n\"ckb-fixed-hash-macros\"\n\"ckb-migration-template\"\n\"ckb-occupied-capacity-macros\"\n\"cl-traits-derive\"\n\"clams-derive\"\n\"clap-handler-derive\"\n\"clap-vergen-macro\"\n\"clap_derive\"\n\"clap_derive-v3\"\n\"clapi_internal\"\n\"clapi_macros\"\n\"clapme_derive\"\n\"clean-macro-docs\"\n\"cleu-orm-derive\"\n\"cli-editor\"\n\"cli-errors-macros\"\n\"cli-table-derive\"\n\"cli-toolbox\"\n\"clickhouse-derive\"\n\"clickrs_proc_macro\"\n\"clightningrpc-plugin-macros\"\n\"climer_derive\"\n\"clingo-derive\"\n\"clippy-mini-macro-test\"\n\"clone-fields-derive\"\n\"clone_cell_derive\"\n\"clone_dyn_meta\"\n\"closure-pass\"\n\"clouseau_macros\"\n\"cmd-derive\"\n\"cmd_lib_cf_macros\"\n\"cmd_lib_macros\"\n\"cmd_wrk_macros\"\n\"cmdargs-macros\"\n\"cmdparse-derive\"\n\"cmdr_macro\"\n\"cntrlr-macros\"\n\"code-hasher\"\n\"code-sandwich-crates-io-release-test-macros\"\n\"code-tour\"\n\"code_snippet_generator\"\n\"codesnip_attr\"\n\"codespan-derive-proc\"\n\"coerce-macros\"\n\"coffer-macros\"\n\"coi-actix-web-derive\"\n\"coi-derive\"\n\"coi-rocket-derive\"\n\"coil_proc_macro\"\n\"col_proc_macros_impl\"\n\"collections-fromstr\"\n\"color-hex\"\n\"color-macro\"\n\"color-print-proc-macro\"\n\"column_derive\"\n\"column_store_proc_macros\"\n\"com_macros\"\n\"combination-err\"\n\"comet-rs-impl\"\n\"command-macros-plugin\"\n\"command_attr\"\n\"commander-macros\"\n\"commandy_macros\"\n\"comn-pms\"\n\"compact_macros\"\n\"compact_sql\"\n\"comparable_derive\"\n\"comparable_helper\"\n\"compare_by_address_derive\"\n\"compile-ints\"\n\"compile-time-crc32-impl\"\n\"compile-time-create-file\"\n\"compile-time-lisp\"\n\"compile-time-lua-bind-hash\"\n\"compile-time-run\"\n\"compile-time-run-macro\"\n\"compile_ops\"\n\"compiled-uuid\"\n\"compiler-tools-derive\"\n\"compiletime\"\n\"completion-macro\"\n\"component_group_derive\"\n\"compose-derive\"\n\"compound-error\"\n\"comprehension\"\n\"comprez_macro\"\n\"comptime\"\n\"concat-arrays\"\n\"concat-idents\"\n\"concat_strs_impl\"\n\"concision-derive\"\n\"concision-macros\"\n\"concordium-contracts-common-derive\"\n\"concordium-std-derive\"\n\"concourse-resource-derive\"\n\"condition-derive\"\n\"conditional_impl\"\n\"config-derive\"\n\"config_parser_derive\"\n\"configr_derive\"\n\"configure_derive\"\n\"configurs_derive\"\n\"confique-macro\"\n\"conflagrate-macros\"\n\"conform-derive\"\n\"conformance\"\n\"confql-proc-macro\"\n\"confu_derive\"\n\"conniecs-derive\"\n\"conrod_derive\"\n\"consecuit_macros\"\n\"const-array-attrs\"\n\"const-c-str-impl\"\n\"const-default-derive\"\n\"const-enum\"\n\"const-enum-tools-derive\"\n\"const-field-offset-macro\"\n\"const-gen-derive\"\n\"const-random-macro\"\n\"const-regex\"\n\"const-source-position\"\n\"const-table\"\n\"const-tweaker-attribute\"\n\"const_cge_macro\"\n\"const_fn\"\n\"const_format_proc_macros\"\n\"const_guards_attribute\"\n\"const_internals\"\n\"const_num_bigint_derive\"\n\"const_panic_proc_macros\"\n\"const_strum\"\n\"const_trait_impl\"\n\"constant-cstr\"\n\"constany_blank\"\n\"constany_stage_one\"\n\"constany_stage_two\"\n\"constduck-procmacro\"\n\"constexpr-macros\"\n\"constlua\"\n\"constrainer\"\n\"constructor-macro\"\n\"consulrs_derive\"\n\"context-attribute\"\n\"continuation-router-syn\"\n\"contraband_codegen\"\n\"contracts\"\n\"contrail-derive\"\n\"controlled-option-macros\"\n\"contructor-derive\"\n\"converge_derive\"\n\"converge_test\"\n\"convert-enum\"\n\"convert-js-macros\"\n\"convert_by_name\"\n\"convey_derive\"\n\"cooked-waker-derive\"\n\"core_extensions_proc_macros\"\n\"corewars-parser-macro\"\n\"cornetto\"\n\"corresponding-macros\"\n\"cortex-m-funnel-macros\"\n\"cortex-m-rt-macros\"\n\"cortex-m-rtfm-macros\"\n\"cortex-m-rtic-macros\"\n\"cosmian-wit-bindgen-rust-impl\"\n\"cosmic-macros\"\n\"cosmic-macros-primitive\"\n\"cosmwasm-derive\"\n\"cosmwasm-schema-derive\"\n\"couch_rs_derive\"\n\"count-macro\"\n\"count-tys\"\n\"count_tts\"\n\"counting-macros\"\n\"courier\"\n\"coverage-helper\"\n\"covers\"\n\"cow_struct\"\n\"cpclib-macros\"\n\"cpp-inherit\"\n\"cpp_macros\"\n\"cppvtbl-macros\"\n\"cpreprocess\"\n\"cps\"\n\"cqrs_macro\"\n\"crabler_derive\"\n\"crate-_-name\"\n\"craydate-macro\"\n\"crayfish-macros\"\n\"crayfish-trace-macros\"\n\"crcany-macro\"\n\"creator-derive\"\n\"crepe\"\n\"crevice-derive\"\n\"crevice_notan-derive\"\n\"criterion-macro\"\n\"crndm_derive\"\n\"crochet_macro\"\n\"crokey-proc_macros\"\n\"crossbundle-derive\"\n\"cruiser_derive\"\n\"cryiorust_derive\"\n\"crypto-literal-macro\"\n\"cryptraits-macros\"\n\"css-loader-macros\"\n\"css-modules-macros\"\n\"css-rs-macro\"\n\"cssparser-macros\"\n\"cstr\"\n\"cstr-enum-derive\"\n\"cstr-macros\"\n\"ct-for\"\n\"ctc\"\n\"ctchi_codegen\"\n\"ctflag_derive\"\n\"ctor\"\n\"cuach-derive\"\n\"cubic-protocol-derive\"\n\"cucumber-codegen\"\n\"cucumber_rust_codegen\"\n\"cuda_std_macros\"\n\"cuneiform\"\n\"cur_macro\"\n\"cust_derive\"\n\"custom-format-macros\"\n\"custom-slice-macros\"\n\"custom_debug_derive\"\n\"cute_custom_default\"\n\"cutlass\"\n\"cvars\"\n\"cw-storage-macro\"\n\"cxx-async-macro\"\n\"cxx-qt\"\n\"cxxbridge-macro\"\n\"cyfs-base-derive\"\n\"cynic-proc-macros\"\n\"cynthia-macros\"\n\"cypher_derive\"\n\"d3-derive\"\n\"dacquiri_derive\"\n\"dade_derive\"\n\"dade_macro\"\n\"dag-cbor-derive\"\n\"daml-derive\"\n\"dapr-derive\"\n\"darkly-macros\"\n\"darksteel-codegen\"\n\"darling_macro\"\n\"darpi-code-gen\"\n\"dashu-macros\"\n\"data-encoding-macro-internal\"\n\"data-query-proc\"\n\"data-url-encode-macro-impl\"\n\"data_doc_derive\"\n\"datasize_derive\"\n\"datastore_derive\"\n\"datatest-derive\"\n\"db-derive-impl\"\n\"db-helpers-derive\"\n\"db_ip_macros\"\n\"dbfile_derive\"\n\"dbg-pls-derive\"\n\"dbi-macros\"\n\"dbstruct-derive\"\n\"dbus-async-derive\"\n\"dcc-lsystem-derive\"\n\"dd_maths_traits_macros\"\n\"ddd_dapr_derive\"\n\"dddk_macro\"\n\"de-ref\"\n\"deasync\"\n\"debcontrol_struct_derive\"\n\"debil-derive\"\n\"debug-derive\"\n\"debug-try\"\n\"debug2-derive\"\n\"debug3-derive\"\n\"debug_stub_derive\"\n\"debugger_test\"\n\"declio_derive\"\n\"decorators\"\n\"decurse_macro\"\n\"dede\"\n\"deen-proc\"\n\"deepsize_derive\"\n\"def-mod\"\n\"default-args\"\n\"default-boxed-derive\"\n\"default-conversion\"\n\"default-env\"\n\"default_kwargs\"\n\"defaults\"\n\"defile-proc_macros\"\n\"defmt-macros\"\n\"defmt-test-macros\"\n\"defs\"\n\"defunctionalize-proc-macro\"\n\"degeneric-macros\"\n\"deku_derive\"\n\"delegate\"\n\"delegate-attr\"\n\"deltastruct_proc\"\n\"deltoid-derive\"\n\"deluge-rpc-macro\"\n\"demo-hack-impl\"\n\"dendrite_macros\"\n\"dengine_derive\"\n\"deno_bindgen_macro\"\n\"deno_json_op\"\n\"deno_ops\"\n\"depcon_codegen\"\n\"deprive\"\n\"deq_macros\"\n\"deque-loader-derive\"\n\"der-oid-macro\"\n\"der_derive\"\n\"deranged-macros\"\n\"derefable\"\n\"derivate\"\n\"derivation\"\n\"derivative\"\n\"derive-adhoc-macros\"\n\"derive-aktor\"\n\"derive-collect-docs\"\n\"derive-com-impl\"\n\"derive-com-wrapper\"\n\"derive-debug-extras\"\n\"derive-deref-rs\"\n\"derive-diesel-connection\"\n\"derive-diff\"\n\"derive-dynamic-node\"\n\"derive-enum-error\"\n\"derive-enum-from-into\"\n\"derive-env-url\"\n\"derive-error\"\n\"derive-error-chain\"\n\"derive-ex\"\n\"derive-finite-automaton-derive\"\n\"derive-from-ext\"\n\"derive-getters\"\n\"derive-hex\"\n\"derive-into-owned\"\n\"derive-knet\"\n\"derive-new\"\n\"derive-newtype\"\n\"derive-object-merge\"\n\"derive-ocaml\"\n\"derive-parse\"\n\"derive-partial-eq-extras\"\n\"derive-patch\"\n\"derive-redis-json\"\n\"derive-redis-swapplex\"\n\"derive-serialize-into\"\n\"derive-syn-parse\"\n\"derive-system\"\n\"derive-try-from-primitive\"\n\"derive-where\"\n\"derive_asref\"\n\"derive_bounded\"\n\"derive_builder_macro\"\n\"derive_builder_macro_fork_arti\"\n\"derive_codec_sv2\"\n\"derive_constructor\"\n\"derive_custom_enum_traits\"\n\"derive_deref\"\n\"derive_derive\"\n\"derive_destructure\"\n\"derive_destructure2\"\n\"derive_di_macro\"\n\"derive_display_from_debug\"\n\"derive_dumb\"\n\"derive_enum_macros\"\n\"derive_from_as\"\n\"derive_jface\"\n\"derive_less\"\n\"derive_merge\"\n\"derive_miniconf\"\n\"derive_more\"\n\"derive_pod\"\n\"derive_rich\"\n\"derive_setters\"\n\"derive_type_level\"\n\"derive_weak\"\n\"derive_wrapper\"\n\"derived\"\n\"derivenum\"\n\"descent_macro\"\n\"descriptor_derive\"\n\"deser-derive\"\n\"deserialize_xml_derive\"\n\"despatma\"\n\"desse-derive\"\n\"dessert-derive\"\n\"destruct-derive\"\n\"destruct-drop-derive\"\n\"desugar\"\n\"desugar-impl\"\n\"devault\"\n\"devbox-test-args\"\n\"device-register-macro\"\n\"devise_codegen\"\n\"df_rocket_okapi_codegen\"\n\"df_st_derive\"\n\"dhall_proc_macros\"\n\"dialectic-macro\"\n\"dialoguer_macro\"\n\"dialtone_sqlx_macros\"\n\"dict_derive\"\n\"diem-crypto-derive\"\n\"diem-framework-crypto-derive\"\n\"diesel-crud-codegen\"\n\"diesel-derive-enum\"\n\"diesel-derive-more\"\n\"diesel-derive-newtype\"\n\"diesel-ease\"\n\"diesel-enum\"\n\"diesel-factories-code-gen\"\n\"diesel-selectable-macro\"\n\"diesel-sort-struct-fields\"\n\"diesel_as_jsonb\"\n\"diesel_codegen\"\n\"diesel_derive_model\"\n\"diesel_derives\"\n\"diesel_derives_extra\"\n\"diesel_enum_derive\"\n\"diesel_filter_query\"\n\"diesel_findable\"\n\"diesel_mate_derive\"\n\"diff-enum\"\n\"diff_derive\"\n\"diffus-derive\"\n\"dill-impl\"\n\"dims_derive\"\n\"diny_derive\"\n\"dionysos-derives\"\n\"dioptre-derive\"\n\"dioxus-core-macro\"\n\"dioxus-html-macro\"\n\"dioxus-native-core-macro\"\n\"dioxus-table-macro\"\n\"dioxus-use-request-macro\"\n\"dipa-derive\"\n\"diplomat\"\n\"direct-asm\"\n\"director_macros\"\n\"directree_macros\"\n\"dirmod-codegen\"\n\"dis_rs_macros\"\n\"disabled_contracts\"\n\"disarray-derive\"\n\"disarray-macros\"\n\"disc-derive\"\n\"discord_typed_interactions_proc_macro\"\n\"discrab_codegen\"\n\"discretionary\"\n\"discrim-codegen\"\n\"discrimenum\"\n\"discriminant_hash_derive\"\n\"disp\"\n\"display-as-proc-macro\"\n\"display_adapter_attr\"\n\"display_attr\"\n\"display_derive\"\n\"display_json\"\n\"display_json_derive\"\n\"displaydoc\"\n\"displaydoc-lite-proc_macros\"\n\"displaydoc-watt\"\n\"displaythis-impl\"\n\"dispose-derive\"\n\"distill-serde-importable-derive\"\n\"dizpacho\"\n\"django-query_derive\"\n\"djin-protocol-derive\"\n\"dlhn_derive\"\n\"dlopen2_derive\"\n\"dlopen_derive\"\n\"dmutils_derive\"\n\"dmv_derive\"\n\"doc-cfg\"\n\"doc-since\"\n\"doc_item\"\n\"doc_link\"\n\"docbot-derive\"\n\"dock-derive\"\n\"document-features\"\n\"docx-codegen\"\n\"dodo-derive\"\n\"dogehouse-macros\"\n\"doku-derive\"\n\"domain_derive\"\n\"dont-expand\"\n\"doodle_derive\"\n\"dos-uid-derive\"\n\"dose-derive\"\n\"dosio-macros\"\n\"dotenv_codegen_impl\"\n\"dotenv_codegen_implementation\"\n\"dotenv_config\"\n\"dotenvy_codegen_impl\"\n\"dotinstall-macro\"\n\"double-dyn\"\n\"doubter-macros\"\n\"dough\"\n\"draw_bridge_derive\"\n\"drm-macros\"\n\"drone-core-macros\"\n\"drone-cortex-m-macros\"\n\"drone-cortexm-macros\"\n\"drone-macros\"\n\"drone-riscv-macros\"\n\"drone-stm32-macros\"\n\"drone-sx1276-macros\"\n\"drop-derive\"\n\"drop_struct_macro_derive\"\n\"dropshot_endpoint\"\n\"druid-derive\"\n\"druid-lens-compose\"\n\"dry\"\n\"dtd-macro\"\n\"dtn7-codegen\"\n\"dto_derive\"\n\"dtypei-derive\"\n\"duang\"\n\"dukt-macros\"\n\"duktape-macros\"\n\"dummy\"\n\"duplicate\"\n\"dusk-proc-macros\"\n\"dxr_derive\"\n\"dylink_macro\"\n\"dyn-any-derive\"\n\"dyn-clonable-impl\"\n\"dyn-context-macro\"\n\"dyn-dyn-macros\"\n\"dyn_partial_eq_derive\"\n\"dyn_safe-proc_macros\"\n\"dyn_struct_derive\"\n\"dyn_struct_derive2\"\n\"dynamic-object-derive\"\n\"dynamize\"\n\"dynamo_mapper_macro\"\n\"dynasm\"\n\"dync-derive\"\n\"dynomite-derive\"\n\"dynpath\"\n\"e_num_derive\"\n\"ea\"\n\"easy-csv-derive\"\n\"easy-ext\"\n\"easy-jsonrpc-proc-macro\"\n\"easy-jsonrpc-proc-macro-mw\"\n\"easy-pin-proc-macro\"\n\"easy_pool_proc_macro\"\n\"easy_proc_derive\"\n\"easy_proc_macro\"\n\"ebay_derive\"\n\"ebml-iterable-specification-derive\"\n\"ebpf-kern-macros\"\n\"ebpf-user-macros\"\n\"ecal-derive\"\n\"econf-derive\"\n\"ector-macros\"\n\"ed-derive\"\n\"ed2-derive\"\n\"edgedb-derive\"\n\"edgedb-query-derive\"\n\"edgedb-sdk-macros\"\n\"edited\"\n\"edn-derive\"\n\"educe\"\n\"eff-attr\"\n\"efg\"\n\"efmt_derive\"\n\"eg_derive\"\n\"egui_inspect_derive\"\n\"eiga_builder_derive\"\n\"einops-macros\"\n\"either_trait_macro\"\n\"eko-gc-derive\"\n\"elapsed-printer\"\n\"elapsed-time\"\n\"elastic_derive\"\n\"elastic_types_derive\"\n\"elephantry-derive\"\n\"elfo-macros\"\n\"elise-derive\"\n\"elm_rs_derive\"\n\"elm_rusty\"\n\"elrond-codec-derive\"\n\"elrond-wasm-derive\"\n\"elucify\"\n\"elvis-core-support\"\n\"elvis-derive\"\n\"emacs-macros\"\n\"embed-doc-image\"\n\"embed_js_derive\"\n\"embedded-error-chain-macros\"\n\"embedded-layout-macros\"\n\"embedded-profiling-proc-macros\"\n\"embeddir\"\n\"empty_type_derive\"\n\"emu_glsl\"\n\"emu_macro\"\n\"emv-qrcps-derive\"\n\"encase_derive\"\n\"encdec-macros\"\n\"encoding-asn1-derive\"\n\"encrypted_id_derive\"\n\"encryption-macros-encryption\"\n\"encryption-macros-key-generation\"\n\"endian_codec_derive\"\n\"endian_trait_derive\"\n\"endiannezz_derive\"\n\"eng-wasm-derive\"\n\"enpow\"\n\"ensicoin_serializer_derive\"\n\"enso-shapely-macros\"\n\"entity-async-graphql-macros\"\n\"entity-gym-derive\"\n\"entity_macros\"\n\"entity_noop_macros\"\n\"entrait_macros\"\n\"entrance_derive\"\n\"enum-as-derive\"\n\"enum-as-inner\"\n\"enum-assoc\"\n\"enum-display-derive\"\n\"enum-each-variant-derive\"\n\"enum-error-derive\"\n\"enum-flags\"\n\"enum-group\"\n\"enum-iterator-derive\"\n\"enum-kinds\"\n\"enum-kinds-macros\"\n\"enum-lexer-macro\"\n\"enum-map-derive\"\n\"enum-methods\"\n\"enum-ordinalize\"\n\"enum-other\"\n\"enum-primitive-derive\"\n\"enum-primitive-derive-nostd\"\n\"enum-repr\"\n\"enum-repr-derive\"\n\"enum-tags-macros\"\n\"enum-tryfrom-derive\"\n\"enum-utils\"\n\"enum-variants-strings-derive\"\n\"enum_access\"\n\"enum_coder\"\n\"enum_const_derive\"\n\"enum_const_value\"\n\"enum_cycling_derive\"\n\"enum_default\"\n\"enum_derive_list\"\n\"enum_dispatch\"\n\"enum_for_matches\"\n\"enum_from_str_derive\"\n\"enum_index_derive\"\n\"enum_kind\"\n\"enum_like_derive\"\n\"enum_pipeline_derive\"\n\"enum_to_enum_derive\"\n\"enum_to_str_derive\"\n\"enum_to_u8_slice_derive\"\n\"enum_traits_macros\"\n\"enum_variant_macros_macros\"\n\"enum_variant_type\"\n\"enumber\"\n\"enumer_derive\"\n\"enumerare-macros\"\n\"enumerate\"\n\"enumflags2_derive\"\n\"enumflags_derive\"\n\"enumn\"\n\"enumoid_derive\"\n\"enumscribe_derive\"\n\"enumset_derive\"\n\"enumx_derive\"\n\"env-cast\"\n\"env-config\"\n\"env_ast\"\n\"env_derive\"\n\"env_proc\"\n\"envconf_derive\"\n\"envconfig_derive\"\n\"envcrypt-macro\"\n\"envdot\"\n\"envir_derive\"\n\"envload_derive\"\n\"envopt-derive\"\n\"eosio-macro\"\n\"eosio-scale-info-derive\"\n\"eosio_bytes_derive\"\n\"eosio_macros_internal\"\n\"eosio_numstr_macros_impl\"\n\"ephem_derive\"\n\"epics-sys\"\n\"epoxy_macros\"\n\"epp-client-macros\"\n\"equalia\"\n\"eraserhead-derive\"\n\"ergo-pin\"\n\"ergo_headless_dapp_framework_derive\"\n\"ergol_proc_macro\"\n\"erl_nif_macro\"\n\"err-derive\"\n\"err-gen\"\n\"err-per-field-derive\"\n\"errer_derive\"\n\"erroneous-derive\"\n\"error-chain-mini-derive\"\n\"error-chain-utils\"\n\"error-gen\"\n\"error-rules\"\n\"error-stack-derive\"\n\"error-stack-macros\"\n\"error-utils-derive\"\n\"error_generator\"\n\"error_spanned_derive\"\n\"errorderive\"\n\"erst-derive\"\n\"escher-derive\"\n\"esize\"\n\"esp-hal-procmacros\"\n\"esp32-hal-proc-macros\"\n\"esp8266-hal-proc-macros\"\n\"espr-derive\"\n\"essrpc_macros\"\n\"etanol_macros\"\n\"eternal-macro\"\n\"eth2_ssz_derive\"\n\"eth_event_macro\"\n\"eth_pairings_repr_derive\"\n\"ethabi-derive\"\n\"ethaddr-macros\"\n\"ethanol-derive\"\n\"ethcontract-derive\"\n\"ethdigest-macros\"\n\"ethercat-derive\"\n\"ethers-contract-derive\"\n\"ethers-derive-eip712\"\n\"ethnum-macros\"\n\"eu\"\n\"euclid_macros\"\n\"euphony-core-macros\"\n\"euphony-macros\"\n\"ev3dev-lang-rust-derive\"\n\"ev3robot_macros\"\n\"eva-sdk-derive\"\n\"evegfx-macros\"\n\"eventmill_derive\"\n\"eventsourcing-derive\"\n\"ever-macro\"\n\"every_variant_macro\"\n\"everyday_macros\"\n\"evitable-derive\"\n\"evm-precompiles-derive\"\n\"evmap-derive\"\n\"evmc-declare\"\n\"exclusive\"\n\"exec_time\"\n\"executor-macros\"\n\"exhaust-macros\"\n\"exit_status\"\n\"exocore-apps-macros\"\n\"exonum-derive\"\n\"exotic_macro\"\n\"expand\"\n\"expectation_plugin\"\n\"expose\"\n\"expression_format_impl\"\n\"expry_macros\"\n\"ext-php-rs-derive\"\n\"ext-trait-proc_macros\"\n\"extargsparse_codegen\"\n\"extdot-impl\"\n\"extend\"\n\"extends-rs\"\n\"extension-trait\"\n\"extprim_literals_macros\"\n\"extra_args\"\n\"ez-proc-macro\"\n\"ezinput_macros\"\n\"ezjsonrpc-macros\"\n\"ezmenu-derive\"\n\"ezmenu-macros\"\n\"f128_input\"\n\"f64ad_core_derive\"\n\"fabric-support-procedural\"\n\"fabric-support-procedural-tools-derive\"\n\"fabric_contract_macros\"\n\"factori-impl\"\n\"factory_steel_derive\"\n\"fail_on_ci\"\n\"failure_derive\"\n\"failure_derive_without_backtrace\"\n\"fake_serialize\"\n\"fallacy-clone-derive\"\n\"fallback-derive\"\n\"fancy\"\n\"fantasy-cpu-emulator-macros\"\n\"far_macros\"\n\"fast-map-derive\"\n\"fast-rustc-ap-rustc_macros\"\n\"fast_new_type\"\n\"fast_tuple\"\n\"fastcrypto-derive\"\n\"fasters_derive\"\n\"fastly-macros\"\n\"fastobo-derive-internal\"\n\"fastrlp-derive\"\n\"fatality-proc-macro\"\n\"fates_macro\"\n\"faux_macros\"\n\"fawkes-crypto_derive\"\n\"fax_derive\"\n\"fbinit_macros\"\n\"fbthrift_codegen_includer_proc_macro\"\n\"fce-timestamp-macro\"\n\"fefix_derive\"\n\"fehler-macros\"\n\"feign-macros\"\n\"feignhttp-codegen\"\n\"fem-macros\"\n\"feo-oop-engine-proc-macros\"\n\"feos-derive\"\n\"ferric-macros\"\n\"ferris-extensions\"\n\"ferris-gc-proc-macro\"\n\"festive-macros\"\n\"ff-derive-num\"\n\"ff-uint_derive\"\n\"ff_derive\"\n\"ff_derive-zeroize\"\n\"ff_derive_ce\"\n\"fff_derive\"\n\"ffi-convert-derive\"\n\"ffi-export-proc-macro\"\n\"ffi-gen-macro\"\n\"ffishim_derive\"\n\"ffizz-macros\"\n\"fi-night\"\n\"field-derive\"\n\"field_accessor\"\n\"field_count_derive\"\n\"field_names\"\n\"field_types\"\n\"fieldfilter-derive\"\n\"fieldmask_derive\"\n\"fields-converter-derive\"\n\"fieldwise\"\n\"fievar\"\n\"file-metadata-mditem-macros\"\n\"finchers-derive\"\n\"finite_repr_derive\"\n\"finiteelement_macros\"\n\"finny_derive\"\n\"finte-derive\"\n\"fire-rs-core\"\n\"fitsio-derive\"\n\"fix-hidden-lifetime-bug-proc_macros\"\n\"fix-rs-macros\"\n\"fixed-codec-derive\"\n\"fixed-macro-impl\"\n\"fixed-map-derive\"\n\"fixed-point-macros\"\n\"fixed_len_str\"\n\"fixed_typemap_macros\"\n\"fixed_width_derive\"\n\"fj-proc\"\n\"flag-mast-derive\"\n\"flaggy-codegen\"\n\"flaky_test\"\n\"flarie_macros\"\n\"flat-bytes-derive\"\n\"flatk-derive\"\n\"flatty-macros\"\n\"flax-derive\"\n\"flexiber_derive\"\n\"flexible-locks_derive\"\n\"flexpiler_derive\"\n\"flickr_derive\"\n\"float_eq_derive\"\n\"floccus-proc\"\n\"flow_impl_derive\"\n\"flow_macro\"\n\"flowmacro\"\n\"flowutils\"\n\"fltk-derive\"\n\"fltk-form-derive\"\n\"fluence-fork-libp2p-core-derive\"\n\"fluence-fork-libp2p-swarm-derive\"\n\"fluence-sdk-macro\"\n\"fluence-sdk-test-macro\"\n\"fluent-impl\"\n\"fluent-template-macros\"\n\"fluid_attributes\"\n\"fluidity-derive\"\n\"fluidity-macros\"\n\"flutter_rust_bridge_macros\"\n\"fluvio-protocol-derive\"\n\"fluvio-smartmodule-derive\"\n\"fluvio-smartstream-derive\"\n\"fluvio-test-derive\"\n\"fmt-derive-proc\"\n\"fn-error-context\"\n\"fn-fixture\"\n\"fn_abi\"\n\"fn_has_this\"\n\"fn_mut\"\n\"fn_once\"\n\"fn_type_alias\"\n\"fncmd-impl\"\n\"fnsql-macro\"\n\"fnum-derive\"\n\"fold_impls\"\n\"fondant_derive\"\n\"for_any\"\n\"for_ch\"\n\"foreign-types-macros\"\n\"foreignc_derive\"\n\"forever-rs\"\n\"formal_spec\"\n\"format-bytes-macros\"\n\"format-macro\"\n\"format_env\"\n\"former_derive\"\n\"former_meta\"\n\"formy_derive\"\n\"fort\"\n\"fortify_derive\"\n\"forward_goto\"\n\"foundationdb-macros\"\n\"four-char-code-macros-impl\"\n\"fp-bindgen-macros\"\n\"fpdec-macros\"\n\"fraco_point_derive\"\n\"fractk_macro\"\n\"frame-support-procedural\"\n\"frame-support-procedural-tools-derive\"\n\"frc42_macros\"\n\"freeze-macros\"\n\"frender-macros\"\n\"frenezulo-macros-beta\"\n\"frodobuf-derive\"\n\"from-enum-derive\"\n\"from-mapper-derive\"\n\"from-regex-macros\"\n\"from-repr-enum-derive\"\n\"from-to-repr\"\n\"from_bytes_derive\"\n\"from_file_derive\"\n\"from_hashmap\"\n\"from_int_derive\"\n\"from_remote_derive\"\n\"from_tuple\"\n\"from_value_derive\"\n\"from_variant\"\n\"from_variants_impl\"\n\"fruit-salad_proc-macro-definitions\"\n\"frunk-enum-derive\"\n\"frunk_derives\"\n\"frunk_proc_macros_impl\"\n\"fs_pro_macros\"\n\"fstrings-proc-macro\"\n\"fstrings-rust-proc-macro\"\n\"fuel-pest_derive\"\n\"fuel_codegen\"\n\"fuel_line_derive\"\n\"fuels-abigen-macro\"\n\"fui_macros\"\n\"full_moon_derive\"\n\"func_core\"\n\"func_trace\"\n\"funcmap_derive\"\n\"function-frame\"\n\"function_docs\"\n\"function_from_equation\"\n\"function_group\"\n\"function_name-proc-macro\"\n\"functionate\"\n\"funtime\"\n\"futility-try-catch\"\n\"future-union-impl\"\n\"futures-async-stream-macro\"\n\"futures-await-async-macro\"\n\"futures-await-test-macro\"\n\"futures-await-test-macro-preview\"\n\"futures-cputask-derive\"\n\"futures-derive\"\n\"futures-enum\"\n\"futures-join-macro-preview\"\n\"futures-macro\"\n\"futures-macro-async\"\n\"futures-macro-async-preview\"\n\"futures-macros-lite\"\n\"futures-net-macro\"\n\"futures-select-macro-preview\"\n\"futures-signals-structs-derive\"\n\"futurize-derive\"\n\"fuzzcheck_mutators_derive\"\n\"fuzzy-pickles-derive\"\n\"fxsm-derive\"\n\"fyrox-core-derive\"\n\"g1-macros\"\n\"g2gen\"\n\"gaclen_shader\"\n\"gallium_ecs_derive\"\n\"galvanic-mock\"\n\"game-metrics-macro\"\n\"game_kernel_ecs_derive\"\n\"gantz-derive\"\n\"gauge-mac-derive\"\n\"gazebo_derive\"\n\"gba-proc-macro\"\n\"gc-arena-derive\"\n\"gc_derive\"\n\"gcad\"\n\"gcad_proc_macros\"\n\"gcmodule_derive\"\n\"gdnative-derive\"\n\"gdnative-impl-proc-macros\"\n\"gdnative-macros\"\n\"gdrust_macros\"\n\"gekko-generator\"\n\"gem-macros\"\n\"gemachain-frozen-abi-macro\"\n\"gemachain-sdk-macro\"\n\"gen-nested-iter-yield\"\n\"gen_attributes_interface_generator\"\n\"genawaiter-proc-macro\"\n\"genco-derive\"\n\"genco-macros\"\n\"generate-derive\"\n\"generate-random-macro\"\n\"generate_sql\"\n\"generates\"\n\"generic-bytes-derive\"\n\"generic-derive\"\n\"generic-new\"\n\"generic-predicates-macro\"\n\"generic-simd-macros\"\n\"generic-tests\"\n\"generic_parameterize\"\n\"generoust\"\n\"genesis-impl\"\n\"geng-derive\"\n\"geng-ecs-derive\"\n\"geng-ui-derive\"\n\"genserver_codegen\"\n\"gensym\"\n\"gentian\"\n\"gents_derives\"\n\"geobacter-runtime-amd-macros\"\n\"geoip2-codegen\"\n\"germ-macros-impl\"\n\"get-random-const\"\n\"get-size-derive\"\n\"get_len_base_10_as_usize_macros\"\n\"get_params_derive\"\n\"getset\"\n\"getset-scoped\"\n\"getter-derive-rs\"\n\"getters-by-type\"\n\"gettext-macros\"\n\"gf256-macros\"\n\"gfaas-macro\"\n\"gff-derive\"\n\"gflags-derive\"\n\"gflags-impl\"\n\"gfx_macros\"\n\"ggplot-derive\"\n\"ghost\"\n\"ghosts-proc_macros\"\n\"giftwrap\"\n\"git-testament-derive\"\n\"git-version-macro\"\n\"git_rev\"\n\"gitarena-macros\"\n\"gitver\"\n\"glade_derive\"\n\"gladis4_proc_macro\"\n\"gladis_proc_macro\"\n\"glib-macros\"\n\"glicol_macros\"\n\"glitchup_derive\"\n\"glium_derive\"\n\"gll-macros\"\n\"gll-pg-macros\"\n\"glsl-lang-quote\"\n\"glsl-layout-derive\"\n\"glsl-quasiquote\"\n\"glsl-to-spirv-macros-impl\"\n\"glsp-proc-macros\"\n\"glsp-proc-macros2\"\n\"gltf-derive\"\n\"gluon-salsa-macros\"\n\"gluon_codegen\"\n\"gmod-macros\"\n\"go-away-derive\"\n\"goglob-proc-macro\"\n\"golang-type-decl-macro\"\n\"golang-type-macro\"\n\"golang-type-name-macro\"\n\"goldberg\"\n\"golem-rpc-macros\"\n\"goods-proc\"\n\"google-cloud-derive\"\n\"gorm_macros\"\n\"gostd_derive\"\n\"gotham_derive\"\n\"gotham_formdata_derive\"\n\"gotham_restful_derive\"\n\"gpkg-derive\"\n\"gpt3_macro\"\n\"graal-bindgen-macros\"\n\"gradients-derive\"\n\"grafana-plugin-sdk-macros\"\n\"gramatika-macro\"\n\"grammar-tech-macro\"\n\"graphannis-malloc_size_of_derive\"\n\"graphblas_sparse_linear_algebra_proc_macros\"\n\"graphite_binary_macros\"\n\"graphite_command_macros\"\n\"graphql_query_derive\"\n\"graphrpc-derive\"\n\"grass-macro\"\n\"grb-macro\"\n\"greenie-proc\"\n\"gremlin-derive\"\n\"group_derive\"\n\"grpc-build-derive\"\n\"gs11n_derive\"\n\"gsettings-macro\"\n\"gtk-blueprint\"\n\"gtk-properties-macro\"\n\"gtk-rust-app-derive\"\n\"gtk3-macros\"\n\"gtk4-macros\"\n\"gtk_liststore_item_derive\"\n\"gtmpl_derive\"\n\"guard_let\"\n\"gui-derive\"\n\"guid-macro-impl\"\n\"gull_derive\"\n\"gumdrop_derive\"\n\"gusket-codegen\"\n\"gut-derive\"\n\"gut-plugin\"\n\"guzzle-derive\"\n\"gvariant-macro\"\n\"gvdb-macros\"\n\"gxi-derive\"\n\"gxi-macros\"\n\"gxi-transpiler\"\n\"gxi_macro\"\n\"hackfn\"\n\"hacspec-attributes\"\n\"halcyon_macro_impl\"\n\"hanger\"\n\"hannibal-derive\"\n\"happi-derive\"\n\"hard-xml-derive\"\n\"harled_macro\"\n\"harmony_derive\"\n\"haru-decorator\"\n\"has_command\"\n\"hash32-derive\"\n\"hashfn\"\n\"hashmap_derive\"\n\"hazmat-macros\"\n\"hazy_derive\"\n\"hb_macros\"\n\"hcaptcha_derive\"\n\"hdf5-derive\"\n\"hdk_derive\"\n\"hdk_proc_macros\"\n\"he_di_derive\"\n\"headers-derive\"\n\"heapsize_derive\"\n\"heck-but-macros\"\n\"hecs-component-provider-macros\"\n\"hecs-macros\"\n\"hedera_rust_client_derive\"\n\"heim-derive\"\n\"helper\"\n\"helper_fn\"\n\"herald_derive\"\n\"heron_macros\"\n\"hesione_macros\"\n\"hesoyam_macro\"\n\"hex-literal-impl\"\n\"hex-magic\"\n\"hexbytes\"\n\"hexf\"\n\"hexf-impl\"\n\"hippo-macro\"\n\"hippotat-macros\"\n\"hirola-macros\"\n\"hirpdag_derive\"\n\"hitbox-derive\"\n\"hlbc-derive\"\n\"hoax\"\n\"hobo_css_macros\"\n\"hobo_derive\"\n\"hodoku\"\n\"hoist_temporaries\"\n\"holium-macro\"\n\"holochain_json_derive\"\n\"holochain_serialized_bytes_derive\"\n\"holochain_tracing_macros\"\n\"hot-lib-reloader-macro\"\n\"hotg-rune-proc-block-macros\"\n\"hotpatch_macros\"\n\"houseflow-macros\"\n\"hrpc-proc-macro\"\n\"hstrace_derive\"\n\"html-extractor-macros\"\n\"html-macro\"\n\"html-to-string-macro\"\n\"http-api-problem-derive\"\n\"httpmock-macros\"\n\"huber-procmacro\"\n\"hubpack_derive\"\n\"humphrey_json_derive\"\n\"hyperbole_macros\"\n\"hyperderive\"\n\"hypermod\"\n\"hypersearch_codegen\"\n\"i-macros\"\n\"i-slint-core-macros\"\n\"i18n-embed-fl\"\n\"i18n-embed-impl\"\n\"i18n-macro\"\n\"i18n_codegen\"\n\"i2c-reg-derive\"\n\"iai_macro\"\n\"ibuilder_derive\"\n\"ic-cdk-macros\"\n\"ic-event-hub-macros\"\n\"ic-kit-macros\"\n\"ice-derive\"\n\"iced_focus_derive\"\n\"icu_provider_macros\"\n\"id-derive\"\n\"id_collections_derive\"\n\"identifier_derive\"\n\"identify-tts\"\n\"identity-diff-derive\"\n\"iderive\"\n\"idl-macro\"\n\"idmap-derive\"\n\"if_debug\"\n\"if_empty_derive\"\n\"iffy\"\n\"ifmt-impl\"\n\"iftree\"\n\"ignite-rs_derive\"\n\"igri_derive\"\n\"ike-derive\"\n\"illicit-macro\"\n\"imgui-ext-derive\"\n\"imgui-inspect-derive\"\n\"imm_gc_derive\"\n\"imperative-rs-derive\"\n\"impl-enum\"\n\"impl-service\"\n\"impl-template\"\n\"impl-tools\"\n\"impl-trait-for-tuples\"\n\"impl_inheritance_macros\"\n\"impl_table\"\n\"impl_trait\"\n\"implicit-await-macro\"\n\"impls_index_meta\"\n\"import_fn\"\n\"import_generated_code\"\n\"in_space_routes\"\n\"incdir\"\n\"include-base64\"\n\"include-bytes-plus\"\n\"include-cargo-toml\"\n\"include-crypt-bytes-macro\"\n\"include-crypt-codegen\"\n\"include-dir-macro\"\n\"include-flate-codegen\"\n\"include-glsl-impl\"\n\"include-lua-macro\"\n\"include-oracle-sql-args\"\n\"include-repo\"\n\"include-repo-impl\"\n\"include-sql\"\n\"include-transformed\"\n\"include-url\"\n\"include_cstr\"\n\"include_dir_impl\"\n\"include_dir_macros\"\n\"include_display_mode_tex\"\n\"include_js_codegen\"\n\"include_optional\"\n\"include_path\"\n\"include_rgba\"\n\"include_wgsl\"\n\"indigo-proc-macros\"\n\"indigo-structopt-derive\"\n\"indirect-once-derive\"\n\"indiscriminant_impl\"\n\"indiscriminant_impl_bits\"\n\"indiscriminant_impl_byte_str\"\n\"indiscriminant_impl_str\"\n\"indoc\"\n\"indoc-impl\"\n\"indra-proc-macro\"\n\"inert_derive\"\n\"inertia-macros\"\n\"inet2_derive\"\n\"infer_schema_macros\"\n\"infinitree-macros\"\n\"influxdb-derives\"\n\"influxdb2-derive\"\n\"influxdb2-structmap-derive\"\n\"influxdb_derive\"\n\"inherent\"\n\"inherent-pub\"\n\"inheritance-proc-macro\"\n\"init_codegen\"\n\"inject-macro\"\n\"ink_lang_macro\"\n\"ink_macro\"\n\"ink_storage_derive\"\n\"inkpad-derive\"\n\"inkwell_internals\"\n\"inline-c-macro\"\n\"inline-mod\"\n\"inline-proc\"\n\"inline-rust\"\n\"inline-spirv\"\n\"inline-vbs-macros\"\n\"inpm-impl\"\n\"inpt-macros\"\n\"instrumented-codegen\"\n\"int-enum-impl\"\n\"integra8_decorations_impl\"\n\"integra8_impl\"\n\"integration-test\"\n\"inter\"\n\"inter-struct-codegen\"\n\"interact_derive\"\n\"intercom-attributes\"\n\"interfacer-http-attribute\"\n\"intermittent\"\n\"interoptopus_proc\"\n\"interpol\"\n\"interpol-impl\"\n\"interpolate_name\"\n\"intertrait-macros\"\n\"into-attr-derive\"\n\"into_query_derive\"\n\"into_response_derive\"\n\"into_variant_macro\"\n\"intricate-macros\"\n\"introspection-derive\"\n\"intuitive_macros\"\n\"intuple_derive\"\n\"inventory-impl\"\n\"invoke_impl\"\n\"io-enum\"\n\"io_self_derive\"\n\"iocmap\"\n\"ion-c-sys-macros\"\n\"iota-sc-hname-generator\"\n\"ip-macro\"\n\"ipcs-codegen\"\n\"iredismodule-macros\"\n\"iref-enum\"\n\"iroha-codegen\"\n\"iroha-derive\"\n\"irrefutable\"\n\"irzha\"\n\"is-macro\"\n\"is-same-derive\"\n\"is_not\"\n\"is_variant\"\n\"iso-macro\"\n\"issue-macros\"\n\"itconfig-macro\"\n\"iter-enum\"\n\"iterate-proc-macro\"\n\"iterator_item_macros\"\n\"its_ok\"\n\"j-api-derive\"\n\"j4rs_derive\"\n\"jaded-derive\"\n\"jam_derive\"\n\"janetrs_macros\"\n\"jcers_proc\"\n\"jeep-train-macro\"\n\"jenner-macro\"\n\"jens_derive\"\n\"jet-proto-proc-macros\"\n\"jlrs-derive\"\n\"jni-glue-macros\"\n\"jni_fn\"\n\"jnix-macros\"\n\"jo\"\n\"jockey_derive\"\n\"join\"\n\"join_export\"\n\"join_str\"\n\"jomini_derive\"\n\"josephine_derive\"\n\"josh_hates_closures\"\n\"jrpc-macro\"\n\"jrsonnet-gc-derive\"\n\"jrsonnet-gcmodule-derive\"\n\"js-intern-proc-macro\"\n\"js-macros\"\n\"js-sandbox-macros\"\n\"json_api_derive\"\n\"json_derive\"\n\"json_in_type_derive\"\n\"json_schema_test_suite_proc_macro\"\n\"json_typegen\"\n\"jsondata-derive\"\n\"jsonresponder\"\n\"jsonrpc-derive\"\n\"jsonrpc-sdk-macros\"\n\"jsonrpc-utils-macros\"\n\"jsonrpc-v2-macros\"\n\"jsonrpc_client_macro\"\n\"jsonrpsee-proc-macros\"\n\"jss_derive\"\n\"jump-kun-macros\"\n\"juniper-compose-macros\"\n\"juniper-eager-loading-code-gen\"\n\"juniper-from-schema-code-gen\"\n\"juniper_codegen\"\n\"jvm-macro\"\n\"k8s-openapi-derive\"\n\"kaitai-macros\"\n\"kal-derive\"\n\"kamikaze_di_derive\"\n\"kanata-keyberon-macros\"\n\"kanin_derive\"\n\"kas-macros\"\n\"katalyst_macros\"\n\"katexit\"\n\"kayrx-macro\"\n\"kconfig_impl\"\n\"keeshond_derive\"\n\"kefta_macro\"\n\"ketos_derive\"\n\"kexplain\"\n\"keyby\"\n\"keycode_macro\"\n\"keyframe_derive\"\n\"keypath-proc-macros\"\n\"kf-protocol-derive\"\n\"kg-diag-derive\"\n\"kg-display-derive\"\n\"klickhouse_derive\"\n\"kll-macros\"\n\"knative-derive\"\n\"knife-macro\"\n\"kobold_macros\"\n\"kommand\"\n\"kommandozeilen_argumente_derive\"\n\"kompact-actor-derive\"\n\"kompact-component-derive\"\n\"konst_proc_macros\"\n\"korat_derive\"\n\"kotlin-bridge-macro\"\n\"kproc_macros\"\n\"krator-derive\"\n\"kserd_derive\"\n\"kube-derive\"\n\"kuon_request_derive\"\n\"kurisu-derive\"\n\"kv-derive-macro\"\n\"l10n_impl\"\n\"label-macros\"\n\"label_attribute\"\n\"labelled-enum-derive\"\n\"laby_macros\"\n\"lain_derive\"\n\"lalrproc\"\n\"lambda_runtime_errors_derive\"\n\"lamedh_attributes\"\n\"lamellar-impl\"\n\"lamellar-prof\"\n\"lando-attr\"\n\"lang-util-derive\"\n\"langbox_procmacro\"\n\"lark-debug-derive\"\n\"lark-test-generate\"\n\"later-derive\"\n\"lattice_qcd_rs-procedural_macro\"\n\"layeredconf-derive\"\n\"lazing\"\n\"lazy-re\"\n\"lazy-regex-proc_macros\"\n\"lazy-settings-macros\"\n\"lazy_fn\"\n\"lazylink-macro\"\n\"lbs_derive\"\n\"lc3-macros\"\n\"leafwing_input_manager_macros\"\n\"ledb-derive\"\n\"leetcode_test\"\n\"legion_codegen\"\n\"lemmy_apub_lib_derive\"\n\"lemon-tree-derive\"\n\"lending-iterator-proc_macros\"\n\"lens-rs_derive\"\n\"lerp_derive\"\n\"leveldb-orm-derive\"\n\"lexpr-macros\"\n\"lfa_derive\"\n\"lfsr-macro-generate\"\n\"lfsr-macro-lookup\"\n\"lib3d6\"\n\"lib3h_persistence_derive\"\n\"libafl_derive\"\n\"libcnb-proc-macros\"\n\"libfj_parsable_macro_derive\"\n\"libftd2xx-cc1101-derive\"\n\"libipld-cbor-derive\"\n\"libktx-rs-macros\"\n\"libmw-macro\"\n\"libp2p-core-derive\"\n\"libp2p-swarm-derive\"\n\"libpacket-derive\"\n\"libside-procmacro\"\n\"libtor-derive\"\n\"libvmm_macros\"\n\"libwifi_macros\"\n\"lies-impl\"\n\"lifetime_proc_macros\"\n\"ligen-c-macro\"\n\"ligen-cmake-macro\"\n\"ligen-macro\"\n\"lighter-derive\"\n\"lightning-wire-msgs-derive\"\n\"lightning_encoding_derive\"\n\"limelight-derive\"\n\"limine-proc\"\n\"lingon-macro\"\n\"linkme-impl\"\n\"linux-macros\"\n\"linux-rtic-macros\"\n\"linux_details_macros\"\n\"liquid-derive\"\n\"list_files_macro\"\n\"lit-html-macro\"\n\"litcrypt\"\n\"literal_cstr\"\n\"liutongshuo_decoding_macros_impl\"\n\"livemod-derive\"\n\"llml_derive_crate\"\n\"llml_simd_proc\"\n\"llvm-plugin-inkwell-internals\"\n\"llvm-plugin-macros\"\n\"lnpbp_derive\"\n\"load-dotenv\"\n\"local-impl\"\n\"localghost-macros\"\n\"locenv-macros\"\n\"lock_order\"\n\"lockjaw_processor\"\n\"locktree-derive\"\n\"locspan-derive\"\n\"locustdb-derive\"\n\"locutus-macros\"\n\"log-attributes\"\n\"log-derive\"\n\"log-termination\"\n\"logfn\"\n\"logging_timer_proc_macros\"\n\"loggy-macros\"\n\"loginmanager-codegen\"\n\"logisheets_derives\"\n\"logisheets_workbook_derives\"\n\"logos-derive\"\n\"lokaproc\"\n\"lombok\"\n\"looking-glass-derive\"\n\"loosen\"\n\"loupe-derive\"\n\"lovm2_internals\"\n\"lovm2_module\"\n\"lpc55-rtic-macros\"\n\"lpu-macros\"\n\"lrpc-macros\"\n\"lru-cache-macros\"\n\"lsp_msg_derive\"\n\"lspower-macros\"\n\"ltv_derive_impl\"\n\"lua-macro-impl\"\n\"luao3-macros\"\n\"lucene_query_builder_rs_derive\"\n\"lucet-runtime-macros\"\n\"luminance-derive\"\n\"lunatic-macros\"\n\"lunatic-test\"\n\"lunatic_message_derive\"\n\"lurk-ipld-cbor-derive\"\n\"luther-derive\"\n\"lv2-core-derive\"\n\"lv2-urid-derive\"\n\"lvbitfile2rust-macros\"\n\"machine\"\n\"machinery-macros\"\n\"macrame\"\n\"macro-class-render\"\n\"macro-galois-field\"\n\"macro-input-macros\"\n\"macro-ob\"\n\"macro-ruby\"\n\"macro-vis\"\n\"macro_find_and_replace\"\n\"macro_helper\"\n\"macro_io\"\n\"macro_macro\"\n\"macro_pub\"\n\"macro_rules_attribute-proc_macro\"\n\"macro_state_macros\"\n\"macro_tt_utils\"\n\"macroclassrender\"\n\"macrofied-toolbox\"\n\"macromath\"\n\"macropol\"\n\"macroquad_macro\"\n\"macroscope-macro\"\n\"macrotk-derive\"\n\"macrowind\"\n\"madsim-macros\"\n\"mady_macro\"\n\"magic_static_macro\"\n\"magnet_derive\"\n\"magnus-macros\"\n\"make_singleton\"\n\"make_singleton_derive\"\n\"makeit-derive\"\n\"makepad-shader-ast-impl\"\n\"makepad-tinyserde-derive\"\n\"malloc_size_of_derive\"\n\"malvolio_codegen\"\n\"mammoth-macro\"\n\"manifest-dir-macros\"\n\"mantle-macros\"\n\"many-macros\"\n\"maomi-macro\"\n\"maomi-skin\"\n\"maple-core-macro\"\n\"marigold-macros\"\n\"marine-macro\"\n\"marine-test-macro\"\n\"marine-timestamp-macro\"\n\"marker-blanket\"\n\"market_derive\"\n\"markup-proc-macro\"\n\"marshall_derive\"\n\"masala\"\n\"mashup-impl\"\n\"mat-macros\"\n\"match-lookup\"\n\"match-template\"\n\"match_deref\"\n\"math_dsl_macro\"\n\"mathml-macros\"\n\"matrix-sdk-test-macros\"\n\"matterdb-derive\"\n\"maud_macros\"\n\"mauzi_macros\"\n\"maybe-async\"\n\"maybe-async-cfg\"\n\"mazzaroth-rs-derive\"\n\"mbot_proc_macro_helpers\"\n\"mcl_derive\"\n\"mclient_macro\"\n\"mcre\"\n\"md-icons-helper\"\n\"mdbx-proc\"\n\"mdbx-speedy\"\n\"mdsycx-macro\"\n\"medea-macro\"\n\"mediaflow_derive\"\n\"meet-macro\"\n\"megadex_derive\"\n\"megenginelite-derive\"\n\"meilimelo-macros\"\n\"melange_macros\"\n\"membrane_macro\"\n\"memflow-derive\"\n\"memoise\"\n\"memoize-inner\"\n\"memor\"\n\"memtable-macros\"\n\"memuse_derive\"\n\"mendes-derive\"\n\"mendes-macros\"\n\"merfolk_frontend_derive_macros\"\n\"merge_derive\"\n\"merkle_light_derive\"\n\"meshx-derive\"\n\"messagebus_derive\"\n\"messagepack-rs-macros\"\n\"metafor\"\n\"metaldb-derive\"\n\"metamorphose\"\n\"metered-macro\"\n\"methods-enum\"\n\"metrics-catalogue-macros\"\n\"metrics-fn-codegen\"\n\"metrics-macros\"\n\"metriki-macros\"\n\"mg-settings-macros\"\n\"mic_impl\"\n\"michie-macro\"\n\"micro-timer-macros\"\n\"microamp-macros\"\n\"microrm-macros\"\n\"microserde-derive\"\n\"microtemplate_derive\"\n\"microtype-macro\"\n\"miette-derive\"\n\"migrations_macros\"\n\"miku-macros\"\n\"millennium-macros\"\n\"milter-callback\"\n\"mime-macro-4\"\n\"mimeograph_router_codegen\"\n\"mimicry-derive\"\n\"mincache-impl\"\n\"minceraft-derive\"\n\"minecraft-protocol-derive\"\n\"mini-internal\"\n\"mini-internal-miku\"\n\"mini_paste-proc_macro\"\n\"mini_template_macro\"\n\"miniarg_derive\"\n\"minicbor-derive\"\n\"minicdn_macros\"\n\"minihttp-codegen\"\n\"miniserde-derive-enum\"\n\"miniserde-enum\"\n\"minitrace-macro\"\n\"minnow-derive\"\n\"minutus-macros\"\n\"mips-rt-macros\"\n\"mixin\"\n\"mjb_gc_derive\"\n\"mkit-derive\"\n\"mlua_derive\"\n\"mm0_deepsize_derive\"\n\"mmtk-macros\"\n\"mobile-entry-point\"\n\"mock-it_codegen\"\n\"mock_derive\"\n\"mockall_derive\"\n\"mockall_double\"\n\"mockalloc-macros\"\n\"mockers_derive\"\n\"mockiato-codegen\"\n\"mocktopus_macros\"\n\"mod_interface_meta\"\n\"modelfox_macro\"\n\"models-proc-macro\"\n\"modifier_macro\"\n\"modtype_derive\"\n\"modular-bitfield-impl\"\n\"modular-bitfield-msb-impl\"\n\"modus_ponens_derive\"\n\"mogwai-html-macro\"\n\"mol-derive\"\n\"molt-argparse-procmacro\"\n\"mongod-derive\"\n\"mongodb-ext-derive\"\n\"moniker-derive\"\n\"mono-macro\"\n\"monoio-macros\"\n\"monomo_macros\"\n\"monostate-impl\"\n\"moonboot-macros\"\n\"moonramp-lunar-macro\"\n\"moore-derive\"\n\"moose-macros\"\n\"moq_derive\"\n\"moq_lambda\"\n\"moretypes\"\n\"mork-message-derive\"\n\"motoko_proc_macro\"\n\"motore-macros\"\n\"mouscache_derive\"\n\"movie_derive\"\n\"mox\"\n\"mox-impl\"\n\"mp4ameta_proc\"\n\"mpesa_derive\"\n\"mpi-derive\"\n\"mpl-macro\"\n\"mpst-seq-proc\"\n\"mquote-impl\"\n\"mrsbfh-macros\"\n\"mry_macros\"\n\"mscorlib_safe_derive\"\n\"msfs_derive\"\n\"msgpack-schema-impl\"\n\"msgpacker-derive\"\n\"msiz_rustc-ap-rustc_macros\"\n\"msp430-rt-macros\"\n\"muds-derive\"\n\"mula_proc_macro\"\n\"multi-default-trait-impl\"\n\"multi_index_map\"\n\"multiconst_proc_macros\"\n\"multihash-derive\"\n\"multiversion-macros\"\n\"mun_codegen_macros\"\n\"munge_macro\"\n\"murray\"\n\"mushin_derive\"\n\"musli-macros\"\n\"must-implement-trait\"\n\"muta-apm-derive\"\n\"muta-codec-derive\"\n\"mutable_derive\"\n\"mutants\"\n\"mutview\"\n\"mux-stream-macros\"\n\"mwapi_responses_derive\"\n\"mws-derive\"\n\"mwt\"\n\"mxml\"\n\"my-desire-macros\"\n\"mybatis-macro\"\n\"mycroft-macros-impl\"\n\"mysql_enum_derive\"\n\"mysql_helper\"\n\"mysqldump-quick-xml-derive\"\n\"nacos-api_macro\"\n\"nacos-rs-sdk-macro\"\n\"naia-derive\"\n\"naia-serde-derive\"\n\"naked-function-macro\"\n\"nalgebra-macros\"\n\"name-it-macros\"\n\"name-variant\"\n\"named\"\n\"named-tup-derive\"\n\"named_constants\"\n\"named_return\"\n\"named_tuple\"\n\"named_type_derive\"\n\"nameless-clap_derive\"\n\"nametag\"\n\"namewise\"\n\"namewise-derive\"\n\"nanorpc-derive\"\n\"nanoserde-derive\"\n\"naphtha-proc-macro\"\n\"napi-derive\"\n\"napi-rs-derive\"\n\"naro-derive\"\n\"narrow-derive\"\n\"narui_macros\"\n\"nate-derive\"\n\"native-windows-derive\"\n\"nativeshell_derive\"\n\"nb-blocking-util\"\n\"ndjsonlogger\"\n\"ndk-macro\"\n\"ndless-macros\"\n\"near-bindgen-macros\"\n\"near-contract-tools-macros\"\n\"near-env\"\n\"near-paperclip-macros\"\n\"near-performance-metrics-macros\"\n\"near-plugins-derive\"\n\"near-prop-macros\"\n\"near-rpc-error-macro\"\n\"near-sdk-macros\"\n\"near-units-macro\"\n\"nebula-derive\"\n\"negate\"\n\"negative-impl\"\n\"neli-proc-macros\"\n\"neo-mime-macro\"\n\"neo4rs-macros\"\n\"neon-frame-macro\"\n\"neon-macros\"\n\"nereon_derive\"\n\"nestor_codegen\"\n\"net-literals\"\n\"net-literals-impl\"\n\"netlify_lambda_attributes\"\n\"netxbuilder\"\n\"new-home-application-macro\"\n\"new_derivable\"\n\"newport_codegen\"\n\"newt_component_derive\"\n\"newt_proc_macros\"\n\"newtype-enum-macro\"\n\"next-gen-proc_macros\"\n\"next-gen_proc-macro\"\n\"ni-fpga-macros\"\n\"nicolas_macros\"\n\"nifpga-type-macro\"\n\"nimble-derive\"\n\"nitroglycerin_derive\"\n\"nitrokey-test\"\n\"nj-derive\"\n\"nject-macro\"\n\"no-mangle-if-debug\"\n\"no-panic\"\n\"no_error_macro\"\n\"noble-contracts-proc-macro\"\n\"noble-staking-reward-curve\"\n\"node_api_macro\"\n\"nodex-macros\"\n\"nom-both-macros\"\n\"nom-derive-impl\"\n\"nom-packrat-macros\"\n\"nom-peg\"\n\"nom-recursive-macros\"\n\"nom-rule\"\n\"nom-tracable-macros\"\n\"nommy_derive\"\n\"nongoose-derive\"\n\"nonparallel\"\n\"nonzero\"\n\"noop-attr\"\n\"noop_proc_macro\"\n\"nop-json-derive\"\n\"norpc-macros\"\n\"nostalgia-derive\"\n\"notan_macro\"\n\"notation_macro\"\n\"note_frequencies\"\n\"nougat-proc_macros\"\n\"nova-macro\"\n\"npy-derive\"\n\"npyz-derive\"\n\"nt-list_macros\"\n\"nt-packet-derive\"\n\"ntest_test_cases\"\n\"ntest_timeout\"\n\"ntex-macros\"\n\"ntex-rt-macros\"\n\"null_fn\"\n\"num-derive\"\n\"num-variants\"\n\"num_enum_derive\"\n\"numeric-lut\"\n\"numeric_literals\"\n\"numext-constructor\"\n\"numext-fixed-hash-hack\"\n\"numext-fixed-uint-hack\"\n\"nut_self\"\n\"nyar-macro\"\n\"nys\"\n\"oapi_derive\"\n\"oars_proc_macro\"\n\"oasis-amqp-macros\"\n\"oasis-borsh-derive\"\n\"oasis-cbor-derive\"\n\"oasis-game-core-derive\"\n\"oasis-macros\"\n\"oauth1-request-derive\"\n\"obake_macros\"\n\"obfstr-impl\"\n\"obi-derive\"\n\"objc-foundation-derive\"\n\"objc2-proc-macros\"\n\"objekt-clonable-impl\"\n\"objrs_frameworks_foundation_macros\"\n\"objrs_macros\"\n\"observe-macro\"\n\"observer_attribute\"\n\"ocaml-derive\"\n\"ocaml-gen-derive\"\n\"ockam_macro\"\n\"ockam_macros\"\n\"ockam_message_derive\"\n\"ockam_node_attribute\"\n\"ockam_node_test_attribute\"\n\"ockam_vault_test_attribute\"\n\"octane_macros\"\n\"odata_client_derive\"\n\"odbc-futures-derive\"\n\"odra-proc-macros\"\n\"oe\"\n\"off-side\"\n\"ogma-macros\"\n\"okapi-operation-macro\"\n\"olympia_derive\"\n\"one_at_a_time_please_derive\"\n\"one_user\"\n\"onehot-derive\"\n\"ontio-codegen\"\n\"ontio-derive-codec\"\n\"opaque_typedef_macros\"\n\"open-enum-derive\"\n\"open-metrics-client-derive-text-encode\"\n\"openapi_type_derive\"\n\"openbrush_contracts_derive\"\n\"openbrush_lang_macro\"\n\"opensmtpd_derive\"\n\"openssl-macros\"\n\"opentelemetry-auto-span\"\n\"openwhisk_macro\"\n\"opg_derive\"\n\"ophelia-derive\"\n\"opimps\"\n\"ops-derive\"\n\"opt_args\"\n\"optargs-macro\"\n\"optbuilder\"\n\"optee-utee-macros\"\n\"optfield\"\n\"optick-attr\"\n\"option-constructor-derive\"\n\"optional-fields-serde-macro\"\n\"optional_struct\"\n\"oracle_procmacro\"\n\"orbtk-proc-macros\"\n\"orchestra-proc-macro\"\n\"ord_by_key\"\n\"ordes-macros\"\n\"ordinalizer\"\n\"orga-macros\"\n\"organix-derive\"\n\"orientdb-macro\"\n\"origen-core-support\"\n\"ormlite-macro\"\n\"ormx-macros\"\n\"osaka-macros\"\n\"osauth-derive\"\n\"osc_address_derive\"\n\"osmosis-std-derive\"\n\"oso-derive\"\n\"osquery-rust-codegen\"\n\"otopr-derive\"\n\"otspec_macros\"\n\"otto_vec_derive\"\n\"ouroboros_macro\"\n\"overflow\"\n\"overloadable\"\n\"overloadf_derive\"\n\"overrideGetterSetter\"\n\"overrider\"\n\"ovr-vsdb-derive\"\n\"owasm-abi-derive\"\n\"owned-singleton-macros\"\n\"owo-code\"\n\"oxi-module\"\n\"oxi-test\"\n\"oxidate-macros\"\n\"oxide-macros\"\n\"oxidizer-entity-macro\"\n\"oxlex-derive\"\n\"oxygen_quark_derive\"\n\"oxygengine-ignite-derive\"\n\"oy-derive\"\n\"pacaptr-macros\"\n\"packable-derive\"\n\"package_info_derive\"\n\"packattack-derive\"\n\"packed_bools\"\n\"packed_struct_codegen\"\n\"packer_derive\"\n\"packetrs-macro\"\n\"packing_codegen\"\n\"packs-proc\"\n\"packtool-macro\"\n\"pakr-assert-size\"\n\"palette_derive\"\n\"pallet-contracts-proc-macro\"\n\"pallet-macros\"\n\"pallet-staking-reward-curve\"\n\"pam-macros\"\n\"panda-re-macros\"\n\"pandora-api-derive\"\n\"panoramix-derive\"\n\"paperclip-macros\"\n\"papito_codegen\"\n\"parameterized-macro\"\n\"parce_macros\"\n\"parity-codec-derive\"\n\"parity-scale-codec-derive\"\n\"parity-util-mem-derive\"\n\"parker_codegen\"\n\"parkour_derive\"\n\"parquet_derive\"\n\"parsable-macro\"\n\"parse-display-derive\"\n\"parse-variants-derive\"\n\"parsel_derive\"\n\"parser-c-macro\"\n\"parst_derive\"\n\"partfun_derive\"\n\"partial-application-rs\"\n\"partial-borrow-macros\"\n\"partial_derive\"\n\"partial_ref_derive\"\n\"partialdebug-derive\"\n\"parze-declare\"\n\"passive_derive\"\n\"paste\"\n\"paste-impl\"\n\"pasture-derive\"\n\"patchable-macros\"\n\"paw-attributes\"\n\"paw-structopt\"\n\"pax-macro\"\n\"pbdb-macros\"\n\"pcb-rs-macros\"\n\"pcd-rs-derive\"\n\"pchain-sdk-macros\"\n\"pdf_derive\"\n\"peace_data_derive\"\n\"peace_full_spec_id_macro\"\n\"pear_codegen\"\n\"peek-poke-derive\"\n\"peg-macros\"\n\"pegcel-macros\"\n\"peginator_macro\"\n\"pegtastic-macros\"\n\"pelite-macros\"\n\"pen-ffi-macro\"\n\"penguin-config-derive\"\n\"penrose_proc\"\n\"peppi-derive\"\n\"per_test_directory_macros\"\n\"percy-css-macro\"\n\"percy-router-macro\"\n\"perseus-macro\"\n\"persia-rpc-macro\"\n\"persia-speedy-derive\"\n\"persian-rug_derive\"\n\"persistentcache_procmacro\"\n\"pest-ast\"\n\"pest-deconstruct-derive\"\n\"pest-typed-tree\"\n\"pest_consume_macros\"\n\"pest_derive\"\n\"pest_derive_tmp\"\n\"pformat_macro\"\n\"pg-extern-attr\"\n\"pg_mapper\"\n\"pgc-derive\"\n\"pgmacro\"\n\"pgx-macros\"\n\"pgx-named-columns\"\n\"phantom-fields\"\n\"phenotype-macro\"\n\"phf_macros\"\n\"photonix_derive\"\n\"phper-macros\"\n\"physx-macros\"\n\"pi_async_macro\"\n\"pi_ecs_derive_old\"\n\"pi_ecs_macros\"\n\"pi_enum_default_macro\"\n\"picorv32-rt-macros\"\n\"pijul-macros\"\n\"pin-project-internal\"\n\"pinar-derive\"\n\"pinetime-macros\"\n\"pink-extension-macro\"\n\"pink-sidevm-macro\"\n\"pinned-init-macro\"\n\"pinwheel_elements_macro\"\n\"pinwheel_macro\"\n\"pio-proc\"\n\"pipe-op\"\n\"pipederive\"\n\"piston2d_abstraction_proc_macros\"\n\"pixset_derive\"\n\"pkbuffer_derive\"\n\"pkg-macros\"\n\"pkg-version-impl\"\n\"pkg_impl\"\n\"pl-hlist-derive\"\n\"pl-lens-derive\"\n\"pl-lens-macros\"\n\"placeholder_closure\"\n\"placement-new-derive\"\n\"plaster-router-macro\"\n\"plate-macros\"\n\"plctag-derive\"\n\"pleingres-macros\"\n\"plex\"\n\"pliantdb-macros\"\n\"plotly_derive\"\n\"plugin-runtime-codegen\"\n\"plugin-system\"\n\"pluralize_derive\"\n\"plutonium\"\n\"plutus_data_derive\"\n\"pmacro_ruly\"\n\"pmhelp-internal-macros\"\n\"pn-dcp-macro\"\n\"pnet_macros\"\n\"pocket_prover-derive\"\n\"poe-superfilter-support\"\n\"poem-derive\"\n\"poem-extensions-macro\"\n\"poem-grants-proc-macro\"\n\"poem-openapi-api-derive\"\n\"poem-openapi-derive\"\n\"poem-openapi-macro\"\n\"poem_openapi_validator_derive\"\n\"poggers-derive\"\n\"pogo_attr\"\n\"point-derive\"\n\"poise_macros\"\n\"pokeapi-macro\"\n\"politeness-macro-impl\"\n\"poll_token_derive\"\n\"polling-async-trait\"\n\"polyerror\"\n\"polygraph-macro\"\n\"polyhorn-macros\"\n\"polyhorn-ui-macros\"\n\"polymesh-api-codegen-macro\"\n\"polymesh-primitives-derive\"\n\"pomelo-impl\"\n\"pomsky-macro\"\n\"portus_export\"\n\"positional_derive\"\n\"postcard-derive\"\n\"postfix-macros-impl\"\n\"postgres-derive\"\n\"postgres-derives\"\n\"postgres-extension-macro\"\n\"postgres-mapper-derive\"\n\"postgres-syntax\"\n\"postgres_query_derive\"\n\"postgres_query_macro\"\n\"potatonet-codegen\"\n\"power-instruction-analyzer-proc-macro\"\n\"power-of-two-impl\"\n\"powerset-enum-attr\"\n\"ppc750cl-macros\"\n\"pr47-codegen\"\n\"prae_macro\"\n\"praiya-macro\"\n\"pravega-client-macros\"\n\"pre-proc-macro\"\n\"predicate-macros\"\n\"prefixopt_derive\"\n\"preftool-clap-derive\"\n\"preftool-derive\"\n\"pretend-codegen\"\n\"primitive-enum-derive\"\n\"print_each_line\"\n\"prismatic\"\n\"privsep-derive\"\n\"pro_lang_macro\"\n\"pro_storage_derive\"\n\"proc-bitfield-macros\"\n\"proc-caesar\"\n\"proc-concat-bytes-impl\"\n\"proc-lock-macro\"\n\"proc-macro-error-attr\"\n\"proc-macro-hack-impl\"\n\"proc-macro-id\"\n\"proc-macro-kwargs-derive\"\n\"proc-macro-regex\"\n\"proc-macro-rules-macros\"\n\"proc-macro2-test\"\n\"proc-quote-impl\"\n\"proc-spirv\"\n\"proc-test-catalog\"\n\"proc_macro_global_state\"\n\"proc_macro_test\"\n\"proc_qq_codegen\"\n\"proc_static_assertions\"\n\"proc_unroll\"\n\"proc_use_inline\"\n\"proc_vector2d\"\n\"procedurals\"\n\"proclock-macro\"\n\"procmac\"\n\"proconio-derive\"\n\"procopt\"\n\"profiling-procmacros\"\n\"progenitor-macro\"\n\"projection-macros\"\n\"prom-attire\"\n\"prom-attire-bootstrap\"\n\"prom-timer-macro\"\n\"prometheus-client-derive-text-encode\"\n\"prometheus-metric-storage-derive\"\n\"prometheus-static-metric\"\n\"proofsize_derive\"\n\"propane-macros\"\n\"proper\"\n\"property\"\n\"propfuzz-macro\"\n\"proptest-attr-macro\"\n\"proptest-derive\"\n\"prost-reflect-derive\"\n\"protected-id-derive\"\n\"proto-vulcan-macros\"\n\"protobuf-convert\"\n\"protocol-derive\"\n\"prov-cosmwasm-derive\"\n\"prove_derive\"\n\"proxy-enum\"\n\"prune_derive\"\n\"prusto-macros\"\n\"pseudonym\"\n\"ptah_derive\"\n\"ptr_eq-macros\"\n\"ptr_meta_derive\"\n\"pub-sub-client-derive\"\n\"puball\"\n\"pubcfg\"\n\"public\"\n\"pulz-ecs-macros\"\n\"purescript_waterslide_derive\"\n\"purpurea\"\n\"pwasm-abi-derive\"\n\"pwn-helper-macros\"\n\"pydeco\"\n\"pyo3-asyncio-macros\"\n\"pyo3-macros\"\n\"pyo3-prost\"\n\"pyo3cls\"\n\"python_comm_macros\"\n\"pywrapper-macro\"\n\"q1tsim-derive\"\n\"qadapt-macro\"\n\"qbittorrent-web-api-gen\"\n\"qjs-derive\"\n\"qmetaobject_impl\"\n\"qname-macro\"\n\"qoqo-macros\"\n\"qqx-macro\"\n\"qsk-macros\"\n\"qt_macros\"\n\"qtpl-macros\"\n\"qty-macros\"\n\"qu-derive\"\n\"qualia_derive\"\n\"quantifiable-derive\"\n\"quartz_commands_macros\"\n\"quartz_nbt_macros\"\n\"query-params-derive\"\n\"query_params\"\n\"quick_from\"\n\"quickcheck_async\"\n\"quickcheck_macros\"\n\"quickjs_regex_derive\"\n\"quilkin-macros\"\n\"quit_macros\"\n\"quix-derive\"\n\"quork-proc\"\n\"quote-use\"\n\"quote_precise\"\n\"r-gen-macro\"\n\"r-lombok-macros\"\n\"r3bl_rs_utils_macro\"\n\"rabbithole-derive\"\n\"racetrack-proc-macro\"\n\"rad_ext_template\"\n\"radiation-macros\"\n\"raffia_macro\"\n\"rafka_codegen\"\n\"rainbow-macros\"\n\"ral-macro\"\n\"ramhorns-derive\"\n\"rand_derive\"\n\"rand_derive2\"\n\"randerive\"\n\"random_struct_layout\"\n\"random_variant_macro\"\n\"rapira-derive\"\n\"rapt_derive\"\n\"rart-macros\"\n\"rash_derive\"\n\"rasn-derive\"\n\"ratcc\"\n\"rate-macros\"\n\"raui-derive\"\n\"raw_serde_derive\"\n\"rawcode_derive\"\n\"rayon-attr\"\n\"rayon-macro\"\n\"rayon-macro-hack\"\n\"rbatis-macro-driver\"\n\"rbatis_sql_macro\"\n\"rbtag_derive\"\n\"rbxm-proc\"\n\"rclrust-msg-gen\"\n\"rcstruct\"\n\"rd-derive\"\n\"rdi_macros\"\n\"rdxl\"\n\"rdxl_static_macros\"\n\"re-parse-macros\"\n\"reacty_yew\"\n\"readonly\"\n\"reaktor\"\n\"real-async-trait\"\n\"real-proc\"\n\"real_c_string\"\n\"realia\"\n\"realm_macros\"\n\"reaper-macros\"\n\"reborrow-derive\"\n\"rebound-proc\"\n\"rebpf-macro\"\n\"rec\"\n\"rec_derive\"\n\"recap-derive\"\n\"reciter\"\n\"recorder\"\n\"records\"\n\"red_asn1_derive\"\n\"redacted_debug\"\n\"redbpf-macros\"\n\"redis-derive\"\n\"redis-lua-macro\"\n\"redis_serde_json\"\n\"redismodule_cmd_procmacros\"\n\"ref-cast-impl\"\n\"ref-mut-n\"\n\"ref_clone_derive\"\n\"refinery-macros\"\n\"reflect-internal\"\n\"reflection_derive\"\n\"reflective\"\n\"refloctopus-derive\"\n\"reformation_derive\"\n\"refptr-macros\"\n\"refview_derive\"\n\"regex_static_macro\"\n\"reign_derive\"\n\"reinda-macros\"\n\"relational_types_procmacro\"\n\"relearn_derive\"\n\"relexer-derive\"\n\"relm-attributes\"\n\"relm-derive\"\n\"relm-derive-state\"\n\"relm4-macros\"\n\"remain\"\n\"remoc_macro\"\n\"remote-trait-object-macro\"\n\"remove_macro_call\"\n\"renaissance\"\n\"rename\"\n\"rename-item\"\n\"render_macros\"\n\"renderdoc-derive\"\n\"rental-impl\"\n\"rep_derive\"\n\"repeated\"\n\"replman_derive\"\n\"repr-with-fallback\"\n\"repr_offset_derive\"\n\"reql-macros\"\n\"requestty-macro\"\n\"requiem-macros\"\n\"requiem-web-codegen\"\n\"require_unsafe_in_body\"\n\"rerust\"\n\"reset-router-macros\"\n\"reshape_helper\"\n\"resource_list_proc_macro\"\n\"rest-client_codegen\"\n\"restcrab_macros\"\n\"restep\"\n\"restest_macros\"\n\"restruct_derive\"\n\"result-like-derive\"\n\"resx_derives\"\n\"retrieve\"\n\"retrofit_codegen\"\n\"retroqwest-derive\"\n\"retryable-proc_macros\"\n\"reusable_derive\"\n\"reverse_differentiable\"\n\"review-macro\"\n\"rg3d-core-derive\"\n\"rglua-macros\"\n\"rhachis-run-macro\"\n\"rhai_codegen\"\n\"rhizome_proc-macro-definitions\"\n\"rhs_first_assign\"\n\"rhythmc_macros\"\n\"rifgen_attr\"\n\"riker-macros\"\n\"rill-derive\"\n\"riscv-minimal-rt-macros\"\n\"riscv-rt-macros\"\n\"ritz_impl\"\n\"rkyv_derive\"\n\"rkyv_derive_test\"\n\"rkyv_dyn_derive\"\n\"rkyv_typename_derive\"\n\"rlink-derive\"\n\"rlp-derive\"\n\"rlua-builders-derive\"\n\"rlua-table-derive\"\n\"rnet-macros\"\n\"robespierre-fw-macros\"\n\"robin-derives\"\n\"robma_builder\"\n\"robusta-codegen\"\n\"rocket-config-codegen\"\n\"rocket-grants-proc-macro\"\n\"rocket-jwt\"\n\"rocket-jwt-authorization\"\n\"rocket-model-codegen\"\n\"rocket_codegen\"\n\"rocket_contrib_codegen\"\n\"rocket_db_pools_codegen\"\n\"rocket_extra_codegen\"\n\"rocket_modules\"\n\"rocket_okapi_codegen\"\n\"rocket_okapi_codegen_fork\"\n\"rocket_sync_db_pools_codegen\"\n\"rocketjson_macro\"\n\"rokol_derive\"\n\"rollo-macros\"\n\"roopert_macro_root\"\n\"rooty_derive\"\n\"roqoqo-derive\"\n\"rorm-macro\"\n\"roslibrust_codegen_macro\"\n\"rosrust_codegen\"\n\"rotate-enum\"\n\"rotenv_codegen\"\n\"rotonda-macros\"\n\"router-rs-macro\"\n\"router-xiaobei-macro\"\n\"rovv_derive\"\n\"roxido_macro\"\n\"rp1-macros\"\n\"rp2040-hal-macros\"\n\"rpa_derives\"\n\"rpa_enum\"\n\"rpc-toolkit-macro\"\n\"rpcx_derive\"\n\"rplugin_macros\"\n\"rq_derive\"\n\"rquickjs-macro\"\n\"rrw_macro\"\n\"rs-blocks-derive\"\n\"rs-data-formats_derive\"\n\"rs-graph-derive\"\n\"rs-odbc_derive\"\n\"rs-sandbox-derive\"\n\"rs-sandbox-macros\"\n\"rs_unit\"\n\"rsb_derive\"\n\"rschema-derive\"\n\"rsconnect_macros\"\n\"rsexp-derive\"\n\"rsfbclient-derive\"\n\"rsip-derives\"\n\"rslint_macros\"\n\"rspc-macros\"\n\"rspg-macros\"\n\"rsrl_derive\"\n\"rstest_macros\"\n\"rstest_reuse\"\n\"rsys_macro\"\n\"rt-local-macros\"\n\"rtic-trace-macros\"\n\"rtlola-macros\"\n\"rtti-derive\"\n\"rubber_duck_macro\"\n\"rudeboy-derive\"\n\"ruint-macro\"\n\"rulex-macro\"\n\"ruma-api-macros\"\n\"ruma-events-macros\"\n\"ruma-identifiers-macros\"\n\"ruma-macros\"\n\"ruma-serde-macros\"\n\"rumpsteak-macros\"\n\"rundo_attrs\"\n\"rundo_attrsca\"\n\"rune-macros\"\n\"runestick-macros\"\n\"runng_derive\"\n\"runtime-attributes\"\n\"runtime-fmt-derive\"\n\"ruspiro-interrupt-macros\"\n\"rusqlite-model-derive\"\n\"rust-ad-core-macros\"\n\"rust-ad-macros\"\n\"rust-cef-derive\"\n\"rust-embed-impl\"\n\"rust-fixed-point-decimal-macros\"\n\"rust-fsm-dsl\"\n\"rust-gl-proc\"\n\"rust-hdl-macros\"\n\"rust-i18n-macro\"\n\"rust-jni-generator\"\n\"rust-libretro-proc\"\n\"rust-sitter-macro\"\n\"rust-spice-derive\"\n\"rust-xfinal-macro\"\n\"rust_decimal_macro_impls\"\n\"rust_decimal_macros\"\n\"rust_events_derive\"\n\"rust_gui_macros\"\n\"rust_hawktracer_proc_macro\"\n\"rust_transit_derive\"\n\"rustabi-derive\"\n\"rustacuda_derive\"\n\"rustbus_derive\"\n\"rustc-ap-rustc_macros\"\n\"rustc_codegen_nvvm_macros\"\n\"rusteval-derive\"\n\"rustfmt-config_proc_macro\"\n\"rustfsm_procmacro\"\n\"rustico\"\n\"rustier-macros\"\n\"rustiful-derive\"\n\"rustify_derive\"\n\"rustmex-entrypoint\"\n\"rustorm-derive\"\n\"rustorm_codegen\"\n\"rustpub-macro\"\n\"rustpython-derive\"\n\"rustructure-macros\"\n\"ruststep-derive\"\n\"rustversion\"\n\"rusty-gql-macro\"\n\"rusty-html-macros\"\n\"rusty-junctions-client-api-proc-macro\"\n\"rusty-junctions-library-generation-proc-macro\"\n\"rusty_german_entity_macro\"\n\"rusty_jsc_macros\"\n\"rusty_v8_helper_derive\"\n\"rustyle\"\n\"rustyline-derive\"\n\"rutel_derive\"\n\"rutenspitz_macro\"\n\"ruukh-codegen\"\n\"rvs_derive\"\n\"rvv-asm\"\n\"rwasm_macro\"\n\"rweb-macros\"\n\"rweb-testing-macros\"\n\"rxml_proc\"\n\"rye-macros\"\n\"rysk-tools-macro\"\n\"rzhavchina\"\n\"s_test_fixture\"\n\"sabi_derive\"\n\"sad_machine\"\n\"safe\"\n\"safe-builder-derive\"\n\"safe-bytes-derive\"\n\"safe-regex-macro\"\n\"safe-uninit-derive\"\n\"safe_attr\"\n\"safe_ecs_derive\"\n\"safecoin-frozen-abi-macro\"\n\"safecoin-sdk-macro\"\n\"safer_ffi-proc_macro\"\n\"safety-guard\"\n\"safina-async-test-core\"\n\"sai_component_derive\"\n\"sailfish-macros\"\n\"saito-macros\"\n\"salak_derive\"\n\"salsa-macros\"\n\"salvia_macro\"\n\"salvo_macro\"\n\"salvo_macros\"\n\"samotop-async-trait\"\n\"samp-codegen\"\n\"sana_derive\"\n\"sanitizeable_derive\"\n\"sanitizer_macros\"\n\"saphir_macro\"\n\"sapio_macros\"\n\"saturating_arithmetic\"\n\"sauron-component-macro\"\n\"sauron-node-macro\"\n\"savage_macros\"\n\"save_state_derive\"\n\"savefile-derive\"\n\"savory-derive\"\n\"savory-elements-derive\"\n\"savory-router\"\n\"saw_mcr\"\n\"sawp-ffi-derive\"\n\"sawp-flags-derive\"\n\"sbml-macros\"\n\"sc-chain-spec-derive\"\n\"sc-tracing-proc-macro\"\n\"sc2-proc-macro\"\n\"scale-info-derive\"\n\"scale_documentation_parser\"\n\"scale_impl_generator\"\n\"scanfmt_macros\"\n\"schema-derive\"\n\"schema_oxidation\"\n\"schemafy\"\n\"schemars_derive\"\n\"scientific-macro\"\n\"scones_macros\"\n\"scoped-gc-derive\"\n\"scoped_css\"\n\"scoundrel-macro\"\n\"scpi_derive\"\n\"scraper-macros\"\n\"scrappy-derive\"\n\"scrappy-macros\"\n\"scrappy-web-codegen\"\n\"scrappy_do_codegen\"\n\"scripthookv-rs-macros\"\n\"scroll_derive\"\n\"scsys-derive\"\n\"scsys-macros\"\n\"scylla-macros\"\n\"scylla-macros-flex\"\n\"scylla_orm_macro\"\n\"scylladb-macros\"\n\"scylladb-parse-macros\"\n\"sdb_macro\"\n\"sea-orm-field-updater\"\n\"sea-orm-macros\"\n\"sea-orm-rocket-codegen\"\n\"sea-query-attr\"\n\"sea-query-derive\"\n\"sea-query-driver\"\n\"sea-schema-derive\"\n\"sea-strum_macros\"\n\"sealed\"\n\"sealed_test_derive\"\n\"seamless_macros\"\n\"seaography-derive\"\n\"seawater-macro\"\n\"secop-derive\"\n\"section_parser_derive\"\n\"seed_style_macros\"\n\"segsource-derive\"\n\"select-rustc\"\n\"selectme-macros\"\n\"self-rust-tokenize-derive\"\n\"selfstack\"\n\"semantics-derive\"\n\"sensible\"\n\"sentinel-macros\"\n\"separable-derive\"\n\"seq-macro\"\n\"sequential-macro\"\n\"serbia\"\n\"serde-bindgen-core-derive\"\n\"serde-deserialize-over-derive\"\n\"serde-diff-derive\"\n\"serde-enum\"\n\"serde-enum-derive\"\n\"serde-enum-str\"\n\"serde-ext-macros\"\n\"serde-indexed\"\n\"serde-intermediate-derive\"\n\"serde-json-helpers\"\n\"serde-lite-derive\"\n\"serde-query-derive\"\n\"serde-reflect-intermediate-derive\"\n\"serde-semver-derive\"\n\"serde-tc-macro\"\n\"serde-versions-derive\"\n\"serde_alias\"\n\"serde_amqp_derive\"\n\"serde_apply_macros\"\n\"serde_closure_derive\"\n\"serde_compact\"\n\"serde_default\"\n\"serde_derive\"\n\"serde_derive_state\"\n\"serde_dhall_typegen\"\n\"serde_flat_regex\"\n\"serde_int_map_derive\"\n\"serde_mtproto_derive\"\n\"serde_piecewise_default_derive\"\n\"serde_prefix\"\n\"serde_python_derive\"\n\"serde_repr\"\n\"serde_roundtrip_derive\"\n\"serde_schema_derive\"\n\"serde_someip_derive\"\n\"serde_tuple_macros\"\n\"serde_unit_struct_derive\"\n\"serde_valid_derive\"\n\"serde_version_derive\"\n\"serde_with_macros\"\n\"serdebug_derive\"\n\"serdine_derive\"\n\"serenity_group_name\"\n\"serial_test_derive\"\n\"serialize-to-javascript-impl\"\n\"seripack_macros\"\n\"serum-borsh-derive\"\n\"servant-macro\"\n\"settings-schema-derive\"\n\"sewup-derive\"\n\"sexpy_derive\"\n\"sfsm-proc\"\n\"sgr\"\n\"sgr_macros\"\n\"sgx-type-debug\"\n\"sgx_align_struct_attribute\"\n\"sgx_rand_derive\"\n\"sgx_serialize_derive\"\n\"sgxs-tools\"\n\"sh-builtin-bash-proc\"\n\"sha2-derive-proc-macro\"\n\"shader_macro\"\n\"shaderc-macro\"\n\"shades-edsl\"\n\"shaku_derive\"\n\"shank_macro\"\n\"shard_ecs_derive\"\n\"shardize\"\n\"shared_memory_derive\"\n\"shellfn-attribute\"\n\"shine-ecs-macro\"\n\"shine-gltf-macro\"\n\"shine-graph-macro\"\n\"shine_component_derive\"\n\"shinyframework_codegen\"\n\"shippai_derive\"\n\"shipyard_proc\"\n\"shogun-rust-procedural\"\n\"shoogah_macros\"\n\"shorthand\"\n\"shoulda_macro\"\n\"shred-derive\"\n\"shredder_derive\"\n\"shrinkwraprs\"\n\"shumai-config-impl\"\n\"shuttle-codegen\"\n\"sia-macro\"\n\"sidetree\"\n\"sidevm-macro\"\n\"sierra-proc\"\n\"sif_macro\"\n\"signature_derive\"\n\"sim_derive\"\n\"simavr-section-macro\"\n\"simd-json-derive-int\"\n\"simd_helpers\"\n\"simi-macros\"\n\"simple-bind\"\n\"simple-hash-macro\"\n\"simple-tlv_derive\"\n\"simple_calculator_deliver\"\n\"simple_func_timer\"\n\"simple_parse_derive\"\n\"simple_tables-derive\"\n\"simple_test_case\"\n\"simple_xml_serialize_macro\"\n\"simpleord\"\n\"simplicity_derive\"\n\"simulink-binder\"\n\"simx\"\n\"sing_macros\"\n\"singleton-derive\"\n\"singletonum-derive\"\n\"sir-macro\"\n\"sixtyfps-corelib-macros\"\n\"sixtyfps-macros\"\n\"size-of-derive\"\n\"sjis-literals\"\n\"skidscan-macros\"\n\"sky-derive\"\n\"skyline_macro\"\n\"slashies-macros\"\n\"slashook-macros\"\n\"slashy_macros\"\n\"slicert\"\n\"slices\"\n\"slices-hack\"\n\"slint-macros\"\n\"slip-imp\"\n\"slist-derive\"\n\"slog-extlog-derive\"\n\"slog-mock-proc-macros\"\n\"sm-ext-derive\"\n\"sm_macro\"\n\"small_ctor\"\n\"smart-contract-macros\"\n\"smart-default\"\n\"smart-hash-derive\"\n\"smd_macro\"\n\"smelter\"\n\"smlang-macros\"\n\"smoke-macros\"\n\"smol-attributes\"\n\"smol-potat-derive\"\n\"smol-potat-macro\"\n\"smoldb_derive\"\n\"snafu-cli-debug\"\n\"snafu-derive\"\n\"snake_cased_derive\"\n\"snapshot-proc-macro\"\n\"snarkvm-circuit-environment-witness\"\n\"snarkvm-derives\"\n\"snarkvm-utilities-derives\"\n\"snec_macros\"\n\"snowcat_macros\"\n\"snowchains_proc_macros\"\n\"soa_derive_internal\"\n\"soak-derive\"\n\"solana-frozen-abi-macro\"\n\"solana-sdk-macro\"\n\"solana-sdk-macro-frozen-abi\"\n\"solana_libra_proto_conv_derive\"\n\"solarsail-macros\"\n\"solders-macros\"\n\"solid-derive\"\n\"solidity-bindgen-macros\"\n\"soloud-derive\"\n\"solstice-derive\"\n\"some-error\"\n\"someip_derive\"\n\"sonic_serde_macros\"\n\"sonic_spin\"\n\"sonicbot-macros\"\n\"sonicbot-matrix-macros\"\n\"soroban-env-macros\"\n\"soroban-native-sdk-macros\"\n\"soroban-sdk-macros\"\n\"sort_by_derive\"\n\"sorted_locks_derive\"\n\"sourcegen\"\n\"sp-api-proc-macro\"\n\"sp-core-hashing-proc-macro\"\n\"sp-debug-derive\"\n\"sp-multihash-derive\"\n\"sp-npos-elections-compact\"\n\"sp-phragmen-compact\"\n\"sp-runtime-interface-proc-macro\"\n\"sp-version-proc-macro\"\n\"spa-server-derive\"\n\"spaad_internal\"\n\"spacetimedb-bindgen\"\n\"spandoc-attribute\"\n\"sparta-proc-macros\"\n\"spec\"\n\"specit\"\n\"specs-derive\"\n\"specs-visitor-derive\"\n\"specta-macros\"\n\"spectacle-derive\"\n\"spectacle-impl-tuples\"\n\"spectrum-macros\"\n\"speculate\"\n\"speedy-derive\"\n\"spez-macros\"\n\"sphinx-use-state\"\n\"spice21procs\"\n\"spirv-std-macros\"\n\"spirv-struct-layout-derive\"\n\"splitter-derive\"\n\"sppparse_derive\"\n\"sprattus-derive\"\n\"sql_db_mapper_derive\"\n\"sqlb-macros\"\n\"sqlstate-macros\"\n\"sqlx-crud-macros\"\n\"sqlx-database-tester-macros\"\n\"sqlx-derive-with\"\n\"sqlx-macros\"\n\"sqlx-model-macros\"\n\"sqlx-models-derive\"\n\"sqlx-models-proc-macro\"\n\"sqlx-plus-macros\"\n\"sqlx-type-macro\"\n\"sqlxinsert\"\n\"sqlxmq_macros\"\n\"square-ox-derive\"\n\"squark-macros\"\n\"squtils\"\n\"srcpos_get_derive\"\n\"srpc-macro\"\n\"ssbh_write_derive\"\n\"sscanf_macro\"\n\"ssvm-evmc-declare\"\n\"ssz-derive\"\n\"ssz_rs_derive\"\n\"sszb_derive\"\n\"stability\"\n\"stable-step-derive\"\n\"staged-builder-internals\"\n\"standard-dist\"\n\"starchart-derive\"\n\"stargate-grpc-derive\"\n\"starlane-macros\"\n\"starlark_derive\"\n\"starlark_module\"\n\"starship_module_config_derive\"\n\"stateful_macro_rules\"\n\"statemachine-macro\"\n\"stateroom-wasm-macro\"\n\"static-address\"\n\"static-address-macro\"\n\"static-iref\"\n\"static-map-macro\"\n\"static-noise\"\n\"static-pubkey\"\n\"static-reflect-derive\"\n\"static-router-macros\"\n\"static_init_macro\"\n\"static_map_macros\"\n\"static_res\"\n\"static_table_derive\"\n\"static_test\"\n\"staticfilemap\"\n\"std140-macros\"\n\"stdf-record-derive\"\n\"stdin_parser_derive\"\n\"stdweb-derive\"\n\"stdweb-internal-macros\"\n\"stdweb-internal-test-macro\"\n\"steam-language-gen-derive\"\n\"stidgen\"\n\"stivale-proc\"\n\"stix_derive\"\n\"stlog-macros\"\n\"storm_macro\"\n\"stowaway-derive\"\n\"str-match\"\n\"str_to_enum_derive\"\n\"stratisd_proc_macros\"\n\"stratus-macros\"\n\"stream-future-impl\"\n\"streamduck-core-derive\"\n\"strict_encoding_derive\"\n\"string_enum\"\n\"string_literal\"\n\"stringify-attr\"\n\"stringly_typed_derive\"\n\"strong-xml-derive\"\n\"stronghold-derive\"\n\"struct-convert\"\n\"struct-field-names-as-array\"\n\"struct-merge-codegen\"\n\"struct-variant\"\n\"struct2swagger_derive\"\n\"struct2vec_derive\"\n\"struct_deser-derive\"\n\"struct_field\"\n\"struct_field_names\"\n\"struct_fragment\"\n\"struct_gen_derive\"\n\"struct_layout\"\n\"structbuilder_derive\"\n\"structconf_derive\"\n\"structdoc-derive\"\n\"structdump-derive\"\n\"structenv_derive\"\n\"structform-derive\"\n\"structmap-derive\"\n\"structmapper-codegen\"\n\"structmeta-derive\"\n\"structopt-derive\"\n\"structopt-toml-derive\"\n\"structopt-yaml-derive\"\n\"structout\"\n\"structscan_derive\"\n\"structstruck\"\n\"structsy-derive\"\n\"structural-assert\"\n\"structural_derive\"\n\"structure-macro-impl\"\n\"structview_derive\"\n\"structx_derive\"\n\"structype_derive\"\n\"strukt\"\n\"strum_macros\"\n\"strung_derive\"\n\"struple-impl\"\n\"stry-attrouter\"\n\"stub_trait\"\n\"stubr-attributes\"\n\"stuck-macros\"\n\"stylist-macros\"\n\"sub-model\"\n\"submillisecond_macros\"\n\"suborbital-macro\"\n\"subplotlib-derive\"\n\"subrpcer-impl\"\n\"substance-macro\"\n\"substrait-validator-derive\"\n\"substrate-subxt-proc-macro\"\n\"substrate-test-utils-derive\"\n\"substreams-ethereum-derive\"\n\"substreams-macro\"\n\"subtle-derive\"\n\"subtle-ng-derive\"\n\"subxt-macro\"\n\"sudograph-generate\"\n\"sul\"\n\"sully_peg\"\n\"sum_error\"\n\"summer-boot-macro\"\n\"sunbeam-macro\"\n\"sundial-derives\"\n\"sunfish_macro\"\n\"sunscreen_compiler_macros\"\n\"sunset-sshwire-derive\"\n\"super-sabicom-macro\"\n\"superbitty-macros\"\n\"supermod\"\n\"superstruct\"\n\"suricata-derive\"\n\"surjective-enum\"\n\"surrealdb-derive\"\n\"suspend_fn_proc_macro\"\n\"susy-codec-derive\"\n\"susy-jsonrpc-derive\"\n\"susyabi-derive\"\n\"susydev-jsonrpc-derive\"\n\"susyp2p-core-derive\"\n\"sv-parser-macros\"\n\"sval_derive\"\n\"svec_macro\"\n\"svgbobdoc\"\n\"swarm-bot-packets-macro\"\n\"swarm-derive\"\n\"sway-ir-macros\"\n\"swc_config_macro\"\n\"swc_css_codegen_macros\"\n\"swc_ecma_codegen_macros\"\n\"swc_ecma_parser_macros\"\n\"swc_ecma_quote_macros\"\n\"swc_ecma_transforms_macros\"\n\"swc_ecma_visit_macros\"\n\"swc_eq_ignore_macros\"\n\"swc_estree_macros\"\n\"swc_html_codegen_macros\"\n\"swc_plugin_macro\"\n\"swc_trace_macro\"\n\"swc_visit_macros\"\n\"swc_xml_codegen_macros\"\n\"swift-bridge-macro\"\n\"swipl-macros\"\n\"sycamore-macro\"\n\"sycamore-router-macro\"\n\"syllogism-macro\"\n\"sylt-macro\"\n\"sylvia-derive\"\n\"symm_impl\"\n\"symoxide_macros\"\n\"syncwrap\"\n\"syndicate-macros\"\n\"synonym\"\n\"synthez-codegen\"\n\"t4rust-derive\"\n\"tabled_derive\"\n\"tablefy_derive\"\n\"tackt-macros\"\n\"tagged_bytes\"\n\"taikai\"\n\"tailcall-impl\"\n\"talos_procs\"\n\"tamasfe-schemars_derive\"\n\"tamata-macros\"\n\"tangram_macro\"\n\"taos-macros\"\n\"tapa-trait-serde-derive\"\n\"tapioca-codegen\"\n\"tappet-derive\"\n\"tarantool-proc\"\n\"target-cpu-macro\"\n\"target-lexicon-macros\"\n\"tari_comms_rpc_macros\"\n\"tari_infra_derive\"\n\"tarpc-plugins\"\n\"tarrasque-macro\"\n\"tauri-macros\"\n\"tc-chain-spec-derive\"\n\"tc-tracing-proc-macro\"\n\"tch-tensor-like-derive\"\n\"tco\"\n\"tealr_derive\"\n\"teensy-lc-macros\"\n\"teil_derive\"\n\"telebot-derive\"\n\"telegraf_derive\"\n\"telegram_derive\"\n\"telexide_fork_proc_macros\"\n\"telexide_proc_macros\"\n\"teloc_macros\"\n\"teloxide-macros\"\n\"templar_macros\"\n\"templing\"\n\"temply-derive\"\n\"tencent_scf_derive\"\n\"tensorflow-internal-macros\"\n\"tensorflow_proto_derive\"\n\"tent_codegen\"\n\"tent_proc_macros\"\n\"term-data-table-derive\"\n\"termcandy-macros\"\n\"termcolor_output_impl\"\n\"termination_attrib\"\n\"termpixels_derive\"\n\"test-case-derive\"\n\"test-case-macros\"\n\"test-collector-derive\"\n\"test-context-macros\"\n\"test-env-helpers\"\n\"test-env-log\"\n\"test-fuzz-macro\"\n\"test-generator\"\n\"test-ignore-if\"\n\"test-impl\"\n\"test-log\"\n\"test-span-macro\"\n\"test-strategy\"\n\"test-with\"\n\"test_deps_if\"\n\"test_double\"\n\"testaun\"\n\"testcat\"\n\"testdata-macros\"\n\"testgen\"\n\"testing_macros\"\n\"tet-libp2p-core-derive\"\n\"tetcore-subxt-proc-macro\"\n\"tetcore-test-utils-derive\"\n\"tetsy-codec-derive\"\n\"tetsy-jsonrpc-derive\"\n\"tetsy-libp2p-core-derive\"\n\"tetsy-rlp-derive\"\n\"tetsy-scale-codec-derive\"\n\"tetsy-scale-info-derive\"\n\"tetsy-util-mem-derive\"\n\"tex_derive\"\n\"textwrap-macros-impl\"\n\"thalo-macros\"\n\"thcon_macro\"\n\"thespis_derive\"\n\"thin_trait_object\"\n\"third-pact\"\n\"thirtyfour-macros\"\n\"thirtyfour-querier-derive\"\n\"thisctx_impl\"\n\"thiserror-impl\"\n\"thiserror-impl-no-std\"\n\"thiserror_core2-impl\"\n\"thread_spawn\"\n\"three_em_macro\"\n\"throttle_my_fn\"\n\"thruster-proc\"\n\"thruster-socketio-proc\"\n\"thruster-x\"\n\"thunder\"\n\"thunderbird-macros\"\n\"tia\"\n\"tiberius-derive\"\n\"tide-jsx-impl\"\n\"tide-serve-dir-macro\"\n\"tidy-builder\"\n\"tilde\"\n\"time-graph-macros\"\n\"time-macros\"\n\"time-macros-impl\"\n\"time_main\"\n\"timed_function\"\n\"timed_proc_macros\"\n\"timesource-derive\"\n\"tiny-multihash-derive\"\n\"tiny-multihash-proc-macro\"\n\"tiny-rpc-macros\"\n\"tiny_orm_macro_derive\"\n\"tinyhttp-codegen\"\n\"tinyparse_macro\"\n\"tl-proto-proc\"\n\"tlayuda\"\n\"tls_codec_derive\"\n\"tlua-derive\"\n\"tm-derive\"\n\"to-syn-error-derive\"\n\"to-syn-value_derive\"\n\"to_bytes_derive\"\n\"to_hash_map\"\n\"todo-or-die\"\n\"tojson_macros\"\n\"tokay-macros\"\n\"token-parser-derive\"\n\"tokio-actor\"\n\"tokio-async-attributes\"\n\"tokio-async-await-test\"\n\"tokio-macros\"\n\"tokio-pg-mapper-derive\"\n\"tokio-zmq-derive\"\n\"tokio_env_macro\"\n\"toml-cfg\"\n\"toml-query_derive\"\n\"tonic-error-impl\"\n\"tonic-include-proto\"\n\"tonic-rpc-macro\"\n\"tonic_catch_proc\"\n\"tonic_include_protos\"\n\"took-macro\"\n\"topo-macro\"\n\"toql_derive\"\n\"toql_enum_derive\"\n\"toql_fields_macro\"\n\"toql_paths_macro\"\n\"toql_query_macro\"\n\"toql_role_expr_macro\"\n\"toql_sql_expr_macro\"\n\"torn-api-macros\"\n\"tower-lsp-macros\"\n\"tower-web-macros\"\n\"toy-arms_derive\"\n\"toy-rpc-macros\"\n\"tp-api-proc-macro\"\n\"tp-npos-elections-compact\"\n\"tp-runtime-interface-proc-macro\"\n\"tql_macros\"\n\"trace\"\n\"trace-tools-attributes\"\n\"trace2_macro\"\n\"trace_caller_macro\"\n\"tracelogging_macros\"\n\"tracers-macros-hack\"\n\"tracing-attributes\"\n\"tracing-attributes-http\"\n\"tracing-attributes-hyper\"\n\"tracing-forest-macros\"\n\"tracing-rc-derive\"\n\"tracing-test-macro\"\n\"track-macro\"\n\"trackable_derive\"\n\"tracked-impl\"\n\"tracker-macros\"\n\"tractor-macros\"\n\"trade_aggregation_derive\"\n\"trait-async\"\n\"trait-enumizer-derive\"\n\"trait-match-proc-macro\"\n\"trait-set\"\n\"trait-union-proc\"\n\"trait_adapters_macros\"\n\"trait_cast_impl_rs\"\n\"trait_derive\"\n\"trait_tests\"\n\"traitlit\"\n\"traitor-derive\"\n\"trans-derive\"\n\"trans-schema-derive\"\n\"transit_model_procmacro\"\n\"translation_provider\"\n\"translator\"\n\"transmute-tools\"\n\"trapper_macro\"\n\"trdelnik-test\"\n\"treasure-map-derive\"\n\"tree-buf-macros\"\n\"tree_hash_derive\"\n\"treeflection_derive\"\n\"trigraph\"\n\"trillium-include-dir-impl\"\n\"trillium-static-compiled-macros\"\n\"trimmer_derive\"\n\"trpc-rs-macros\"\n\"trustfall_filetests_macros\"\n\"try-catch\"\n\"try-let\"\n\"try_clone_derive\"\n\"try_match_inner\"\n\"tryfromfail\"\n\"ts-bindgen-build-support\"\n\"ts-rs-macros\"\n\"ts2rs\"\n\"ts3_derive\"\n\"tsify-macros\"\n\"tskit-derive\"\n\"tstr_proc_macros\"\n\"tsukuyomi-macros\"\n\"tsync\"\n\"tt-equal\"\n\"tt-identifier\"\n\"tttr-toolbox-proc-macros\"\n\"tui-markup-ansi-macro\"\n\"tuirealm_derive\"\n\"tuix_derive\"\n\"tulip-derivative\"\n\"tumbleweed_derive\"\n\"tuna-macros\"\n\"tupiter-proc-macro\"\n\"tuple-iter\"\n\"tupleops-macros\"\n\"turbocharger-impl\"\n\"turbolift_macros\"\n\"turbomod\"\n\"turbonone\"\n\"turbosloth-macros\"\n\"turbosql-impl\"\n\"tvm-macros\"\n\"tw-storage-macros\"\n\"twilight-interactions-derive\"\n\"two-rusty-forks-macro\"\n\"tyenum_attribute\"\n\"tylift\"\n\"typ\"\n\"type-census-derive\"\n\"type-change\"\n\"type-cli-derive\"\n\"type-info-derive\"\n\"type-layout-derive\"\n\"type-name-derive\"\n\"type-rules-derive\"\n\"type-uuid-derive\"\n\"type_at_derive\"\n\"type_description_derive\"\n\"type_hash_macros\"\n\"type_utils\"\n\"typed-builder\"\n\"typed-html-macros\"\n\"typed-qb-procmacro\"\n\"typed-sql-derive\"\n\"typed-store-derive\"\n\"typed-urls-derive\"\n\"typed_index_derive\"\n\"typemap-meta-derive\"\n\"typename_derive\"\n\"typenaming-derive\"\n\"typenum-promote\"\n\"typesafe-derive-builder\"\n\"typescript-definitions-derive\"\n\"typescript-definitions-derive-ufo-patch\"\n\"typescript-type-def-derive\"\n\"typescript-wasm-bindgen-macros\"\n\"typescriptify-derive\"\n\"typesense_derive\"\n\"typesets-macro\"\n\"typeshare_marker\"\n\"typestate-proc-macro\"\n\"typetag-impl\"\n\"typetrait\"\n\"typic-derive\"\n\"typify-macro\"\n\"typsy-macros\"\n\"u256-literal\"\n\"u64_array_bigints_macros\"\n\"uapi-proc\"\n\"uavcan-derive\"\n\"ublox_derive\"\n\"uclicious_derive\"\n\"uefi-macros\"\n\"ufmt-macros\"\n\"ugli-derive\"\n\"uhppote-derive\"\n\"ui4-macros\"\n\"uindex_derive\"\n\"uncon_derive\"\n\"unconst_trait_impl\"\n\"unhtml_derive\"\n\"unhygienic-impl\"\n\"unhygienic2\"\n\"uni_components_macro\"\n\"uni_localservice_macro\"\n\"unicode_names2_macros\"\n\"uniffi_macros\"\n\"unimock_macros\"\n\"union_export\"\n\"union_type\"\n\"unique-type-id-derive\"\n\"unit-derive\"\n\"unit-proc\"\n\"unit_system_derive\"\n\"unite\"\n\"unitval-derive\"\n\"uniui_gui_macro\"\n\"unix-ts-macros\"\n\"unpat\"\n\"unprolix\"\n\"unquote\"\n\"unrest_codegen\"\n\"unroll\"\n\"unsafe_fn\"\n\"unstringify\"\n\"unwind_aborts\"\n\"unwrap_all\"\n\"unwrap_helpers_proc_macros\"\n\"unzip-n\"\n\"uom-macros\"\n\"update-sync_derive\"\n\"uptown_funk_macro\"\n\"uri_path_router\"\n\"urid-derive\"\n\"usbd-hid-macros\"\n\"usdt-attr-macro\"\n\"usdt-macro\"\n\"user_doc-doc_proc_macro\"\n\"usual-proc\"\n\"ut\"\n\"utf16_literal\"\n\"utf32-lit\"\n\"utility-types\"\n\"utils-plugs-proc\"\n\"utoipa-gen\"\n\"utools\"\n\"uucore_procs\"\n\"uuid-macro-internal\"\n\"ux-macro\"\n\"v11_macros\"\n\"v9-attr\"\n\"v_escape_derive\"\n\"vale-derive\"\n\"validated_struct_macros\"\n\"validator_derive\"\n\"validators-derive\"\n\"valor_plugin\"\n\"valora_derive\"\n\"valuable-derive\"\n\"value_from_type_macros\"\n\"valuetypes\"\n\"vapabi-derive\"\n\"vararg\"\n\"variant_access\"\n\"variant_access_derive\"\n\"variant_count\"\n\"variant_counter_derived\"\n\"variant_name_derive\"\n\"varianteq\"\n\"variantly\"\n\"variants-struct\"\n\"variation\"\n\"varies\"\n\"varisat-internal-macros\"\n\"varlen_macro\"\n\"vary\"\n\"vec-reg-macro\"\n\"vecmerge-impl\"\n\"vecn\"\n\"velcro_macros\"\n\"veneer-macros\"\n\"veriform_derive\"\n\"verify-macros\"\n\"verify_macro\"\n\"verilated-module\"\n\"version-consts-git-impl\"\n\"versionize_derive\"\n\"versuch\"\n\"vertigo-html-macro\"\n\"vertigo-macro\"\n\"vgtk-macros\"\n\"viable-impl\"\n\"view\"\n\"view_macro\"\n\"vimwiki_macros\"\n\"visa-rs-proc\"\n\"visibility\"\n\"visible\"\n\"visit\"\n\"visit_diff_derive\"\n\"visita_macros\"\n\"viz-macros\"\n\"vizz_derive\"\n\"vk-shader-macros\"\n\"vk-shader-macros-impl\"\n\"vmnet-derive\"\n\"vmprotect-macros\"\n\"volkswagen\"\n\"volo-macros\"\n\"vptr-macros\"\n\"vride-macros\"\n\"vru-noise-macros\"\n\"vsdb_derive\"\n\"vtable-macro\"\n\"vtables_derive\"\n\"vte_generate_state_changes\"\n\"vujio\"\n\"vulkano-shaders\"\n\"wa-serde-derive\"\n\"wa_proto_macro\"\n\"waiter_codegen\"\n\"walle-macro\"\n\"warp_dsl_impl\"\n\"wasi-common-cbindgen\"\n\"wasm-bindgen-derive\"\n\"wasm-bindgen-macro\"\n\"wasm-bindgen-test-macro\"\n\"wasm-bus-macros\"\n\"wasm-interfacegen-macro\"\n\"wasm-rpc-macros\"\n\"wasm-run-proc-macro\"\n\"wasm-typescript-definition\"\n\"wasm-wrapper-gen-impl\"\n\"wasm4-impl\"\n\"wasm_plugin_guest_derive\"\n\"wasmbin-derive\"\n\"wasmbox-macro\"\n\"wasmbus-macros\"\n\"wasmcloud-actor-core-derive\"\n\"wasmedge-bindgen-macro\"\n\"wasmer-bus-macros\"\n\"wasmer-derive\"\n\"wasmer-derive-asml-fork\"\n\"wasmer-derive-near\"\n\"wasmer-inline-c-macro\"\n\"wasmer-wit-bindgen-rust-impl\"\n\"wasmer_enumset_derive\"\n\"wasmesh-macros\"\n\"wasmir\"\n\"wasmtime-component-macro\"\n\"wasmtime-rust-macro\"\n\"wasmtime-wiggle-macro\"\n\"wasmtime_plugin_guest_derive\"\n\"wasmy-macros\"\n\"wasmyon-macro-support\"\n\"waterbear-instruction-derive\"\n\"wayk_proto_derive\"\n\"wayland-scanner\"\n\"waytogo-macro\"\n\"wchar-impl\"\n\"wd-40\"\n\"wd_macro\"\n\"we-derive\"\n\"wearte_derive\"\n\"web-component-derive\"\n\"web-glitz-macros\"\n\"web-sys-query-derive\"\n\"webassembly-test\"\n\"webforms_derive\"\n\"webframework-derive\"\n\"webgl-rc-macro\"\n\"weblab-macros\"\n\"weblog-proc-macro\"\n\"webview2-com-callback-macros\"\n\"webview2-com-macros\"\n\"weechat-macro\"\n\"weft_derive\"\n\"wezterm-dynamic-derive\"\n\"wgpu-traits\"\n\"wgpu_macros\"\n\"whasm-grammar-derive\"\n\"whaterror_macros\"\n\"wide-literals\"\n\"wide-str-impl\"\n\"wig\"\n\"wiggle-macro\"\n\"wikiproc\"\n\"willow-codegen\"\n\"win_etw_macros\"\n\"windows-define\"\n\"windows-dll-codegen\"\n\"windows-implement\"\n\"windows-interface\"\n\"windows_gen_macros\"\n\"windows_winmd_macros\"\n\"windy-macros\"\n\"winit-main-proc\"\n\"winmd-macros\"\n\"winrt_gen_macros\"\n\"winrt_macros\"\n\"winspawn-macro\"\n\"winstr-macros\"\n\"winwrap-derive\"\n\"witchcraft-server-macros\"\n\"witgen_macro\"\n\"with_builtin_macros-proc_macros\"\n\"with_locals-proc_macros\"\n\"with_tempdir\"\n\"wither_derive\"\n\"withers_derive\"\n\"wll-macros\"\n\"wlroots-dehandle\"\n\"woab-macros\"\n\"wolfram-library-link-macros\"\n\"wonderbox-codegen\"\n\"wood_derive\"\n\"woptions_meta\"\n\"worker-macros\"\n\"workflow_macro\"\n\"wotw_seedgen_derive\"\n\"wrapcenum-derive\"\n\"wrapped-vec\"\n\"wrapping_arithmetic\"\n\"wrapping_proc_macro\"\n\"wraptest\"\n\"ws2812-spi-write-constants\"\n\"wstr_impl\"\n\"wundergraph_derive\"\n\"x86test-macro\"\n\"xactor-derive\"\n\"xaynet-macros\"\n\"xdr-rs-serialize-derive\"\n\"xecs_derive\"\n\"xflags-macros\"\n\"xladd-derive\"\n\"xls_table_derive\"\n\"xml-attributes-derive\"\n\"xml-data-derive\"\n\"xml-schema-derive\"\n\"xmlparser-derive-core\"\n\"xmpp-derive\"\n\"xops_macros\"\n\"xorstring-procmacro\"\n\"xous-macros\"\n\"xql-derive\"\n\"xshell-macros\"\n\"xtask-wasm-run-example\"\n\"xtensa-lx-rt-proc-macros\"\n\"xtensa-lx106-rt-proc-macros\"\n\"xtensa-lx6-rt-proc-macros\"\n\"xtor_derive\"\n\"xtra_proc\"\n\"xui-macros\"\n\"xxlib_builder\"\n\"xylem-codegen\"\n\"ya-runtime-sdk-derive\"\n\"yaaf-macros\"\n\"yade\"\n\"yaga-derive\"\n\"yare-macro\"\n\"yarte_derive\"\n\"yarte_lexer_gencode\"\n\"yasec_derive\"\n\"yaserde_derive\"\n\"yatima-rustyline-derive\"\n\"yatt_orm_derive\"\n\"yerpc_derive\"\n\"yew-component\"\n\"yew-fs-router-macro\"\n\"yew-interop-macro\"\n\"yew-macro\"\n\"yew-route-breadcrumbs-derive\"\n\"yew-router-macro\"\n\"yew-router-min-macro\"\n\"yew-router-nested-macro\"\n\"yew-style-in-rs-macro\"\n\"yew_form_derive\"\n\"yewdux-macros\"\n\"yewtil-macro\"\n\"yield-closures-impl\"\n\"yolo_keyword\"\n\"yooper_derive\"\n\"you-can-build-macros\"\n\"youxi-codegen\"\n\"yoyo-macros\"\n\"yui_derive\"\n\"z3d\"\n\"zapper_derive\"\n\"zbus_macros\"\n\"zc-derive\"\n\"zephyrus-macros\"\n\"zero_v_gen\"\n\"zeroable_derive\"\n\"zeroconf-macros\"\n\"zerocopy-derive\"\n\"zerogc-derive\"\n\"zeroize_derive\"\n\"zeronet_sign_derive\"\n\"zestors-codegen\"\n\"zfs-rs-macros\"\n\"zhi_enum_derive\"\n\"zipkin-macros\"\n\"zisvalidator_derive\"\n\"zkp-macros-impl\"\n\"zoet-macro\"\n\"zone_cfg_derive\"\n\"zookeeper_derive\"\n\"zstr\"\n\"zvariant_derive\"\n]\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  inputs = {\n    flake-utils.url = \"github:numtide/flake-utils\";\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n    registry-crates-io = {\n      url = \"github:rust-lang/crates.io-index\";\n      flake = false;\n    };\n  };\n\n  outputs = { self, flake-utils, nixpkgs, registry-crates-io }@inputs:\n    let\n      supportedSystems = [ \"x86_64-linux\" \"aarch64-linux\" ];\n\n      inherit (builtins) toJSON typeOf;\n      inherit (nixpkgs.lib) isDerivation isFunction isAttrs mapAttrsToList listToAttrs flatten;\n\n      nocargo-lib = import ./lib { inherit (nixpkgs) lib; };\n\n    in flake-utils.lib.eachSystem supportedSystems (system:\n      let\n        pkgs = nixpkgs.legacyPackages.${system};\n        defaultRegistries = {\n          \"https://github.com/rust-lang/crates.io-index\" =\n            nocargo-lib.pkg-info.mkIndex pkgs.fetchurl registry-crates-io\n            (import ./crates-io-override {\n              inherit (nixpkgs) lib;\n              inherit pkgs;\n            });\n        };\n      in rec {\n        apps.default = {\n          type = \"app\";\n          program = \"${packages.noc}/bin/noc\";\n        };\n\n        # Is there a better place? `naersk` places builders under `lib.${system}`.\n        lib = rec {\n          mkIndex = nocargo-lib.pkg-info.mkIndex pkgs.fetchurl;\n          buildRustCrate = pkgs.callPackage ./build-rust-crate {\n            inherit (packages) toml2json;\n            inherit nocargo-lib;\n          };\n          mkRustPackageOrWorkspace = pkgs.callPackage nocargo-lib.support.mkRustPackageOrWorkspace {\n            inherit defaultRegistries buildRustCrate;\n          };\n        };\n\n        packages = rec {\n          default = noc;\n          toml2json = pkgs.callPackage ./toml2json { };\n          noc = (lib.mkRustPackageOrWorkspace {\n            src = ./noc;\n          }).release.nocargo.bin;\n\n          cache = pkgs.callPackage ./cache {\n            inherit (lib) mkRustPackageOrWorkspace;\n          };\n        };\n\n        checks = let\n          okDrv = derivation {\n            name = \"success\";\n            inherit system;\n            builder = \"/bin/sh\";\n            args = [ \"-c\" \": >$out\" ];\n          };\n\n          checkArgs = {\n            inherit pkgs defaultRegistries;\n\n            assertEq = got: expect: {\n              __assertion = true;\n              fn = name:\n                if toJSON got == toJSON expect then\n                  okDrv\n                else\n                  pkgs.runCommand name {\n                    nativeBuildInputs = [ pkgs.jq ];\n                    got = toJSON got;\n                    expect = toJSON expect;\n                  } ''\n                    if [[ ''${#got} < 32 && ''${#expect} < 32 ]]; then\n                      echo \"got:    $got\"\n                      echo \"expect: $expect\"\n                    else\n                      echo \"got:\"\n                      jq . <<<\"$got\"\n                      echo\n                      echo \"expect:\"\n                      jq . <<<\"$expect\"\n                      echo\n                      echo \"diff:\"\n                      diff -y <(jq . <<<\"$got\") <(jq . <<<\"$expect\")\n                      exit 1\n                    fi\n                  '';\n            };\n          };\n\n          tests = with nocargo-lib; {\n            _0000-semver-compare = semver.semver-compare-tests;\n            _0001-semver-req = semver.semver-req-tests;\n            _0002-cfg-parser = target-cfg.cfg-parser-tests;\n            _0003-cfg-eval = target-cfg.cfg-eval-tests;\n            _0004-platform-cfg = target-cfg.platform-cfg-tests;\n            _0005-glob = glob.glob-tests;\n            _0006-sanitize-relative-path = support.sanitize-relative-path-tests;\n\n            _0100-pkg-info-from-toml = pkg-info.pkg-info-from-toml-tests;\n            _0101-preprocess-feature = resolve.preprocess-feature-tests;\n            _0102-update-feature = resolve.update-feature-tests;\n            _0103-resolve-feature = resolve.resolve-feature-tests;\n\n            _0200-resolve-deps = resolve.resolve-deps-tests;\n            _0201-build-from-src-dry = support.build-from-src-dry-tests;\n          } // import ./tests {\n            inherit pkgs self inputs defaultRegistries;\n          };\n\n          flattenTests = prefix: v:\n            if isDerivation v then {\n              name = prefix;\n              value = v;\n            } else if v ? __assertion then {\n              name = prefix;\n              value = v.fn prefix;\n            } else if isFunction v then\n              flattenTests prefix (v checkArgs)\n            else if isAttrs v then\n              mapAttrsToList (name: flattenTests \"${prefix}-${name}\") v\n            else\n              throw \"Unexpect test type: ${typeOf v}\";\n\n          tests' = listToAttrs (flatten (mapAttrsToList flattenTests tests));\n\n        in tests';\n      });\n}\n\n"
  },
  {
    "path": "lib/default.nix",
    "content": "{ lib }:\nlet\n  callLib = file: import file { inherit lib self; };\n  self = {\n    glob = callLib ./glob.nix;\n    semver = callLib ./semver.nix;\n    target-cfg = callLib ./target-cfg.nix;\n\n    pkg-info = callLib ./pkg-info.nix;\n    resolve = callLib ./resolve.nix;\n    support = callLib ./support.nix;\n  };\nin self\n"
  },
  {
    "path": "lib/glob.nix",
    "content": "{ lib, ... }:\nlet\n  inherit (builtins) match readDir split foldl';\n  inherit (lib)\n    replaceStrings isString concatStrings stringLength hasPrefix substring concatStringsSep\n    head tail init filter\n    isAttrs attrNames mapAttrs getAttrFromPath;\nin\nrec {\n  # We don't allow root-based glob and separator `/` or `\\` inside brackets.\n  globBracketPat = ''\\[!?[^\\/][^]\\/]*]'';\n  globAtomPat = ''[^[\\/]|${globBracketPat}'';\n  globPat = ''((${globAtomPat})+[\\/])*(${globAtomPat})+'';\n\n  # Parse a glob pattern into a list of segments.\n  #\n  # String -> List ({ lit: String } | { re: String } | { deep: true })\n  #\n  # `lit` for simple string literal.\n  # `re` for segment matching.\n  # `deep` for `**`\n  #\n  # https://docs.rs/glob/0.3.0/glob/struct.Pattern.html\n  # https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04\n  parseGlob = glob:\n    let\n      translateAtom = m:\n        let m' = head m; in\n        if isString m then\n          replaceStrings\n            [ \"\\\\\" \"{\"   \"(\"   \")\"   \"^\"   \"$\"   \"|\"   \".\"   \"?\"  \"*\" \"+\"  ]\n            [ \"/\"  \"\\\\{\" \"\\\\(\" \"\\\\)\" \"\\\\^\" \"\\\\$\" \"\\\\|\" \"\\\\.\" \".\" \".*\" \"\\\\+\" ]\n            m\n        else if hasPrefix \"[!\" m' then\n          \"[^\" + substring 2 (stringLength m') m'\n        else\n          m';\n\n      translateSegment = seg:\n        if seg == \"**\" then\n          { deep = true; }\n        else if match \"[^[?*]+\" seg != null then\n          { lit = seg; }\n        else\n          { re = concatStrings (map translateAtom (split \"(${globBracketPat})\" seg)); };\n\n      segments = filter (s: isString s && s != \"\") (split ''/|\\\\'' glob);\n\n    in\n      if match globPat glob == null then\n        throw ''\n          Invalid glob pattern: ${glob}\n          Note that we don't support root-based pattern and separator `/` or `\\` inside brackets.\n        ''\n      else\n        map translateSegment segments;\n\n  # Find all paths in a tree matching a given glob pattern.\n  # A path is represented as a list of segments.\n  #\n  # String -> Set -> List (List String)\n  globMatchTree = glob: tree:\n    let\n      flatMap = f: foldl' (ret: x: ret ++ f x) [];\n\n      go = path: pats:\n        let\n          pat = head pats;\n          pats' = tail pats;\n          curTree = getAttrFromPath path tree;\n          keys = if isAttrs curTree then attrNames curTree else [];\n        in\n          if pats == [] then\n            [ path ]\n          else if pat ? lit then\n            if pat.lit == \".\" then\n              go path pats'\n            else if pat.lit == \"..\" then\n              if path == [] then\n                []\n              else\n                go (init path) pats'\n            else if curTree ? ${pat.lit} then\n              go (path ++ [ pat.lit ]) pats'\n            else\n              []\n          else if pat ? deep then # `**`\n            go path pats' ++\n              flatMap (k: go (path ++ [ k ]) pats) keys # Pass `pats` to recurse into deep directories.\n          else if pat ? re then\n            flatMap (k: go (path ++ [ k ]) pats')\n              (filter (k: match pat.re k != null) keys)\n          else\n            throw \"Unreachable\";\n    in\n      go [] (parseGlob glob);\n\n  # Find all paths inside a filesystem directory matching a given glob pattern.\n  # A path is represented as a relative string with `/` as segment separator, eg. \"\" (root), \"foo\", \"foo/bar\"\n  #\n  # String -> Path -> List String\n  globMatchDir = glob: dir:\n    let\n      pathToTree = dir:\n        mapAttrs\n          (k: ty: if ty == \"directory\" then pathToTree (dir + \"/${k}\") else ty)\n          (readDir dir);\n      ret = globMatchTree glob (pathToTree dir);\n    in\n      map (concatStringsSep \"/\") ret;\n\n  glob-tests = { assertEq, ... }: {\n    \"0parse\" = let\n      assertInvalid = glob: assertEq (builtins.tryEval (parseGlob glob)) { success = false; value = false; };\n      assertParsed = glob: expect: assertEq (parseGlob glob) expect;\n    in {\n      invalid1 = assertInvalid \"\";\n      invalid2 = assertInvalid \"/\";\n      invalid3 = assertInvalid \"/foo\";\n      invalid4 = assertInvalid \"foo//bar\";\n\n      lit1 = assertParsed \"foo\" [ { lit = \"foo\"; } ];\n      lit2 = assertParsed \"!.(^$){}\" [ { lit = \"!.(^$){}\"; } ];\n      lit3 = assertParsed \".\" [ { lit = \".\"; } ];\n      lit4 = assertParsed \"..\" [ { lit = \"..\"; } ];\n\n      re1 = assertParsed \"*\" [ { re = ''.*''; } ];\n      re2 = assertParsed \".*\" [ { re = ''\\..*''; } ];\n      re3 = assertParsed \"*.*\" [ { re = ''.*\\..*''; } ];\n      re4 = assertParsed \"[[][]][![][!]][a-z0-]\" [ { re = ''[[][]][^[][^]][a-z0-]''; } ];\n      re5 = assertParsed \"?.*[[][?.*]?.*\" [ { re = ''.\\..*[[][?.*].\\..*''; } ];\n      re6 = assertParsed \".[.]\" [ { re = ''\\.[.]''; } ];\n\n      deep1 = assertParsed \"**\" [ { deep = true; } ];\n\n      compound1 = assertParsed\n        \"./foo/**/*.nix\"\n        [ { lit = \".\"; } { lit = \"foo\"; } { deep = true; } { re = ''.*\\.nix''; } ];\n      compound2 = assertParsed\n        \".*/../log/[!abc]*-[0-9T:-]+0000.log\"\n        [ { re = ''\\..*''; } { lit = \"..\"; } { lit = \"log\"; } { re = ''[^abc].*-[0-9T:-]\\+0000\\.log''; } ];\n    };\n\n    \"1match-tree\" = let\n      tree = {\n        a = null;\n        b = null;\n        b1 = null;\n        b2 = null;\n        bcd = null;\n        bed = null;\n        c = {\n          d.e = {\n            af = null;\n            f = null;\n          };\n          g.h = null;\n          wtf = null;\n        };\n        f = null;\n        z = {\n          a = null;\n          b = {\n            c = null;\n            d.e = null;\n          };\n        };\n      };\n\n      assertMatch = glob: expect:\n        let\n          ret = globMatchTree glob tree;\n          ret' = map (concatStringsSep \"/\") ret;\n        in\n          assertEq ret' expect;\n\n    in {\n      exact1 = assertMatch \"a\" [ \"a\" ];\n      exact2 = assertMatch \"c/g/h\" [ \"c/g/h\" ];\n      exact3 = assertMatch \"c/g\" [ \"c/g\" ];\n\n      dot1 = assertMatch \"./a\" [ \"a\" ];\n      dot2 = assertMatch \"./a/../c/g/./h\" [ \"c/g/h\" ];\n\n      re1 = assertMatch \"b*\" [ \"b\" \"b1\" \"b2\" \"bcd\" \"bed\" ];\n      re2 = assertMatch \"b?\" [ \"b1\" \"b2\" ];\n      re3 = assertMatch \"c/*\" [ \"c/d\" \"c/g\" \"c/wtf\" ];\n      re4 = assertMatch \"b?d\" [ \"bcd\" \"bed\" ];\n\n      deep1 = assertMatch \"**/b?d\" [ \"bcd\" \"bed\" ];\n      deep2 = assertMatch \"c/**/*f\" [ \"c/wtf\" \"c/d/e/af\" \"c/d/e/f\" ];\n      deep3 = assertMatch \"**/f/..\" [ \"\" \"c/d/e\" ];\n      deep4 = assertMatch \"[wz]/**\" [ \"z\" \"z/a\" \"z/b\" \"z/b/c\" \"z/b/d\" \"z/b/d/e\" ];\n    };\n\n    \"2match-dir\" = {\n      compound1 = assertEq (globMatchDir \"*-*.nix\" ./.) [ \"pkg-info.nix\" \"target-cfg.nix\" ];\n      compound2 = assertEq (globMatchDir \"./features/../**/tokio-[!wtf][opq]?\" ../tests) [ \"tokio-app\" ];\n    };\n  };\n}\n"
  },
  {
    "path": "lib/pkg-info.nix",
    "content": "{ lib, ... }:\nlet\n  inherit (builtins) readFile readDir fromJSON fromTOML toString attrNames match;\n  inherit (lib)\n    stringLength splitString replaceStrings substring isString toLower\n    filter listToAttrs mapAttrs mapAttrsToList optionalAttrs warnIf;\nin\nrec {\n  toPkgId = { name, version, source ? null, ... }:\n    if source != null then\n      \"${name} ${version} (${source})\"\n    else\n      # Local crates must be collide names. Simply use the name to make overriding easier.\n      name;\n\n  mkIndex = fetchurl: path: overrides: let\n    # TODO: We currently only support legacy format used by crates.io-index.\n    # https://github.com/rust-lang/cargo/blob/2f3df16921deb34a92700f4d5a7ecfb424739558/src/cargo/sources/registry/mod.rs#L230-L244\n    downloadEndpoint = (fromJSON (readFile (path + \"/config.json\"))).dl;\n    mkDownloadUrl =\n      assert match \".*\\\\{.*\" downloadEndpoint == null;\n      { name, version, ... }: \"${downloadEndpoint}/${name}/${version}/download\";\n\n    mkSrc = { name, version, sha256 }@args: fetchurl {\n      # Use the same name as nixpkgs to benifit from cache.\n      # https://github.com/NixOS/nixpkgs/pull/122158/files#diff-eb8b8729bfd36f8878c2d8a99f67a2bebb912e9f78c5d2a72457b1f572e26986R67\n      name = \"crate-${name}-${version}.tar.gz\";\n      url = mkDownloadUrl args;\n      inherit sha256;\n    };\n\n    go = path:\n      mapAttrs (k: v:\n        if v == \"directory\"\n          then go (path + \"/${k}\")\n          else mkPkgInfoSet mkSrc k (readFile (path + \"/${k}\")) (overrides.${k} or null)\n      ) (removeAttrs (readDir path) [ \"config.json\" ]);\n  in\n    go path // { __registry_index = true; };\n\n  # Get pkg info of the given package, with overrides applied if exists.\n  getPkgInfoFromIndex = index: { name, version, checksum ? null, ... }: let\n    name' = toLower name;\n    len = stringLength name';\n    crate =\n      if len == 1 then\n        index.\"1\".${name'} or null\n      else if len == 2 then\n        index.\"2\".${name'} or null\n      else if len == 3 then\n        index.\"3\".${substring 0 1 name'}.${name'} or null\n      else\n        index.${substring 0 2 name'}.${substring 2 2 name'}.${name'} or null;\n    info = crate.${version} or null;\n  in\n    if !(index ? __registry_index) then\n      throw \"Invalid registry. Do you forget `mkIndex` on registry paths?\"\n    else if crate == null then\n      throw \"Package ${name} is not found in index\"\n    else if info == null then\n      throw \"Package ${name} doesn't have version ${version} in index. Available versions: ${toString (attrNames crate)}\"\n    else if info.sha256 != null && checksum != null && info.sha256 != checksum then\n      throw \"Package ${name} ${version} hash mismatched, expect ${info.sha256}, got ${checksum}\"\n    else\n      info;\n\n  # Make a set of pkg infos keyed by version.\n  mkPkgInfoSet = mkSrc: name: content: override: let\n    lines = filter (line: line != \"\") (splitString \"\\n\" content);\n    parseLine = line: let parsed = fromJSON line; in {\n      name = parsed.vers;\n      value = mkPkgInfoFromRegistry mkSrc parsed\n        // optionalAttrs (override != null) {\n          # Proc macro crates behave differently in dependency resolution.\n          procMacro = (override { inherit (parsed) version; features = { }; }).procMacro or false;\n          __override = override;\n        };\n    };\n  in\n    listToAttrs (map parseLine lines);\n\n  # Package info:\n  # {\n  #   name = \"libz-sys\";      # The name in registry.\n  #   version = \"0.1.0\";      # Semver.\n  #   src = <drv or path>;    # Source path.\n  #   sha256 = \"123456....\";  # Hash of the `src` tarball. (null or string)\n  #   yanked = false;         # Whether it's yanked.\n  #   links = \"z\";            # The native library to link. (null or string)\n  #   procMacro = false;      # Whether this is a proc-macro library. See comments below.\n  #   features = {            # Features provided.\n  #     default = [ \"std\" ];\n  #     std = [];\n  #   };\n  #   dependencies = [\n  #     {\n  #       name = \"libc\";            # Reference name.\n  #       package = \"libc\";         # Dependency's name in registry. (default to be `name`)\n  #       req = \"^0.1.0\";           # Semver requirement.\n  #       features = [ \"foo\" ];     # Enabled features.\n  #       optional = false;         # Whether this dependency is optional.\n  #       default_features = true;  # Whether to enable default features.\n  #       target = \"cfg(...)\";      # Only required on some targets. (null or string, default to be null)\n  #       kind = \"normal\";          # Dependencies (one of \"normal\", \"dev\", \"build\", default to be \"normal\")\n  #       # `registry` and `public` are not supported.\n  #     }\n  #   ];\n  # }\n  mkPkgInfoFromRegistry =\n    mkSrc:\n    # https://github.com/rust-lang/cargo/blob/2f3df16921deb34a92700f4d5a7ecfb424739558/src/cargo/sources/registry/mod.rs#L259\n    { name, vers, deps, features, cksum, yanked ? false, links ? null, v ? 1, ... }:\n    if v != 1 then\n      throw \"${name} ${vers}: Registry layout version ${toString v} is too new to understand\"\n    else\n    {\n      inherit name features yanked links;\n      version = vers;\n      sha256 = cksum;\n      dependencies = map sanitizeDep deps;\n      # N.B. Proc macro indicator is not in the registry: https://github.com/rust-lang/cargo/issues/9605\n      # This would be overrided in `mkPkgInfoSet`.\n      procMacro = false;\n      src = mkSrc {\n        inherit name;\n        version = vers;\n        sha256 = cksum;\n      };\n    };\n\n  # Sanitize a dependency reference.\n  # Handling `package` and fill missing fields.\n  sanitizeDep =\n    { name\n    , package ? name\n    , version ? null # Cargo.toml use `version`\n    , req ? version\n    , features ? []\n    , optional ? false\n    , default_features ? true\n    , target ? null\n    , kind\n    , ...\n    }@args: args // {\n      inherit name package req features optional default_features target kind;\n\n      # Note that `package` == `name` is not the same as omitting `package`.\n      # See: https://github.com/rust-lang/cargo/issues/6827\n      # Here we let `package` fallback to name, but set a special `rename` to the renamed `name`\n      # if `package` != `name`. `rename` will affect the `--extern` flags.\n      #\n      # For remind:\n      # - `name` is used for coresponding feature name for optional dependencies.\n      # - `package` is used for the original package name of dependency crate.\n      #   - If `package` isn't set, the code name (for `use` or `extern crate`) of the dependency is its lib name.\n      #     `--extern` also use its own lib name.\n      #   - If `package` is set, the code name and `--extern` both use the renamed `name`.\n    } // optionalAttrs (args.package or null != null) {\n      rename = replaceStrings [\"-\"] [\"_\"] name;\n    };\n\n  # Build a simplified crate into from a parsed Cargo.toml.\n  mkPkgInfoFromCargoToml = { lockVersion ? 3, package, features ? {}, target ? {}, ... }@args: src: let\n    transDeps = target: kind:\n      mapAttrsToList (name: v:\n        {\n          inherit name target kind;\n          package = v.package or name;\n          # For path or git dependencies, `version` can be omitted.\n          req = if isString v then v else v.version or null;\n          features = v.features or [];\n          optional = v.optional or false;\n          # It's `default-features` in Cargo.toml, but `default_features` in index and in pkg info.\n          default_features =\n            warnIf (v ? default_features) \"Ignoring `default_features`. Do you mean `default-features`?\"\n            (v.default-features or true);\n\n          # This is used for dependency resoving inside Cargo.lock.\n          source =\n            if v ? registry then\n              throw \"Dependency with `registry` is not supported. Use `registry-index` with explicit URL instead.\"\n            else if v ? registry-index then\n              \"registry+${v.registry-index}\"\n            else if v ? git then\n              # For v1 and v2, git-branch URLs are encoded as \"git+url\" with no query parameters.\n              if v ? branch && lockVersion >= 3 then\n                \"git+${v.git}?branch=${v.branch}\"\n              else if v ? tag then\n                \"git+${v.git}?tag=${v.tag}\"\n              else if v ? rev then\n                \"git+${v.git}?rev=${v.rev}\"\n              else\n                \"git+${v.git}\"\n            else if v ? path then\n              # Local crates are mark with `null` source.\n              null\n            else\n              # Default to use crates.io registry.\n              # N.B. This is necessary and must not be `null`, or it will be indinstinguishable\n              # with local crates or crates from other registries.\n              \"registry+https://github.com/rust-lang/crates.io-index\";\n\n        # See `sanitizeDep`\n        } // optionalAttrs (v.package or null != null) {\n          rename = replaceStrings [\"-\"] [\"_\"] name;\n        });\n\n    collectTargetDeps = target: { dependencies ? {}, dev-dependencies ? {}, build-dependencies ? {}, ... }:\n      transDeps target \"normal\" dependencies ++\n      transDeps target \"dev\" dev-dependencies ++\n      transDeps target \"build\" build-dependencies;\n\n  in\n    {\n      inherit (package) name version;\n      inherit src features;\n      links = package.links or null;\n      procMacro = args.lib.proc-macro or false;\n      dependencies =\n        collectTargetDeps null args ++\n        mapAttrsToList collectTargetDeps target;\n    };\n\n  pkg-info-from-toml-tests = { assertEq, ... }: {\n    simple = let\n      cargoToml = fromTOML (readFile ../tests/tokio-app/Cargo.toml);\n      info = mkPkgInfoFromCargoToml cargoToml \"<src>\";\n\n      expected = {\n        name = \"tokio-app\";\n        version = \"0.0.0\";\n        features = { };\n        src = \"<src>\";\n        links = null;\n        procMacro = false;\n        dependencies = [\n          {\n            name = \"tokio\";\n            package = \"tokio\";\n            default_features = false;\n            features = [ \"rt-multi-thread\" \"macros\" \"time\" ];\n            kind = \"normal\";\n            optional = false;\n            req = \"1\";\n            target = null;\n            source = \"registry+https://github.com/rust-lang/crates.io-index\";\n          }\n        ];\n      };\n    in\n      assertEq info expected;\n\n    build-deps =\n      let\n        cargoToml = fromTOML (readFile ../tests/build-deps/Cargo.toml);\n        info = mkPkgInfoFromCargoToml cargoToml \"<src>\";\n        expected = {\n          name = \"build-deps\";\n          version = \"0.0.0\";\n          features = { };\n          src = \"<src>\";\n          links = null;\n          procMacro = false;\n          dependencies = [\n            {\n              name = \"semver\";\n              package = \"semver\";\n              default_features = true;\n              features = [ ];\n              kind = \"build\";\n              optional = false;\n              req = \"1\";\n              target = null;\n              source = \"registry+https://github.com/rust-lang/crates.io-index\";\n            }\n          ];\n        };\n      in\n        assertEq info expected;\n  };\n}\n"
  },
  {
    "path": "lib/resolve.nix",
    "content": "{ lib, self }:\nlet\n  inherit (builtins) readFile match fromTOML toJSON;\n  inherit (lib)\n    foldl' concatStringsSep listToAttrs filter elemAt length optional sort elem flatten\n    hasPrefix substring\n    attrValues mapAttrs attrNames filterAttrs composeManyExtensions assertMsg;\n  inherit (self.semver) parseSemverReq;\n  inherit (self.pkg-info) mkPkgInfoFromCargoToml toPkgId sanitizeDep;\nin rec {\n\n  # Resolve the dependencies graph based on the lock file.\n  # Output:\n  # {\n  #   \"libz-sys 0.1.0 (https://...)\" = {\n  #     # name, sha256, ... All fields from pkg info.\n  #     dependencies = [\n  #       {\n  #         # name, kind, ... All fields from dependency in the pkg info.\n  #         resolved = \"libc 0.1.0 (https://...)\";\n  #       };\n  #     };\n  #   };\n  # }\n  #\n  # Currently (rust 1.63.0), there are 3 versions of the lock file.\n  # We supports V1, V2 and V3.\n  # See:\n  # https://github.com/rust-lang/cargo/blob/rust-1.63.0/src/cargo/core/resolver/resolve.rs#L56\n  # https://github.com/rust-lang/cargo/blob/rust-1.63.0/src/cargo/core/resolver/encode.rs\n  resolveDepsFromLock = getPkgInfo: lock: let\n    # For git sources, they are referenced without the locked hash part after `#`.\n    # Define: \"git+https://github.com/dtolnay/semver?tag=1.0.4#ea9ea80c023ba3913b9ab0af1d983f137b4110a5\"\n    # Reference: \"semver 1.0.4 (git+https://github.com/dtolnay/semver?tag=1.0.4)\"\n    removeUrlHash = s:\n      let m = match \"([^#]*)#.*\" s; in\n      if m == null then s else elemAt m 0;\n\n    pkgs = map\n      (pkg: if pkg ? source then pkg // { source = removeUrlHash pkg.source; } else pkg)\n      lock.package;\n\n    pkgsByName = foldl' (set: { name, ... }@pkg:\n      set // { ${name} = (set.${name} or []) ++ [ pkg ]; }\n    ) {} pkgs;\n\n    resolved = listToAttrs (map resolvePkg pkgs);\n\n    resolvePkg = { name, version, source ? \"\", dependencies ? [], ... }@args: let\n      info = getPkgInfo args;\n      candidates = map findPkgId dependencies;\n\n      id = toPkgId args;\n      resolvedDependencies =\n        map (dep: dep // {\n          resolved = selectDep candidates dep;\n        }) info.dependencies;\n\n      # Find the exact package id of a dependency key, which may omit version or source.\n      findPkgId = key: let\n        m = match \"([^ ]+)( ([^ ]+))?( \\\\(([^\\\\)]*)\\\\))?\" key;\n        lockName = elemAt m 0;\n        lockVersion = elemAt m 2;\n        lockSource = elemAt m 4;\n        candidates =\n          filter (pkg:\n            (lockVersion != null -> pkg.version == lockVersion) &&\n            (lockSource != null -> pkg.source or null == lockSource))\n          (pkgsByName.${lockName} or []);\n        candidateCnt = length candidates;\n      in\n        if candidateCnt == 0 then\n          throw \"When resolving ${id}, locked dependency `${key}` not found\"\n        else if candidateCnt > 1 then\n          throw ''\n            When resolving ${id}, locked dependency `${key}` is ambiguous.\n            Found: ${toJSON candidates}\n          ''\n        else\n          elemAt candidates 0;\n\n      selectDep = candidates: { name, package, req, source ? null, ... }:\n        let\n          # Local path or git dependencies don't have version req.\n          checkReq = if req != null then parseSemverReq req else (ver: true);\n          checkSource = if source != null then s: s == source else s: true;\n\n          selected = filter\n            ({ name, version, source ? null, ... }: name == package && checkReq version && checkSource source)\n            candidates;\n\n          selectedCnt = length selected;\n        in\n          if selectedCnt == 0 then\n            # Cargo will omit disabled optional dependencies in lock file.\n            # throw \"When resolving ${pkgName} ${crateVersion}, dependency ${package} ${req} isn't satisfied in lock file\"\n            null\n          else if selectedCnt > 1 then\n            throw ''\n              When resolving ${id}, dependency ${package} ${if req == null then \"*\" else req} has multiple candidates in lock file.\n              Found: ${toJSON selected}\n            ''\n          else\n            toPkgId (elemAt selected 0);\n\n    in\n      {\n        name = toPkgId args;\n        value = info // { dependencies = resolvedDependencies; };\n      };\n\n  in\n    assert assertMsg (lock.version or 3 == 3) \"Unsupported version of Cargo.lock: ${toString lock.version}\";\n    resolved;\n\n  # Calculate the closure of each feature, with `dep:pkg` and `pkg?/feat` syntax desugared.\n  # [String] -> { [String] } -> { [String | { dep: String, feat?: String }] }\n  preprocessFeatures = optionalDeps: defs: let\n    allRefs = flatten (attrValues defs);\n    defs' =\n      listToAttrs\n        (map (dep: { name = dep; value = [ \"dep:${dep}\" ]; })\n          (filter (dep: !elem \"dep:${dep}\" allRefs)\n            optionalDeps))\n      // defs;\n    go = prev: feat:\n      let\n        m = match \"([a-zA-Z0-9]+)(\\\\?)?/([a-zA-Z0-9]+)\" feat;\n        depName = elemAt m 0;\n        isWeak = elemAt m 1 != null;\n        depFeat = elemAt m 2;\n      in if elem feat prev then\n        prev\n      else if defs' ? ${feat} then\n        foldl' go ([ feat ] ++ prev) defs'.${feat}\n      else if hasPrefix \"dep:\" feat then\n        [ { dep = substring 4 (-1) feat; } ] ++ prev\n      else if m == null then\n        [ feat ] ++ prev\n      else if isWeak then\n        [ { dep = depName; feat = depFeat; } ] ++ prev\n      else\n        [ { dep = depName; } { dep = depName; feat = depFeat; } ] ++ prev;\n    fixed = mapAttrs (feat: _: go [ ] feat) defs';\n  in\n    fixed;\n\n  # Enable `features` in `prev` and do recursive update according to `defs`.\n  # Optional dependencies must be included in `defs`.\n  enableFeatures = pkgId: defs: prev: features:\n    foldl' (prev: feat: let\n      m = match \"(.*)/.*\" feat;\n      mDep = elemAt m 0;\n      nexts =\n        if m == null then\n          # Must be defined.\n          defs.${feat} or (throw ''\n            Feature '${feat}' is invalid for ${pkgId}.\n            Possible features: ${concatStringsSep \",\" (attrNames defs)}\n          '')\n        else\n          # Dependent features implies optional dependency to be enabled.\n          # But non-optional dependency doesn't have coresponding feature flag.\n          optional (defs ? ${mDep}) mDep;\n    in\n      if prev.${feat} or false then\n        prev\n      else\n        enableFeatures pkgId defs (prev // { ${feat} = true; }) nexts\n    ) prev features;\n\n  # Resolve all features.\n  # Note that dependent features like `foo/bar` are only available during resolution,\n  # and will be removed in result set.\n  #\n  # Returns:\n  # {\n  #   \"libc 0.1.0 (https://...)\" = [ \"default\" \"foo\" \"bar\" ];\n  # }\n  resolveFeatures = {\n  # Follows the layout of the output of `resolveDepsFromLock`.\n    pkgSet\n  # Dependency edges (`{ name, kind, resolved, ... }`) will be checked by this filter.\n  # Only edges returning `true` are considered and propagated.\n  , depFilter ? dep: true\n  # Eg. \"libc 0.1.0 (https://...)\"\n  , rootId\n  # Eg. [ \"foo\" \"bar/baz\" ]\n  , rootFeatures\n  }: let\n\n    featureDefs = mapAttrs (id: { features, dependencies, ... }:\n      features //\n      listToAttrs\n        (map (dep: { name = dep.name; value = []; })\n          # We should collect all optional dependencies for feature def, even though they are not selected.\n          # This happens on `rand@0.8.3`, whose `default` feature enables `rand_hc`, which is only available\n          # for `cfg(target_os = \"emscripten\")`. This feature should be still enable, though optional dependency\n          # is not.\n          (filter (dep: dep.optional) dependencies))\n    ) pkgSet;\n\n    # initialFeatures = mapAttrs (id: defs: mapAttrs (k: v: false) defs) featureDefs;\n    initialFeatures = mapAttrs (id: info: {}) pkgSet;\n\n    # Overlay of spreading <id>'s nested features into dependencies and enable optional dependencies.\n    updateDepsOverlay = id: final: prev: let\n      info = pkgSet.${id};\n      finalFeatures = final.${id} or {};\n      updateDep = { name, optional, resolved, default_features, features, ... }: final: prev: let\n        depFeatures =\n          lib.optional (default_features && featureDefs.${resolved} ? default) \"default\" ++\n          features ++\n          filter (feat: feat != null)\n            (map (feat: let m = match \"(.*)/(.*)\" feat; in\n              if m != null && elemAt m 0 == name then\n                elemAt m 1\n              else\n                null\n              ) (attrNames finalFeatures));\n      in\n        {\n          ${resolved} =\n            # This condition must be evaluated under `${resolved} =`,\n            # or we'll enter an infinite recursion.\n            if optional -> finalFeatures.${name} or false then\n              enableFeatures\n                resolved\n                featureDefs.${resolved}\n                prev.${resolved}\n                depFeatures\n            else\n              prev.${resolved};\n        };\n    in\n      composeManyExtensions\n        (map updateDep\n          (filter depFilter info.dependencies))\n        final\n        prev;\n\n    rootOverlay = final: prev: {\n      ${rootId} = enableFeatures\n        rootId\n        featureDefs.${rootId}\n        initialFeatures.${rootId}\n        rootFeatures;\n    };\n\n    final =\n      composeManyExtensions\n      (map updateDepsOverlay (attrNames pkgSet) ++ [ rootOverlay ])\n      final\n      initialFeatures;\n\n    final' =\n      mapAttrs (id: feats: filter (feat: match \".*/.*\" feat == null) (attrNames feats)) final;\n\n  in\n    final';\n\n  preprocess-feature-tests = { assertEq, ... }: let\n    test = optionalDeps: featureDefs: expect:\n      assertEq (preprocessFeatures optionalDeps featureDefs) expect;\n  in {\n    recursive = test [ ] { a = [ \"b\" ]; b = [ \"a\" \"c\" ]; c = [ ]; } {\n      a = [ \"c\" \"b\" \"a\" ];\n      b = [ \"c\" \"a\" \"b\" ];\n      c = [ \"c\" ];\n    };\n    auto-dep = test [ \"a\" ] { b = [ \"a\" ]; } {\n      a = [ { dep = \"a\"; } \"a\" ];\n      b = [ { dep = \"a\"; } \"a\" \"b\" ];\n    };\n    manual-dep = test [ \"a\" ] { b = [ \"dep:a\" ]; } {\n      b = [ { dep = \"a\"; } \"b\" ];\n    };\n    strong-dep = test [ \"a\" ] { b = [ \"a/c\" ]; } {\n      a = [ { dep = \"a\"; } \"a\" ];\n      b = [ { dep = \"a\"; } { dep = \"a\"; feat = \"c\"; } \"b\" ];\n    };\n    weak-dep = test [ \"a\" ] { b = [ \"a?/c\" ]; } {\n      a = [ { dep = \"a\"; } \"a\" ];\n      b = [ { dep = \"a\"; feat = \"c\"; } \"b\" ];\n    };\n  };\n\n  update-feature-tests = { assertEq, ... }: let\n    testUpdate = defs: features: expect: let\n      init = mapAttrs (k: v: false) defs;\n      out = enableFeatures \"pkgId\" defs init features;\n      enabled = attrNames (filterAttrs (k: v: v) out);\n    in\n      assertEq enabled expect;\n  in {\n    simple1 = testUpdate { a = []; } [] [];\n    simple2 = testUpdate { a = []; } [ \"a\" ] [ \"a\" ];\n    simple3 = testUpdate { a = []; } [ \"a\" \"a\" ] [ \"a\" ];\n    simple4 = testUpdate { a = []; b = []; } [ \"a\" ] [ \"a\" ];\n    simple5 = testUpdate { a = []; b = []; } [ \"a\" \"b\" ] [ \"a\" \"b\" ];\n    simple6 = testUpdate { a = []; b = []; } [ \"a\" \"b\" \"a\" ] [ \"a\" \"b\" ];\n\n  } // (let defs = { a = []; b = [ \"a\" ]; }; in {\n    link1 = testUpdate defs [ \"a\" ] [ \"a\" ];\n    link2 = testUpdate defs [ \"b\" \"a\" ] [ \"a\" \"b\" ];\n    link3 = testUpdate defs [ \"b\" ] [ \"a\" \"b\" ];\n    link4 = testUpdate defs [ \"b\" \"a\" ] [ \"a\" \"b\" ];\n    link5 = testUpdate defs [ \"b\" \"b\" ] [ \"a\" \"b\" ];\n\n  }) // (let defs = { a = []; b = [ \"a\" ]; c = [ \"a\" ]; }; in {\n    common1 = testUpdate defs [ \"a\" ] [ \"a\" ];\n    common2 = testUpdate defs [ \"b\" ] [ \"a\" \"b\" ];\n    common3 = testUpdate defs [ \"a\" \"b\" ] [ \"a\" \"b\" ];\n    common4 = testUpdate defs [ \"b\" \"a\" ] [ \"a\" \"b\" ];\n    common5 = testUpdate defs [ \"b\" \"c\" ] [ \"a\" \"b\" \"c\" ];\n    common6 = testUpdate defs [ \"a\" \"b\" \"c\" ] [ \"a\" \"b\" \"c\" ];\n    common7 = testUpdate defs [ \"b\" \"c\" \"b\" ] [ \"a\" \"b\" \"c\" ];\n\n  }) // (let defs = { a = [ \"b\" \"c\" ]; b = [ \"d\" \"e\" ]; c = [ \"f\" \"g\"]; d = []; e = []; f = []; g = []; }; in {\n    tree1 = testUpdate defs [ \"a\" ] [ \"a\" \"b\" \"c\" \"d\" \"e\" \"f\" \"g\" ];\n    tree2 = testUpdate defs [ \"b\" ] [ \"b\" \"d\" \"e\" ];\n    tree3 = testUpdate defs [ \"d\" ] [ \"d\" ];\n    tree4 = testUpdate defs [ \"d\" \"b\" \"g\" ] [ \"b\" \"d\" \"e\" \"g\" ];\n    tree5 = testUpdate defs [ \"c\" \"e\" \"f\" ] [ \"c\" \"e\" \"f\" \"g\" ];\n\n  }) // (let defs = { a = [ \"b\" ]; b = [ \"c\" ]; c = [ \"b\" ]; }; in {\n    cycle1 = testUpdate defs [ \"b\" ] [ \"b\" \"c\" ];\n    cycle2 = testUpdate defs [ \"c\" ] [ \"b\" \"c\" ];\n    cycle3 = testUpdate defs [ \"a\" ] [ \"a\" \"b\" \"c\" ];\n  });\n\n  resolve-feature-tests = { assertEq, ... }: let\n    test = pkgSet: rootId: rootFeatures: expect: let\n      resolved = resolveFeatures { inherit pkgSet rootId rootFeatures; };\n      expect' = mapAttrs (id: feats: sort (a: b: a < b) feats) expect;\n    in\n      assertEq resolved expect';\n\n    pkgSet1 = {\n      a = {\n        features = { foo = [ \"bar\" ]; bar = []; baz = [ \"b\" ]; };\n        dependencies = [\n          { name = \"b\"; resolved = \"b-id\"; optional = true; default_features = true; features = [ \"a\" ]; }\n          { name = \"unused\"; resolved = null; optional = true; default_features = true; features = []; }\n        ];\n      };\n      b-id = {\n        features = { default = []; foo = []; bar = [ \"foo\" ]; a = []; };\n        dependencies = [];\n      };\n    };\n\n    pkgSet2 = {\n      my-id = {\n        features = { default = [ \"tokio/macros\" ]; };\n        dependencies = [\n          { name = \"tokio\"; resolved = \"tokio-id\"; optional = false; default_features = false; features = [ \"fs\" ]; }\n          { name = \"dep\"; resolved = \"dep-id\"; optional = false; default_features = true; features = []; }\n        ];\n      };\n      dep-id = {\n        features = { default = [ \"tokio/sync\" ]; };\n        dependencies = [\n          { name = \"tokio\"; resolved = \"tokio-id\"; optional = false; default_features = false; features = [ \"sync\" ]; }\n        ];\n      };\n      tokio-id = {\n        features = { default = []; fs = []; sync = []; macros = []; io = []; };\n        dependencies = [];\n      };\n    };\n\n  in {\n    simple = test pkgSet1 \"a\" [ \"foo\" ] {\n      a = [ \"foo\" \"bar\" ];\n      b-id = [ ];\n    };\n\n    depend = test pkgSet1 \"a\" [ \"foo\" \"baz\" ] {\n      a = [ \"foo\" \"bar\" \"baz\" \"b\" ];\n      b-id = [ \"default\" \"a\" ];\n    };\n\n    override = test pkgSet1 \"a\" [ \"b/bar\" ] {\n      a = [ \"b\" ];\n      b-id = [ \"default\" \"a\" \"bar\" \"foo\" ];\n    };\n\n    merge = test pkgSet2 \"my-id\" [ \"default\" ] {\n      my-id = [ \"default\" ];\n      dep-id = [ \"default\" ];\n      tokio-id = [ \"fs\" \"sync\" \"macros\" ];\n    };\n  };\n\n  resolve-deps-tests = { assertEq, defaultRegistries, ... }: {\n    simple = let\n      index = {\n        libc.\"0.1.12\" = { name = \"libc\"; version = \"0.1.12\"; dependencies = []; };\n        libc.\"0.2.95\" = { name = \"libc\"; version = \"0.2.95\"; dependencies = []; };\n        testt.\"0.1.0\" = {\n          name = \"testt\";\n          version = \"0.1.0\";\n          dependencies = map sanitizeDep [\n            { name = \"libc\"; req = \"^0.1.0\"; kind = \"normal\"; }\n            { name = \"liba\"; package = \"libc\"; req = \"^0.2.0\"; kind = \"normal\"; }\n          ];\n        };\n      };\n\n      lock = {\n        package = [\n          {\n            name = \"libc\";\n            version = \"0.1.12\";\n            source = \"registry+https://github.com/rust-lang/crates.io-index\";\n          }\n          {\n            name = \"libc\";\n            version = \"0.2.95\";\n            source = \"registry+https://github.com/rust-lang/crates.io-index\";\n          }\n          {\n            name = \"testt\";\n            version = \"0.1.0\";\n            dependencies = [\n             \"libc 0.1.12\"\n             \"libc 0.2.95 (registry+https://github.com/rust-lang/crates.io-index)\"\n            ];\n          }\n        ];\n      };\n\n      expected = {\n        \"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)\" = {\n          name = \"libc\";\n          version = \"0.1.12\";\n          dependencies = [ ];\n        };\n        \"libc 0.2.95 (registry+https://github.com/rust-lang/crates.io-index)\" = {\n          name = \"libc\";\n          version = \"0.2.95\";\n          dependencies = [ ];\n        };\n        \"testt\" = {\n          name = \"testt\";\n          version = \"0.1.0\";\n          dependencies = [\n            {\n              name = \"libc\";\n              package = \"libc\";\n              req = \"^0.1.0\";\n              resolved = \"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)\";\n              kind = \"normal\";\n              optional = false;\n              features = [];\n              default_features = true;\n              target = null;\n            }\n            {\n              name = \"liba\";\n              rename = \"liba\";\n              package = \"libc\";\n              req = \"^0.2.0\";\n              resolved = \"libc 0.2.95 (registry+https://github.com/rust-lang/crates.io-index)\";\n              kind = \"normal\";\n              optional = false;\n              features = [];\n              default_features = true;\n              target = null;\n            }\n          ];\n        };\n      };\n\n      getPkgInfo = { name, version, ... }: index.${name}.${version};\n      resolved = resolveDepsFromLock getPkgInfo lock;\n    in\n      assertEq resolved expected;\n\n    workspace-virtual = let\n      lock = fromTOML (readFile ../tests/workspace-virtual/Cargo.lock);\n      cargoTomlFoo = fromTOML (readFile ../tests/workspace-virtual/crates/foo/Cargo.toml);\n      cargoTomlBar = fromTOML (readFile ../tests/workspace-virtual/crates/bar/Cargo.toml);\n      infoFoo = mkPkgInfoFromCargoToml cargoTomlFoo \"<src>\";\n      infoBar = mkPkgInfoFromCargoToml cargoTomlBar \"<src>\";\n\n      getCrateInfo = args:\n        if args ? source then\n          throw \"No crates.io dependency\"\n        else if args.name == \"foo\" then\n          infoFoo\n        else if args.name == \"bar\" then\n          infoBar\n        else\n          throw \"Unknow crate: ${toJSON args}\";\n\n      resolved = resolveDepsFromLock getCrateInfo lock;\n    in\n    assertEq resolved {\n      bar = {\n        dependencies = [];\n        features = {};\n        links = null;\n        name = \"bar\";\n        procMacro = false;\n        src = \"<src>\";\n        version = \"0.1.0\";\n      };\n      foo = {\n        dependencies = [ {\n          default_features = true;\n          features = [];\n          kind = \"normal\";\n          name = \"bar\";\n          optional = false;\n          package = \"bar\";\n          req = null;\n          resolved = \"bar\";\n          source = null;\n          target = null;\n        } ];\n        features = {};\n        links = null;\n        name = \"foo\";\n        procMacro = false;\n        src = \"<src>\";\n        version = \"0.1.0\";\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "lib/semver.nix",
    "content": "{ lib, ... }:\nlet\n  inherit (builtins) match elemAt fromJSON;\n  inherit (lib) compare compareLists splitString all any;\nin rec {\n  parseSemver = ver: let\n    m = match \"([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-([A-Za-z0-9.-]+))?(\\\\+[A-Za-z0-9.-]+)?\" ver;\n  in\n    if m == null then\n      throw \"Invalid semver: `${ver}`\"\n    else {\n      maj = fromJSON (elemAt m 0);\n      min = fromJSON (elemAt m 1);\n      pat = fromJSON (elemAt m 2);\n      pre = elemAt m 4;\n    };\n\n  compareSemver = a: b: let\n    m1 = parseSemver a;\n    m2 = parseSemver b;\n  in\n    if m1.maj != m2.maj then\n      if m1.maj < m2.maj then -1 else 1\n    else if m1.min != m2.min then\n      if m1.min < m2.min then -1 else 1\n    else if m1.pat != m2.pat then\n      if m1.pat < m2.pat then -1 else 1\n    else\n      comparePre m1.pre m2.pre;\n\n  comparePre = a: b:\n    if a == null then\n      if b == null then\n        0\n      else\n        1\n    else if b == null then\n      -1\n    else\n      comparePreList (splitString \".\" a) (splitString \".\" b);\n\n  isNumber = s: match \"[0-9]+\" s != null;\n\n  comparePreList = compareLists (a: b:\n    let\n      num1 = if isNumber a then fromJSON a else null;\n      num2 = if isNumber b then fromJSON b else null;\n    in\n      if num1 != null then\n        if num2 != null then\n          compare num1 num2\n        else\n          -1\n      else if num2 != null then\n        1\n      else\n        compare a b\n  );\n\n  parseSemverReq = req: let\n    reqs = splitString \",\" req;\n    comparators = map parseComparators reqs;\n  in\n    ver: all (f: f ver) comparators && (isPreVersion ver -> any (containsExactPreVersion ver) reqs);\n\n  isPreVersion = ver: match \"[0-9.]+-.*\" ver != null;\n  containsExactPreVersion = ver: req: let\n    m = parseSemver ver;\n  in\n    match \" *(=|<|<=|>|>=|~|\\\\^)? *${toString m.maj}\\\\.${toString m.min}\\\\.${toString m.pat}-.*\" req != null;\n\n  opEq = { compMaj, compMin, compPat, compPre }: { maj, min, pat, pre }:\n    maj == compMaj &&\n    (compMin == null || min == compMin) &&\n    (compPat == null || pat == compPat) &&\n    (compPre == null || comparePre pre compPre == 0);\n\n  opLtGt = op: { compMaj, compMin, compPat, compPre }: { maj, min, pat, pre }:\n    if maj != compMaj then\n      op maj compMaj\n    else if compMin == null then\n      false\n    else if min != compMin then\n      op min compMin\n    else if compPat == null then\n      false\n    else if pat != compPat then\n      op pat compPat\n    else\n      op (comparePre pre compPre) 0;\n\n  opTilde = { compMaj, compMin, compPat, compPre }: { maj, min, pat, pre }:\n    maj == compMaj &&\n    (compMin == null || min == compMin) &&\n    (compPat == null || pat > compPat || (pat == compPat &&\n      comparePre pre compPre >= 0));\n\n  opCaret = { compMaj, compMin, compPat, compPre }: { maj, min, pat, pre }:\n    if maj != compMaj then\n      false\n    else if compMin == null then\n      true\n    else if compPat == null then\n      if maj > 0 then\n        min >= compMin\n      else\n        min == compMin\n    else if maj > 0 then\n      if min != compMin then\n        min > compMin\n      else if pat != compPat then\n        pat > compPat\n      else\n        comparePre pre compPre >= 0\n    else if min > 0 then\n      if min != compMin then\n        false\n      else if pat != compPat then\n        pat > compPat\n      else\n        comparePre pre compPre >= 0\n    else if min != compMin || pat != compPat then\n      false\n    else\n      comparePre pre compPre >= 0;\n\n  parseComparators = req: let\n    toInt = s: if s == null then null else fromJSON s;\n\n    star = match \" *(([0-9]+)\\\\.(([0-9]+)\\\\.)?)?\\\\*(\\\\.\\\\*)? *\" req;\n    star0 = elemAt star 1;\n    star1 = elemAt star 3;\n    comp = match \" *(=|>|>=|<|<=|~|\\\\^)? *(([0-9]+)(\\\\.([0-9]+)(\\\\.([0-9]+)(-([A-Za-z0-9.-]+))?(\\\\+[A-Za-z0-9.-]*)?)?)?) *\" req;\n    compOp = elemAt comp 0;\n    compVer = elemAt comp 1;\n    compArgs = {\n      compMaj = toInt (elemAt comp 2);\n      compMin = toInt (elemAt comp 4);\n      compPat = toInt (elemAt comp 6);\n      compPre = elemAt comp 8;\n    };\n\n    less = a: b: a < b;\n    greater = a: b: a > b;\n    op = {\n      \"=\" = opEq compArgs;\n      \"<\" = opLtGt less compArgs;\n      \"<=\" = args: opLtGt less compArgs args || opEq compArgs args;\n      \">\" = opLtGt greater compArgs;\n      \">=\" = args: opLtGt greater compArgs args || opEq compArgs args;\n      \"~\" = opTilde compArgs;\n      \"^\" = opCaret compArgs;\n    }.${if compOp != null then compOp else \"^\"};\n\n  in\n    if star != null then\n      if star0 == null then\n        (ver: true)\n      else if star1 == null then\n        (ver: match \"${toString star0}\\\\..*\" ver != null)\n      else\n        (ver: match \"${toString star0}\\\\.${toString star1}\\\\..*\" ver != null)\n    else if comp != null then\n      (ver: op (parseSemver ver))\n    else\n      throw \"Invalid version comparator: `${req}`\";\n\n  semver-compare-tests = { assertEq, ... }: {\n    compare-simple1 = assertEq (compareSemver \"1.2.3\" \"1.2.2\") 1;\n    compare-simple2 = assertEq (compareSemver \"1.2.3\" \"1.2.3\") 0;\n    compare-simple3 = assertEq (compareSemver \"1.2.3\" \"1.2.4\") (-1);\n    compare-simple4 = assertEq (compareSemver \"1.2.3\" \"1.1.3\") 1;\n    compare-simple5 = assertEq (compareSemver \"1.2.3\" \"1.3.3\") (-1);\n    compare-simple6 = assertEq (compareSemver \"1.2.3\" \"0.2.3\") 1;\n    compare-simple7 = assertEq (compareSemver \"1.2.3\" \"2.2.3\") (-1);\n  };\n\n  # From https://github.com/dtolnay/semver/blob/a03d376560e0c4d16518bc271867b1981c85acf0/tests/test_version_req.rs\n  semver-req-tests = { assertEq, ... }: let\n    testMatchReq = req: { yes ? [], no ? [] }: let\n      inherit (lib) const;\n      checker = parseSemverReq req;\n      got = map checker (yes ++ no);\n      expect = map (const true) yes ++ map (const false) no;\n    in\n      assertEq got expect;\n  in {\n    eq1 = testMatchReq \"=1.0.0\" {\n      yes = [ \"1.0.0\" ];\n      no  = [ \"1.0.1\" \"0.9.9\" \"0.10.0\" \"0.1.0\" \"1.0.0-pre\" ];\n    };\n    default = testMatchReq \"^1.0.0\" {\n      yes = [ \"1.0.0\" \"1.1.0\" \"1.0.1\" ];\n      no  = [ \"0.9.9\" \"0.10.0\" \"0.1.0\" \"1.0.0-pre\" \"1.0.1-pre\" ];\n    };\n    exact1 = testMatchReq \"=1.0.0\" {\n      yes = [ \"1.0.0\" ];\n      no  = [ \"1.0.1\" \"0.9.9\" \"0.10.0\" \"0.1.0\" \"1.0.0-pre\" ];\n    };\n    exact2 = testMatchReq \"=0.9.0\" {\n      yes = [ \"0.9.0\" ];\n      no  = [ \"0.9.1\" \"1.9.0\" \"0.0.9\" \"0.9.0-pre\" ];\n    };\n    exact3 = testMatchReq \"=0.0.2\" {\n      yes = [ \"0.0.2\" ];\n      no  = [ \"0.0.1\" \"0.0.3\" \"0.0.2-pre\" ];\n    };\n    exact4 = testMatchReq \"=0.1.0-beta2.a\" {\n      yes = [ \"0.1.0-beta2.a\" ];\n      no  = [ \"0.9.1\" \"0.1.0\" \"0.1.1-beta2.a\" \"0.1.0-beta2\" ];\n    };\n    exact5 = testMatchReq \"=0.1.0\" {\n      yes = [ \"0.1.0\" \"0.1.0+meta\" \"0.1.0+any\" ];\n    };\n    gt1 = testMatchReq \">= 1.0.0\" {\n      yes = [ \"1.0.0\" \"2.0.0\" ];\n      no  = [ \"0.1.0\" \"0.0.1\" \"1.0.0-pre\" \"2.0.0-pre\" ];\n    };\n    gt2 = testMatchReq \">=2.1.0-alpha2\" {\n      yes = [ \"2.1.0-alpha2\" \"2.1.0-alpha3\" \"2.1.0\" \"3.0.0\" ];\n      no  = [ \"2.0.0\" \"2.1.0-alpha1\" \"2.0.0-alpha2\" \"3.0.0-alpha2\" ];\n    };\n    lt1 = testMatchReq \"<1.0.0\" {\n      yes = [ \"0.1.0\" \"0.0.1\" ];\n      no  = [ \"1.0.0\" \"1.0.0-beta\" \"1.0.1\" \"0.9.9-alpha\" ];\n    };\n    le1 = testMatchReq \"<= 2.1.0-alpha2\" {\n      yes = [ \"2.1.0-alpha2\" \"2.1.0-alpha1\" \"2.0.0\" \"1.0.0\" ];\n      no  = [ \"2.1.0\" \"2.2.0-alpha1\" \"2.0.0-alpha2\" \"1.0.0-alpha2\" ];\n    };\n    multi1 = testMatchReq \">1.0.0-alpha, <1.0.0\" {\n      yes = [ \"1.0.0-beta\" ];\n    };\n    multi2 = testMatchReq \">1.0.0-alpha, <1.0\" {\n      no  = [ \"1.0.0-beta\" ];\n    };\n    multi3 = testMatchReq \">1.0.0-alpha, <1\" {\n      no  = [ \"1.0.0-beta\" ];\n    };\n    multi4 = testMatchReq \"> 0.0.9, <= 2.5.3\" {\n      yes = [ \"0.0.10\" \"1.0.0\" \"2.5.3\" ];\n      no  = [ \"0.0.8\" \"2.5.4\" ];\n    };\n    multi5 = testMatchReq \"0.3.0, 0.4.0\" {\n      no  = [ \"0.0.8\" \"0.3.0\" \"0.4.0\" ];\n    };\n    multi6 = testMatchReq \"<= 0.2.0, >= 0.5.0\" {\n      no  = [ \"0.0.8\" \"0.3.0\" \"0.5.1\" ];\n    };\n    multi7 = testMatchReq \"^0.1.0, ^0.1.4, ^0.1.6\" {\n      yes = [ \"0.1.6\" \"0.1.9\" ];\n      no  = [ \"0.1.0\" \"0.1.4\" \"0.2.0\" ];\n    };\n    multi8 = testMatchReq \">=0.5.1-alpha3, <0.6\" {\n      yes = [ \"0.5.1-alpha3\" \"0.5.1-alpha4\" \"0.5.1-beta\" \"0.5.1\" \"0.5.5\" ];\n      no  = [ \"0.5.1-alpha1\" \"0.5.2-alpha3\" \"0.5.5-pre\" \"0.5.0-pre\" \"0.6.0\" \"0.6.0-pre\" ];\n    };\n    tilde1 = testMatchReq \"~1\" {\n      yes = [ \"1.0.0\" \"1.0.1\" \"1.1.1\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"0.0.9\" ];\n    };\n    tilde2 = testMatchReq \"~1.2\" {\n      yes = [ \"1.2.0\" \"1.2.1\" ];\n      no  = [ \"1.1.1\" \"1.3.0\" \"0.0.9\" ];\n    };\n    tilde3 = testMatchReq \"~1.2.2\" {\n      yes = [ \"1.2.2\" \"1.2.4\" ];\n      no  = [ \"1.2.1\" \"1.9.0\" \"1.0.9\" \"2.0.1\" \"0.1.3\" ];\n    };\n    tilde4 = testMatchReq \"~1.2.3-beta.2\" {\n      yes = [ \"1.2.3\" \"1.2.4\" \"1.2.3-beta.2\" \"1.2.3-beta.4\" ];\n      no  = [ \"1.3.3\" \"1.1.4\" \"1.2.3-beta.1\" \"1.2.4-beta.2\" ];\n    };\n    caret1 = testMatchReq \"^1\" {\n      yes = [ \"1.1.2\" \"1.1.0\" \"1.2.1\" \"1.0.1\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"0.1.4\" \"1.0.0-beta1\" \"0.1.0-alpha\" \"1.0.1-pre\" ];\n    };\n    caret2 = testMatchReq \"^1.1\" {\n      yes = [ \"1.1.2\" \"1.1.0\" \"1.2.1\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"1.0.1\" \"0.1.4\" ];\n    };\n    caret3 = testMatchReq \"^1.1.2\" {\n      yes = [ \"1.1.2\" \"1.1.4\" \"1.2.1\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"1.1.1\" \"0.0.1\" \"1.1.2-alpha1\" \"1.1.3-alpha1\" \"2.9.0-alpha1\" ];\n    };\n    caret4 = testMatchReq \"^0.1.2\" {\n      yes = [ \"0.1.2\" \"0.1.4\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"1.1.1\" \"0.0.1\" \"0.1.2-beta\" \"0.1.3-alpha\" \"0.2.0-pre\" ];\n    };\n    caret5 = testMatchReq \"^0.5.1-alpha3\" {\n      yes = [ \"0.5.1-alpha3\" \"0.5.1-alpha4\" \"0.5.1-beta\" \"0.5.1\" \"0.5.5\" ];\n      no  = [ \"0.5.1-alpha1\" \"0.5.2-alpha3\" \"0.5.5-pre\" \"0.5.0-pre\" \"0.6.0\" ];\n    };\n    caret6 = testMatchReq \"^0.0.2\" {\n      yes = [ \"0.0.2\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"1.1.1\" \"0.0.1\" \"0.1.4\" ];\n    };\n    caret7 = testMatchReq \"^0.0\" {\n      yes = [ \"0.0.2\" \"0.0.0\" ];\n      no  = [ \"0.9.1\" \"2.9.0\" \"1.1.1\" \"0.1.4\" ];\n    };\n    caret8 = testMatchReq \"^0\" {\n      yes = [ \"0.9.1\" \"0.0.2\" \"0.0.0\" ];\n      no  = [ \"2.9.0\" \"1.1.1\" ];\n    };\n    caret9 = testMatchReq \"^1.4.2-beta.5\" {\n      yes = [ \"1.4.2\" \"1.4.3\" \"1.4.2-beta.5\" \"1.4.2-beta.6\" \"1.4.2-c\" ];\n      no  = [ \"0.9.9\" \"2.0.0\" \"1.4.2-alpha\" \"1.4.2-beta.4\" \"1.4.3-beta.5\" ];\n    };\n    star1 = testMatchReq \"*\" {\n      yes = [ \"0.9.1\" \"2.9.0\" \"0.0.9\" \"1.0.1\" \"1.1.1\" ];\n    };\n    star2 = testMatchReq \"1.*\" {\n      yes = [ \"1.2.0\" \"1.2.1\" \"1.1.1\" \"1.3.0\" ];\n      no  = [ \"0.0.9\" ];\n    };\n    star3 = testMatchReq \"1.2.*\" {\n      yes = [ \"1.2.0\" \"1.2.2\" \"1.2.4\" ];\n      no  = [ \"1.9.0\" \"1.0.9\" \"2.0.1\" \"0.1.3\" ];\n    };\n    pre = testMatchReq \"=2.1.1-really.0\" {\n      yes = [ \"2.1.1-really.0\" ];\n    };\n  };\n}\n"
  },
  {
    "path": "lib/support.nix",
    "content": "{ lib, self }:\nlet\n  inherit (builtins) fromTOML toJSON match tryEval split;\n  inherit (lib)\n    readFile mapAttrs mapAttrs' makeOverridable warnIf\n    isString hasPrefix\n    filter flatten elem elemAt listToAttrs subtractLists concatStringsSep\n    attrNames attrValues recursiveUpdate optionalAttrs;\n  inherit (self.pkg-info) mkPkgInfoFromCargoToml getPkgInfoFromIndex toPkgId;\n  inherit (self.resolve) resolveDepsFromLock resolveFeatures;\n  inherit (self.target-cfg) platformToCfgs evalTargetCfgStr;\n  inherit (self.glob) globMatchDir;\nin\nrec {\n\n  # https://doc.rust-lang.org/cargo/reference/profiles.html#default-profiles\n  defaultProfiles = rec {\n    dev = {\n      name = \"dev\";\n      build-override = defaultBuildProfile;\n      opt-level = 0;\n      debug = true;\n      debug-assertions = true;\n      overflow-checks = true;\n      lto = false;\n      panic = \"unwind\";\n      codegen-units = 256;\n      rpath = false;\n    };\n    release = {\n      name = \"release\";\n      build-override = defaultBuildProfile;\n      opt-level = 3;\n      debug = false;\n      debug-assertions = false;\n      overflow-checks = false;\n      lto = false;\n      panic = \"unwind\";\n      codegen-units = 16;\n      rpath = false;\n    };\n    test = dev // { name = \"test\"; };\n    bench = release // { name = \"bench\"; };\n  };\n\n  defaultBuildProfile = {\n    opt-level = 0;\n    codegen-units = 256;\n  };\n\n  profilesFromManifest = manifest:\n    let\n      knownFields = [\n        \"name\"\n        \"inherits\"\n        # \"package\" # Unsupported yet.\n        \"build-override\"\n\n        \"opt-level\"\n        \"debug\"\n        # split-debug-info # Unsupported.\n        \"strip\"\n        \"debug-assertions\"\n        \"overflow-checks\"\n        \"lto\"\n        \"panic\"\n        # incremental # Unsupported.\n        \"codegen-units\"\n        \"rpath\"\n      ];\n\n      profiles = mapAttrs (name: p:\n        let unknown = removeAttrs p knownFields; in\n        warnIf (unknown != {}) \"Unsupported fields of profile ${name}: ${toString (attrNames unknown)}\"\n          (optionalAttrs (p ? inherits) profiles.${p.inherits} // p)\n      ) (recursiveUpdate defaultProfiles (manifest.profile or {}));\n\n    in profiles;\n\n  mkRustPackageOrWorkspace =\n    { defaultRegistries, pkgsBuildHost, buildRustCrate, stdenv }@default:\n    { src # : Path\n    , gitSrcs ? {} # : Attrset Path\n    , buildCrateOverrides ? {} # : Attrset (Attrset _)\n    , extraRegistries ? {} # : Attrset Registry\n    , registries ? defaultRegistries // extraRegistries\n\n    , rustc ? pkgsBuildHost.rustc\n    , stdenv ? default.stdenv\n    }:\n    let\n      manifest = fromTOML (readFile (src + \"/Cargo.toml\"));\n\n      profiles = profilesFromManifest manifest;\n\n      selected = flatten (map (glob: globMatchDir glob src) manifest.workspace.members);\n      excluded = map sanitizeRelativePath (manifest.workspace.exclude or []);\n      members = subtractLists excluded selected;\n\n      lock = fromTOML (readFile (src + \"/Cargo.lock\"));\n      # We don't distinguish between v1 and v2. But v3 is different from both.\n      lockVersionSet = { lockVersion = lock.version or 2; };\n\n      localSrcInfos =\n        listToAttrs\n        (map (relativePath:\n          let\n            memberRoot = src + (\"/\" + relativePath);\n            memberManifest = fromTOML (readFile (memberRoot + \"/Cargo.toml\")) // lockVersionSet;\n          in {\n            name = toPkgId memberManifest.package;\n            value = mkPkgInfoFromCargoToml memberManifest memberRoot;\n          }\n          ) (if manifest ? workspace then members else [ \"\" ]));\n\n    in mkRustPackageSet {\n      gitSrcInfos = mapAttrs (url: src:\n        mkPkgInfoFromCargoToml (fromTOML (readFile (src + \"/Cargo.toml\")) // lockVersionSet) src\n      ) gitSrcs;\n\n      inherit lock profiles localSrcInfos buildRustCrate buildCrateOverrides registries rustc stdenv;\n    };\n\n  # -> { <profile-name> = { <member-pkg-name> = <drv>; }; }\n  mkRustPackageSet =\n    { lock # : <fromTOML>\n    , localSrcInfos # : Attrset PkgInfo\n    , gitSrcInfos # : Attrset PkgInfo\n    , profiles # : Attrset Profile\n    , buildCrateOverrides # : Attrset (Attrset _)\n    , buildRustCrate # : Attrset -> Derivation\n    , registries # : Attrset Registry\n\n    # FIXME: Cross compilation.\n    , rustc\n    , stdenv\n    }:\n    let\n\n      getPkgInfo = { source ? null, name, version, ... }@args: let\n        m = match \"(registry|git)\\\\+([^#]*).*\" source;\n        kind = elemAt m 0;\n        url = elemAt m 1;\n      in\n        # Local crates have no `source`.\n        if source == null then\n          localSrcInfos.${toPkgId args}\n            or (throw \"Local crate is outside the workspace: ${toPkgId args}\")\n          // { isLocalPkg = true; }\n        else if m == null then\n          throw \"Invalid source: ${source}\"\n        else if kind == \"registry\" then\n          getPkgInfoFromIndex\n            (registries.${url} or\n              (throw \"Registry `${url}` not found. Please define it in `extraRegistries`.\"))\n            args\n          // { inherit source; } # `source` is for crate id, which is used for overrides.\n        else if kind == \"git\" then\n          gitSrcInfos.${url}\n            or (throw \"Git source `${url}` not found. Please define it in `gitSrcs`.\")\n        else\n          throw \"Invalid source: ${source}\";\n\n      hostCfgs = platformToCfgs stdenv.hostPlatform;\n\n      pkgSetRaw = resolveDepsFromLock getPkgInfo lock;\n      pkgSet = mapAttrs (id: info: info // {\n        dependencies = map (dep: dep // {\n          targetEnabled = dep.target != null -> evalTargetCfgStr hostCfgs dep.target;\n        }) info.dependencies;\n      }) pkgSetRaw;\n\n      selectDeps = pkgs: deps: features: selectKind: onlyLinks:\n        map\n          (dep: { rename = dep.rename or null; drv = pkgs.${dep.resolved}; })\n          (filter\n            ({ kind, name, optional, targetEnabled, resolved, ... }@dep:\n              targetEnabled && kind == selectKind\n              && (optional -> elem name features)\n              && (if resolved == null then throw \"Unresolved dependency: ${toJSON dep}\" else true)\n              && (onlyLinks -> pkgSet.${resolved}.links != null))\n            deps);\n\n      buildRustCrate' = info: args:\n        let\n          # TODO: Proc macro crates should behave differently in dependency resolution.\n          # But this override is applied just before the `buildRustCrate` call.\n          args' = args // (info.__override or lib.id) args;\n          args'' = args' // (buildCrateOverrides.${toPkgId info} or lib.id) args';\n        in\n          buildRustCrate args'';\n\n      mkPkg = profile: rootId: makeOverridable (\n        { features }:\n        let\n          rootFeatures = if features != null then features\n            else if pkgSet.${rootId}.features ? default then [ \"default\" ]\n            else [];\n\n          resolvedBuildFeatures = resolveFeatures {\n            inherit pkgSet rootId rootFeatures;\n            depFilter = dep: dep.targetEnabled && dep.kind == \"normal\" || dep.kind == \"build\";\n          };\n          resolvedNormalFeatures = resolveFeatures {\n            inherit pkgSet rootId rootFeatures;\n            depFilter = dep: dep.targetEnabled && dep.kind == \"normal\";\n          };\n\n          pkgsBuild = mapAttrs (id: features: let info = pkgSet.${id}; in\n            if features != null then\n              buildRustCrate' info {\n                inherit (info) version src procMacro;\n                inherit features profile rustc;\n                pname = info.name;\n                capLints = if localSrcInfos ? id then null else \"allow\";\n                buildDependencies = selectDeps pkgsBuild info.dependencies features \"build\" false;\n                # Build dependency's normal dependency is still build dependency.\n                dependencies = selectDeps pkgsBuild info.dependencies features \"normal\" false;\n                linksDependencies = selectDeps pkgsBuild info.dependencies features \"normal\" true;\n              }\n            else\n              null\n          ) resolvedBuildFeatures;\n\n          pkgs = mapAttrs (id: features: let info = pkgSet.${id}; in\n            if features != null then\n              buildRustCrate' info {\n                inherit (info) version src links procMacro;\n                inherit features profile rustc;\n                pname = info.name;\n                capLints = if localSrcInfos ? id then null else \"allow\";\n                buildDependencies = selectDeps pkgsBuild info.dependencies features \"build\" false;\n                dependencies = selectDeps pkgs info.dependencies features \"normal\" false;\n                linksDependencies = selectDeps pkgs info.dependencies features \"normal\" true;\n              }\n            else\n              null\n          ) resolvedNormalFeatures;\n        in\n          pkgs.${rootId}\n      ) {\n        features = null;\n      };\n\n    in\n      mapAttrs (_: profile:\n        mapAttrs' (pkgId: pkgInfo: {\n          name = pkgInfo.name;\n          value = mkPkg profile pkgId;\n        }) localSrcInfos\n      ) profiles;\n\n  sanitizeRelativePath = path:\n    if hasPrefix \"/\" path then\n      throw \"Absolute path is not allowed: ${path}\"\n    else\n      concatStringsSep \"/\"\n        (filter\n          (s:\n            isString s && s != \"\" && s != \".\" &&\n            (if match ''.*[[?*].*|\\.\\.'' s != null then throw ''\n              Globing and `..` are not allowed: ${path}\n            '' else true))\n          (split ''[\\/]'' path));\n\n  build-from-src-dry-tests = { assertEq, pkgs, defaultRegistries, ... }: let\n    inherit (builtins) head listToAttrs;\n\n    mkPackage = pkgs.callPackage mkRustPackageOrWorkspace {\n      inherit defaultRegistries;\n      buildRustCrate = args: args;\n    };\n\n    build = src: args:\n      head (attrValues (mkPackage ({ inherit src; } // args)).dev);\n\n  in\n  {\n    features = let ret = build ../tests/features {}; in\n      assertEq ret.features [ \"a\" \"default\" \"semver\" ]; # FIXME\n\n    dependency-features = let\n      ret = build ../tests/features { };\n      semver = (head ret.dependencies).drv;\n      serde = (head semver.dependencies).drv;\n    in assertEq\n      [ semver.features serde.features ]\n      [ [ \"default\" \"serde\" \"std\" ] [ /* Don't trigger default features */ ] ];\n\n    dependency-overrided = let\n      ret = build ../tests/features {\n        buildCrateOverrides.\"\" = old: { a = \"b\"; };\n        buildCrateOverrides.\"serde 1.0.139 (registry+https://github.com/rust-lang/crates.io-index)\" = old: {\n          buildInputs = [ \"some-inputs\" ];\n        };\n      };\n      semver = (head ret.dependencies).drv;\n      serde = (head semver.dependencies).drv;\n    in\n      assertEq serde.buildInputs [ \"some-inputs\" ];\n\n    dependency-kinds = let\n      mkSrc = from: { __toString = _: ../tests/fake-semver; inherit from; };\n      gitSrcs = {\n        \"https://github.com/dtolnay/semver?tag=1.0.0\" = mkSrc \"tag\";\n        \"http://github.com/dtolnay/semver\" = mkSrc \"branch\"; # v1, v2\n        \"http://github.com/dtolnay/semver?branch=master\" = mkSrc \"branch\"; # v3\n        \"ssh://git@github.com/dtolnay/semver?rev=a2ce5777dcd455246e4650e36dde8e2e96fcb3fd\" = mkSrc \"rev\";\n        \"ssh://git@github.com/dtolnay/semver\" = mkSrc \"nothing\";\n      };\n      extraRegistries = {\n        \"https://www.github.com/rust-lang/crates.io-index\" =\n          head (attrValues defaultRegistries);\n      };\n\n      ret = build ../tests/dependency-v3 {\n        inherit gitSrcs extraRegistries;\n      };\n      ret' = listToAttrs\n        (map (dep: {\n          name = if dep.rename != null then dep.rename else dep.drv.pname;\n          value = dep.drv.src.from or dep.drv.src.name;\n        }) ret.dependencies);\n    in\n      assertEq ret' {\n        cratesio = \"crate-semver-1.0.12.tar.gz\";\n        git_branch = \"branch\";\n        git_head = \"nothing\";\n        git_rev = \"rev\";\n        git_tag = \"tag\";\n        registry_index = \"crate-semver-1.0.12.tar.gz\";\n      };\n\n    libz-propagated = let\n      ret = build ../tests/libz-dynamic {};\n      libz = (head ret.dependencies).drv;\n    in\n      assertEq (head libz.propagatedBuildInputs).pname \"zlib\";\n\n    libz-link = let\n      ret = build ../tests/libz-dynamic {};\n      libz = (head ret.dependencies).drv;\n      libz' = (head ret.linksDependencies).drv;\n    in\n      assertEq [ libz.links libz'.links ] [ \"z\" \"z\" ];\n  };\n\n  sanitize-relative-path-tests = { assertEq, ... }: let\n    assertOk = raw: expect: assertEq (tryEval (sanitizeRelativePath raw)) { success = true; value = expect; };\n    assertInvalid = raw: assertEq (tryEval (sanitizeRelativePath raw)) { success = false; value = false; };\n  in\n  {\n    empty = assertOk \"\" \"\";\n    simple1 = assertOk \"foo\" \"foo\";\n    simple2 = assertOk \"foo/bar\" \"foo/bar\";\n    dot1 = assertOk \".\" \"\";\n    dot2 = assertOk \"./././\" \"\";\n    dot3 = assertOk \"./foo/./bar/\" \"foo/bar\";\n\n    dotdot1 = assertInvalid \"..\";\n    dotdot2 = assertInvalid \"./foo/..\";\n    dotdot3 = assertInvalid \"../bar\";\n    root1 = assertInvalid \"/\";\n    root2 = assertInvalid \"/foo\";\n  };\n}\n"
  },
  {
    "path": "lib/target-cfg.nix",
    "content": "{ lib, ... }:\nlet\n  inherit (builtins) match tryEval;\n  inherit (lib)\n    concatStrings\n    length elem elemAt any all sort flatten isList\n    optionalAttrs mapAttrsToList;\nin\nrec {\n  # https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch\n  platformToTargetArch = platform:\n    if platform.isAarch32 then \"arm\"\n    else platform.parsed.cpu.name;\n\n  # https://doc.rust-lang.org/reference/conditional-compilation.html#target_os\n  platformToTargetOs = platform:\n    if platform.isDarwin then \"macos\"\n    else platform.parsed.kernel.name;\n\n  # https://github.com/rust-lang/rust/blob/9bc8c42bb2f19e745a63f3445f1ac248fb015e53/compiler/rustc_session/src/config.rs#L835\n  # https://doc.rust-lang.org/reference/conditional-compilation.html\n  platformToCfgAttrs = platform: {\n    # Arch info.\n    # https://github.com/NixOS/nixpkgs/blob/c63d4270feed5eb6c578fe2d9398d3f6f2f96811/pkgs/build-support/rust/build-rust-crate/configure-crate.nix#L126\n    target_arch = platformToTargetArch platform;\n    target_endian = if platform.isLittleEndian then \"little\"\n      else if platform.isBigEndian then \"big\"\n      else throw \"Unknow target_endian for ${platform.config}\";\n    target_env = if platform.isNone then \"\"\n      else if platform.libc == \"glibc\" then \"gnu\"\n      else if platform.isMusl then \"musl\"\n      else if platform.isDarwin then \"\" # Empty\n      else lib.trace platform (throw \"Unknow target_env for ${platform.config}\");\n    target_family = if platform.isUnix then \"unix\"\n      else if platform.isWindows then \"windows\"\n      else null;\n    target_os = platformToTargetOs platform;\n    target_pointer_width = toString platform.parsed.cpu.bits;\n    target_vendor = platform.parsed.vendor.name;\n  } // optionalAttrs platform.isx86 {\n    # These features are assume to be available.\n    target_feature = [ \"fxsr\" \"sse\" \"sse2\" ];\n  } // optionalAttrs platform.isUnix {\n    unix = true;\n  } // optionalAttrs platform.isWindows {\n    windows = true;\n  };\n\n  platformToCfgs = platform:\n    flatten (\n      mapAttrsToList (key: value:\n        if value == true then { inherit key; }\n        else if isList value then map (value: { inherit key value; }) value\n        else { inherit key value; }\n      ) (platformToCfgAttrs platform));\n\n  # cfgs: [\n  #   { key = \"atom1\"; }\n  #   { key = \"atom2\"; }\n  #   { key = \"feature\"; value = \"foo\"; }\n  #   { key = \"feature\"; value = \"bar\"; }\n  # ]\n  evalTargetCfgStr = cfgs: s:\n    evalCfgExpr cfgs (parseTargetCfgExpr s);\n\n  # Cargo's parse is stricter than rustc's.\n  # - Must starts with `cfg(` and ends with `)`. No spaces are allowed before and after.\n  # - Identifiers must follows /[A-Za-z_][A-Za-z_0-9]*/.\n  # - Raw identifiers, raw strings, escapes in strings are not allowed.\n  #\n  # The target can also be a simple target name like `aarch64-unknown-linux-gnu`, which will be parsed\n  # as if it's `cfg(target = \"...\")`.\n  #\n  # https://github.com/rust-lang/cargo/blob/dcc95871605785c2c1f2279a25c6d3740301c468/crates/cargo-platform/src/cfg.rs\n  parseTargetCfgExpr = cfg: let\n    fail = reason: throw \"${reason}, when parsing `${cfg}\";\n\n    go = { fn, values, afterComma, prev }@stack: s: let\n      m = match ''((all|any|not) *\\( *|(\\)) *|(,) *|([A-Za-z_][A-Za-z_0-9]*) *(= *\"([^\"]*)\" *)?)(.*)'' s;\n      mFn = elemAt m 1;\n      mClose = elemAt m 2;\n      mComma = elemAt m 3;\n      mIdent = elemAt m 4;\n      mString = elemAt m 6;\n      mRest = elemAt m 7;\n    in\n      if s == \"\" then\n        stack\n      else if m == null then\n        fail \"No parse `${s}`\"\n      # else if builtins.trace ([ stack m ]) (mFn != null) then\n      else if mFn != null then\n        if !afterComma then\n          fail \"Missing comma before `${mFn}` at `${s}\"\n        else\n          go { fn = mFn; values = []; afterComma = true; prev = stack; } mRest\n      else if mClose != null then\n        if prev == null then\n          fail \"Unexpected `)` at `${s}`\"\n        else if fn == \"not\" && length values == 0 then\n          fail \"`not` must have exact one argument, got 0\"\n        else if prev.fn == \"not\" && length prev.values != 0 then\n          fail \"`not` must have exact one argument, got at least 2\"\n        else\n          go (prev // { values = prev.values ++ [ { inherit (stack) fn values; } ]; afterComma = false; }) mRest\n      else if mComma != null then\n        if afterComma then\n          fail \"Unexpected `,` at `${s}`\"\n        else\n          go (stack // { afterComma = true; }) mRest\n      else\n        if !afterComma then\n          fail \"Missing comma before identifier `${mIdent}` at `${s}\"\n        else if fn == \"not\" && length values != 0 then\n          fail \"`not` must have exact one argument, got at least 2\"\n        else\n          let kv =\n            if mString != null then { key = mIdent; value = mString; }\n            else { key = mIdent; };\n          in\n            go (stack // { afterComma = false; values = values ++ [ kv ]; }) mRest;\n\n      mSimpleTarget = match \"[A-Za-z_0-9_.-]+\" cfg;\n\n      mCfg = match ''cfg\\( *(.*)\\)'' cfg;\n      mCfgInner = elemAt mCfg 0;\n      ret = go { fn = \"cfg\"; values = []; afterComma = true; prev = null; } mCfgInner;\n\n    in\n      if mSimpleTarget != null then\n        { key = \"target\"; value = cfg; }\n      else if mCfg == null then\n        fail \"Cfg expr must be a simple target string, or start with `cfg(` and end with `)`\"\n      else if ret.prev != null then\n        fail \"Missing `)`\"\n      else if length ret.values != 1 then\n        fail \"`cfg` must have exact one argument, got ${toString (length ret.values)}\"\n      else\n        elemAt ret.values 0;\n\n  evalCfgExpr = cfgs: tree:\n    if !(tree ? fn) then\n      elem tree cfgs\n    else if tree.fn == \"all\" then\n      all (evalCfgExpr cfgs) tree.values\n    else if tree.fn == \"any\" then\n      any (evalCfgExpr cfgs) tree.values\n    else\n      !evalCfgExpr cfgs (elemAt tree.values 0);\n\n  cfg-parser-tests = { assertEq, ... }: let\n    shouldParse = cfg: expect:\n      assertEq (tryEval (parseTargetCfgExpr cfg)) { success = true; value = expect; };\n    shouldNotParse = cfg:\n      assertEq (tryEval (parseTargetCfgExpr cfg)) { success = false; value = false; };\n  in {\n    simple-target1 = shouldParse \"thumbv8m.base-none-eabi\"\n      { key = \"target\"; value = \"thumbv8m.base-none-eabi\"; };\n    simple-target2 = shouldParse \"aarch64-unknown-linux-gnu\"\n      { key = \"target\"; value = \"aarch64-unknown-linux-gnu\"; };\n\n    simple1 = shouldParse \"cfg(atom)\" { key = \"atom\"; };\n    simple2 = shouldParse ''cfg(k = \"v\")'' { key = \"k\"; value = \"v\"; };\n    complex = shouldParse ''cfg( all ( not ( a , ) , b , all ( ) , any ( c , d = \"e\" ) , ) )''\n      {\n        fn = \"all\";\n        values = [\n          {\n            fn = \"not\";\n            values = [ { key = \"a\"; } ];\n          }\n          { key = \"b\"; }\n          {\n            fn = \"all\";\n            values = [];\n          }\n          {\n            fn = \"any\";\n            values = [\n              { key = \"c\"; }\n              { key = \"d\"; value = \"e\"; }\n            ];\n          }\n        ];\n      };\n\n    invalid-cfg1 = shouldNotParse \"cfg (a)\";\n    invalid-cfg2 = shouldNotParse \"cfg()\";\n    invalid-cfg3 = shouldNotParse \"cfg(a,b)\";\n    invalid-not1 = shouldNotParse \"cfg(not(a,b))\";\n    invalid-not2 = shouldNotParse \"cfg(not())\";\n    invalid-comma1 = shouldNotParse \"cfg(all(,))\";\n    invalid-comma2 = shouldNotParse \"cfg(all(a,,b))\";\n    invalid-comma3 = shouldNotParse \"cfg(all(a,b,,))\";\n    invalid-comma4 = shouldNotParse \"cfg(all(a b))\";\n    invalid-comma5 = shouldNotParse \"cfg(all(any() any()))\";\n    invalid-paren1 = shouldNotParse \"cfg(all(a)))\";\n    invalid-paren2 = shouldNotParse \"cfg(all(a)\";\n  };\n\n  cfg-eval-tests = { assertEq, ... }: let\n    cfgs = [\n      { key = \"foo\"; }\n      { key = \"bar\"; }\n      { key = \"feature\"; value = \"foo\"; }\n      { key = \"feature\"; value = \"bar\"; }\n    ];\n    test = cfg: expect: assertEq (evalTargetCfgStr cfgs cfg) expect;\n  in {\n    simple1 = test ''cfg(foo)'' true;\n    simple2 = test ''cfg(baz)'' false;\n    simple3 = test ''cfg(feature = \"foo\")'' true;\n    simple4 = test ''cfg(foo = \"\")'' false;\n    simple5 = test ''cfg(wtf = \"foo\")'' false;\n\n    all1  = test ''cfg(all())'' true;\n    all2  = test ''cfg(all(foo))'' true;\n    all3  = test ''cfg(all(baz))'' false;\n    all4  = test ''cfg(all(foo,bar))'' true;\n    all5  = test ''cfg(all(foo,bar,baz))'' false;\n    all6  = test ''cfg(all(foo,baz,bar))'' false;\n    all7  = test ''cfg(all(baz,foo))'' false;\n    all8  = test ''cfg(all(baz,feature=\"foo\"))'' false;\n    all9  = test ''cfg(all(baz,feature=\"wtf\"))'' false;\n    all10 = test ''cfg(all(foo,feature=\"foo\"))'' true;\n\n    any1  = test ''cfg(any())'' false;\n    any2  = test ''cfg(any(foo))'' true;\n    any3  = test ''cfg(any(baz))'' false;\n    any4  = test ''cfg(any(foo,bar))'' true;\n    any5  = test ''cfg(any(foo,bar,baz))'' true;\n    any6  = test ''cfg(any(foo,baz,bar))'' true;\n    any7  = test ''cfg(any(baz,foo))'' true;\n    any8  = test ''cfg(any(baz,feature=\"foo\"))'' true;\n    any9  = test ''cfg(any(baz,feature=\"wtf\"))'' false;\n    any10 = test ''cfg(any(foo,feature=\"wtf\"))'' true;\n\n    not1 = test ''cfg(not(foo))'' false;\n    not2 = test ''cfg(not(wtf))'' true;\n  };\n\n  platform-cfg-tests = { assertEq, ... }: let\n    inherit (lib.systems) elaborate;\n    test = config: expect: let\n      cfgs = platformToCfgs (elaborate config);\n      strs = map ({ key, value ? null }:\n        if value != null then \"${key}=\\\"${value}\\\"\\n\" else \"${key}\\n\"\n      ) cfgs;\n      got = concatStrings (sort (a: b: a < b) strs);\n    in\n      assertEq got expect;\n\n  in {\n    attrs-x86_64-linux = assertEq (platformToCfgAttrs (elaborate \"x86_64-unknown-linux-gnu\")) {\n      target_arch = \"x86_64\";\n      target_endian = \"little\";\n      target_env = \"gnu\";\n      target_family = \"unix\";\n      target_feature = [\"fxsr\" \"sse\" \"sse2\"];\n      target_os = \"linux\";\n      target_pointer_width = \"64\";\n      target_vendor = \"unknown\";\n      unix = true;\n    };\n\n    cfg-x86_64-linux = test \"x86_64-unknown-linux-gnu\" ''\n      target_arch=\"x86_64\"\n      target_endian=\"little\"\n      target_env=\"gnu\"\n      target_family=\"unix\"\n      target_feature=\"fxsr\"\n      target_feature=\"sse\"\n      target_feature=\"sse2\"\n      target_os=\"linux\"\n      target_pointer_width=\"64\"\n      target_vendor=\"unknown\"\n      unix\n    '';\n\n    cfg-aarch64-linux = test \"aarch64-unknown-linux-gnu\" ''\n      target_arch=\"aarch64\"\n      target_endian=\"little\"\n      target_env=\"gnu\"\n      target_family=\"unix\"\n      target_os=\"linux\"\n      target_pointer_width=\"64\"\n      target_vendor=\"unknown\"\n      unix\n    '';\n  };\n}\n"
  },
  {
    "path": "noc/Cargo.toml",
    "content": "[package]\nname = \"nocargo\"\nversion = \"0.0.0\"\nedition = \"2021\"\nlicense = \"MIT\"\ndescription = \"Helper program for github.com/oxalica/nocargo\"\nrepository = \"https://github.com/oxalica/nocargo\"\n\n[[bin]]\nname = \"noc\"\npath = \"src/main.rs\"\n\n[dependencies]\nanyhow = \"1.0.40\"\naskama = { version = \"0.11.1\", default-features = false }\ncargo_toml = \"0.11.5\"\nclap = { version = \"3.2.8\", features = [\"derive\"] }\nglob = \"0.3.0\"\nonce_cell = \"1.12.0\"\nregex = \"1.5.4\"\ntoml = \"0.5.9\"\n\n[dev-dependencies]\nexpect-test = \"1.3.0\"\n"
  },
  {
    "path": "noc/src/init.rs",
    "content": "use std::collections::{BTreeMap, HashSet};\nuse std::fs::{read_dir, read_to_string, File};\nuse std::io::Write;\nuse std::path::{Path, PathBuf};\n\nuse anyhow::{bail, ensure, Context, Result};\nuse askama::Template;\nuse cargo_toml::{Dependency, Manifest, Product};\nuse glob::glob;\nuse once_cell::sync::Lazy;\nuse regex::Regex;\n\n/// Create or print template `flake.nix` for your rust crate.\n#[derive(clap::Args)]\npub struct Args {\n    /// Print the content of initial `flake.nix` to stdout rather than to `flake.nix` in\n    /// the current directory.\n    #[clap(long, short)]\n    print: bool,\n\n    /// Force overwrite `flake.nix` even if it exists.\n    #[clap(long, short, conflicts_with = \"print\")]\n    force: bool,\n\n    /// The Rust project root directory, where the root `Cargo.toml` lies in,\n    /// either a project or a workspace.\n    /// Default to be the current directory.\n    #[clap(long)]\n    root: Option<PathBuf>,\n}\n\nimpl super::App for Args {\n    fn run(self) -> Result<()> {\n        let root = self\n            .root\n            .as_deref()\n            .unwrap_or_else(|| Path::new(\".\"))\n            .canonicalize()\n            .context(\"Failed locate the current directory\")?;\n\n        // Always at CWD.\n        let out_path = Path::new(\"flake.nix\");\n        // Fail fast.\n        ensure!(\n            self.print || self.force || !out_path.exists(),\n            \"flake.nix already exists. Use `--force` to overwrite or `--print` to print to stdout only\",\n        );\n\n        let manifest =\n            Manifest::from_path(root.join(\"Cargo.toml\")).context(\"Failed to load Cargo.toml\")?;\n\n        // Check ancestor manifest files for (maybe) workspace definition.\n        if manifest.workspace.is_none() && self.root.is_none() {\n            if let Some(parent_manifest) = root\n                .ancestors()\n                .skip(1)\n                .map(|p| p.join(\"Cargo.toml\"))\n                .find(|p| p.exists())\n            {\n                bail!(\n                    \"Are we in a workspace? Found ancestor manifest at {}\\n\\\n                    Please run `init` in the *workspace root* directory. \\n\\\n                    If you are sure the current directory is the root, use `--root=.`\",\n                    parent_manifest.display(),\n                );\n            }\n        }\n\n        let lock_path = root.join(\"Cargo.lock\");\n        ensure!(\n            lock_path.exists(),\n            \"Cargo.lock does not exist at {}\\n\\\n            We doesn't support lock generation currently. Please run `cargo update` first.\n            \",\n            lock_path.display(),\n        );\n        let lock_version = (|| -> Result<_> {\n            let content = read_to_string(&lock_path)?;\n            let lock = toml::from_str::<toml::Value>(&content)?;\n            Ok(lock\n                .get(\"version\")\n                .and_then(|v| v.as_integer())\n                .unwrap_or(2))\n        })()\n        .context(\"Parse Cargo.lock\")?;\n        match lock_version {\n            // v1 or v2.\n            2 => {\n                eprintln!(\n                    \"warning: Cargo.lock is generated by cargo < 1.53.0.\\n\\\n                    The old lock format is supported but encodes git URLs in a different way,\\n\\\n                    which results in different `gitSrcs` arguments when calling `mkRustPackageOrWorkspace`.\\n\\\n                    We recommand to regenerate the lock via `cargo update` with cargo >= 1.53.0 and retry.\",\n                )\n            }\n            3 => {}\n            _ => eprintln!(\"warning: Unsupported version of Cargo.lock, building may fail\"),\n        }\n\n        let out = generate_flake(&root, &manifest, lock_version)?;\n\n        if self.print {\n            println!(\"{}\", out);\n        } else {\n            (|| {\n                let mut f = File::options()\n                    .write(true)\n                    .create(true)\n                    .truncate(self.force)\n                    .open(out_path)?;\n                f.write_all(out.as_bytes())?;\n                f.flush()\n            })()\n            .with_context(|| format!(\"Failed write to {:?}\", out_path))?;\n        }\n\n        Ok(())\n    }\n}\n\nfn generate_flake(root: &Path, manifest: &Manifest, lock_version: i64) -> Result<String> {\n    ensure!(manifest.patch.is_empty(), \"[patch] is not supported yet\");\n\n    let is_workspace = manifest.workspace.is_some();\n    let mut templ = FlakeTemplate {\n        is_workspace,\n        main_pkg: None,\n        registries: Default::default(),\n        git_srcs: Default::default(),\n    };\n\n    if let Some(pkg) = &manifest.package {\n        templ.main_pkg = Some((\n            pkg.name.clone(),\n            Products::from_path_manifest(root, manifest)?,\n        ));\n    }\n\n    match &manifest.workspace {\n        Some(ws) => {\n            ensure!(\n                !ws.members.is_empty(),\n                \"[workspace] without explicit `members` declarations are not supported yet\",\n            );\n\n            let member_roots = get_workspace_members(root, &ws.members)?;\n            let absolute_member_roots = member_roots\n                .iter()\n                .map(|p| p.canonicalize())\n                .collect::<Result<HashSet<_>, _>>()?;\n            ensure!(\n                member_roots.len() == absolute_member_roots.len(),\n                \"Duplicated workspace members\"\n            );\n\n            let member_manifests = member_roots\n                .iter()\n                .map(|root| {\n                    let manifest_path = root.join(\"Cargo.toml\");\n                    let manifest = Manifest::from_path(&manifest_path).with_context(|| {\n                        format!(\n                            \"Failed to load member Cargo.toml at {}\",\n                            manifest_path.display()\n                        )\n                    })?;\n                    Ok(manifest)\n                })\n                .collect::<Result<Vec<_>>>()?;\n\n            let root_pkg = manifest\n                .package\n                .is_some()\n                .then(|| (Path::new(\".\"), manifest));\n            for (member_root, member_manifest) in member_roots\n                .iter()\n                .map(|p| &**p)\n                .zip(&member_manifests)\n                .chain(root_pkg)\n            {\n                for (dep_name, dep) in get_all_dependencies(member_manifest) {\n                    templ\n                        .check_dependency(dep, lock_version, |local_path| {\n                            let local_dep_root = member_root.join(local_path).canonicalize()?;\n                            ensure!(\n                                absolute_member_roots.contains(&local_dep_root),\n                                \"Local dependency not in workspace: {}\",\n                                local_path.display(),\n                            );\n                            Ok(())\n                        })\n                        .with_context(|| {\n                            format!(\n                                \"In dependency {:?} of workspace member {:?}\",\n                                dep_name,\n                                member_root.display(),\n                            )\n                        })?;\n                }\n            }\n        }\n        None => {\n            for (dep_name, dep) in get_all_dependencies(manifest) {\n                templ\n                    .check_dependency(dep, lock_version, |local_path| {\n                        bail!(\n                            \"Local dependency is not supported for non-workspace: {}\",\n                            local_path.display(),\n                        )\n                    })\n                    .with_context(|| format!(\"In dependency {:?}\", dep_name))?;\n            }\n        }\n    }\n\n    // The trailing newline is suppressed by default. Add it back.\n    Ok(templ.render().unwrap() + \"\\n\")\n}\n\n#[derive(Template)]\n#[template(path = \"../templates/init-flake.nix\", escape = \"none\")]\nstruct FlakeTemplate {\n    is_workspace: bool,\n    main_pkg: Option<(String, Products)>,\n    // source_id ->  flake_ref\n    registries: BTreeMap<String, String>,\n    // source_id ->  flake_ref\n    git_srcs: BTreeMap<String, String>,\n}\n\nmod filters {\n    pub fn nix_escape(s: &str) -> askama::Result<String> {\n        Ok(s.replace('\\\\', \"\\\\\\\\\").replace('\"', \"\\\\\\\"\"))\n    }\n\n    pub fn ident_or_str(s: &str) -> askama::Result<String> {\n        const KEYWORDS: &[&str] = &[\n            \"if\", \"then\", \"else\", \"assert\", \"with\", \"let\", \"in\", \"rec\", \"inherit\", \"or\",\n        ];\n        let is_ident_start = |c: char| c.is_ascii_alphabetic() || c == '_';\n        let is_ident_char =\n            |c: char| c.is_ascii_alphanumeric() || c == '_' || c == '-' || c == '\\'';\n        if s.starts_with(is_ident_start) && s.chars().all(is_ident_char) && !KEYWORDS.contains(&s) {\n            Ok(s.into())\n        } else {\n            Ok(s.replace('\\\\', \"\\\\\\\\\").replace('\"', \"\\\\\\\"\"))\n        }\n    }\n}\n\nimpl FlakeTemplate {\n    fn check_dependency(\n        &mut self,\n        dep: &Dependency,\n        lock_version: i64,\n        mut on_local_dep: impl FnMut(&Path) -> Result<()>,\n    ) -> Result<()> {\n        match DepSource::try_from(dep)? {\n            // Automatically handled by nocargo.\n            DepSource::CratesIo => {}\n            DepSource::RegistryName { name } => {\n                bail!(\"External registry with name {:?} is not supported\", name)\n            }\n            DepSource::Path { path } => {\n                on_local_dep(path)?;\n            }\n            DepSource::RegistryUrl { url } => {\n                let flake_ref = git_url_to_flake_ref(url, None, None)?;\n                self.registries.insert(url.into(), flake_ref);\n            }\n            DepSource::Git { url, ref_ } => {\n                let source_url = match ref_ {\n                    GitRef::Tag(tag) => format!(\"{}?tag={}\", url, tag),\n                    GitRef::Branch(branch) if lock_version >= 3 => {\n                        format!(\"{}?branch={}\", url, branch)\n                    }\n                    GitRef::Rev(rev) => format!(\"{}?rev={}\", url, rev),\n                    GitRef::NotSpecified | GitRef::Branch(_) => url.to_owned(),\n                };\n\n                let (ref_name, rev) = match ref_ {\n                    GitRef::Tag(ref_name) | GitRef::Branch(ref_name) => (Some(ref_name), None),\n                    GitRef::NotSpecified => (None, None),\n                    GitRef::Rev(rev) => (None, Some(rev)),\n                };\n\n                let flake_ref = git_url_to_flake_ref(url, ref_name, rev)?;\n                self.git_srcs.insert(source_url, flake_ref);\n            }\n        }\n        Ok(())\n    }\n}\n\nfn get_workspace_members(root: &Path, members: &[impl AsRef<str>]) -> Result<Vec<PathBuf>> {\n    let mut ret = Vec::new();\n    for member in members {\n        let pat = root.join(member.as_ref());\n        let pat = pat\n            .to_str()\n            .with_context(|| format!(\"Non UTF-8 path is not supported: {}\", pat.display()))?;\n        for path in glob(pat)? {\n            ret.push(path?);\n        }\n    }\n    Ok(ret)\n}\n\nfn get_all_dependencies(manifest: &Manifest) -> impl Iterator<Item = (&str, &Dependency)> {\n    manifest\n        .dependencies\n        .iter()\n        .chain(&manifest.dev_dependencies)\n        .chain(&manifest.build_dependencies)\n        .chain(manifest.target.values().flat_map(|tgt| {\n            tgt.dependencies\n                .iter()\n                .chain(&tgt.dev_dependencies)\n                .chain(&tgt.build_dependencies)\n        }))\n        .map(|(name, dep)| (&**name, dep))\n}\n\n#[allow(dead_code)]\n#[derive(Debug, Clone)]\nstruct Products {\n    library: bool,\n    binary: bool,\n    bench: bool,\n    test: bool,\n    example: bool,\n}\n\nimpl Products {\n    // https://github.com/rust-lang/cargo/blob/rust-1.63.0/src/cargo/util/toml/targets.rs#L3-L8\n    fn from_path_manifest(path: &Path, manifest: &Manifest) -> Result<Self> {\n        let pkg = manifest.package.as_ref().context(\"Missing [product]\")?;\n        let has_product = |decls: &[Product],\n                           allow_discover: bool,\n                           extra_path: Option<&str>,\n                           convention_dir: &str|\n         -> Result<bool> {\n            if !decls.is_empty() {\n                return Ok(true);\n            }\n            if allow_discover {\n                return Ok(false);\n            }\n            if matches!(extra_path, Some(p) if Path::new(p).is_file()) {\n                return Ok(true);\n            }\n            for ent in read_dir(path.join(convention_dir))? {\n                let ent = ent?;\n                let file_type = ent.file_type()?;\n                // `<dir>/*.rs`\n                if file_type.is_file()\n                    && Path::new(&ent.file_name())\n                        .extension()\n                        .map_or(false, |ext| ext == \"rs\")\n                {\n                    return Ok(true);\n                }\n                // `<dir>/*/main.rs`\n                if file_type.is_dir() && ent.path().join(\"main.rs\").is_file() {\n                    return Ok(true);\n                }\n            }\n            Ok(false)\n        };\n        Ok(Self {\n            library: manifest.lib.is_some() || path.join(\"src/lib.rs\").exists(),\n            binary: has_product(&manifest.bin, pkg.autobins, Some(\"src/main.rs\"), \"src/bin\")?,\n            bench: has_product(&manifest.bin, pkg.autobenches, None, \"benches\")?,\n            test: has_product(&manifest.test, pkg.autotests, None, \"tests\")?,\n            example: has_product(&manifest.example, pkg.autoexamples, None, \"examples\")?,\n        })\n    }\n}\n\n// https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html\n#[derive(Debug, Clone, Copy)]\nenum DepSource<'a> {\n    CratesIo,\n    RegistryName { name: &'a str },\n    RegistryUrl { url: &'a str },\n    Path { path: &'a Path },\n    Git { url: &'a str, ref_: GitRef<'a> },\n}\n\n#[derive(Debug, Clone, Copy)]\nenum GitRef<'a> {\n    NotSpecified,\n    Tag(&'a str),\n    Branch(&'a str),\n    Rev(&'a str),\n}\n\nimpl<'a> TryFrom<&'a Dependency> for DepSource<'a> {\n    type Error = anyhow::Error;\n\n    fn try_from(dep: &'a Dependency) -> Result<Self, Self::Error> {\n        match dep {\n            Dependency::Simple(_) => Ok(Self::CratesIo),\n            Dependency::Detailed(detail) => {\n                match (&detail.registry, &detail.registry_index, &detail.path, &detail.git) {\n                    (None, None, None, None) => Ok(Self::CratesIo),\n                    (Some(name), None, None, None) => Ok(Self::RegistryName { name }),\n                    (None, Some(url), None, None) => Ok(Self::RegistryUrl { url }),\n                    (None, None, Some(path), None) => Ok(Self::Path {\n                        path: Path::new(path),\n                    }),\n                    (None, None, None, Some(url)) => {\n                        let ref_ = match (&detail.branch, &detail.tag, &detail.rev) {\n                            (None, None, None) => GitRef::NotSpecified,\n                            (Some(b), None, None) => GitRef::Branch(b),\n                            (None, Some(t), None) => GitRef::Tag(t),\n                            (None, None, Some(r)) => GitRef::Rev(r),\n                            _ => bail!(\"For git dependency, at most one of `branch`, `rev` and `tag` is allowed\"),\n                        };\n                        Ok(Self::Git { url, ref_ })\n                    }\n                    _ => bail!(\n                        \"Only one of `registry`, `registry-index`, `path`, `git` can be specified: {:?}\",\n                        dep,\n                    ),\n                }\n            }\n        }\n    }\n}\n\n// https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html?#flake-inputs\npub fn git_url_to_flake_ref(\n    url_orig: &str,\n    ref_name: Option<&str>,\n    rev: Option<&str>,\n) -> Result<String> {\n    let url = url_orig.strip_prefix(\"git+\").unwrap_or(url_orig);\n    ensure!(\n        url.starts_with(\"http://\")\n            || url.starts_with(\"https://\")\n            || url.starts_with(\"ssh://\")\n            || url.starts_with(\"git://\"),\n        \"Only http/https/ssh/git schemas are supported for git url, got: {}\",\n        url_orig,\n    );\n\n    static RE_GITHUB_URL: Lazy<Regex> =\n        Lazy::new(|| Regex::new(r\"^https?://github.com/([^/?#]+)/([^/?#]+?)(.git)?/?$\").unwrap());\n\n    if let Some(cap) = RE_GITHUB_URL.captures(url) {\n        let owner = cap.get(1).unwrap().as_str();\n        let repo = cap.get(2).unwrap().as_str();\n        return Ok(match rev.or(ref_name) {\n            Some(rev) => format!(\"github:{}/{}/{}\", owner, repo, rev),\n            None => format!(\"github:{}/{}\", owner, repo),\n        });\n    }\n\n    ensure!(\n        !url.contains(|c| c == '?' || c == '#'),\n        \"Url containing `?` or `#` is not supported yet: {}\",\n        url_orig,\n    );\n\n    let prefix = if url.starts_with(\"git://\") {\n        \"\"\n    } else {\n        \"git+\"\n    };\n    let ret = match (ref_name, rev) {\n        (_, Some(rev)) => format!(\"{}{}?rev={}\", prefix, url, rev),\n        (Some(ref_name), None) => format!(\"{}{}?ref={}\", prefix, url, ref_name),\n        (None, None) => format!(\"{}{}\", prefix, url),\n    };\n    Ok(ret)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::git_url_to_flake_ref as f;\n\n    #[test]\n    fn test_flake_url_schemas() {\n        assert_eq!(\n            f(\"https://example.com\", Some(\"dev\"), Some(\"123\")).unwrap(),\n            \"git+https://example.com?rev=123\"\n        );\n        assert_eq!(\n            f(\"https://example.com\", None, Some(\"123\")).unwrap(),\n            \"git+https://example.com?rev=123\"\n        );\n        assert_eq!(\n            f(\"https://example.com\", Some(\"dev\"), None).unwrap(),\n            \"git+https://example.com?ref=dev\"\n        );\n        assert_eq!(\n            f(\"https://example.com\", None, None).unwrap(),\n            \"git+https://example.com\"\n        );\n\n        assert_eq!(\n            f(\"http://example.com\", None, None).unwrap(),\n            \"git+http://example.com\"\n        );\n        assert_eq!(\n            f(\"git+https://example.com\", None, None).unwrap(),\n            \"git+https://example.com\"\n        );\n        assert_eq!(\n            f(\"git://example.com\", None, None).unwrap(),\n            \"git://example.com\"\n        );\n        assert_eq!(\n            f(\"git+git://example.com\", None, None).unwrap(),\n            \"git://example.com\"\n        );\n        assert_eq!(\n            f(\"git+ssh://git@github.com/foo/bar\", None, None).unwrap(),\n            \"git+ssh://git@github.com/foo/bar\"\n        );\n        f(\"ws://example.com\", None, None).unwrap_err();\n    }\n\n    #[test]\n    fn test_flake_url_github() {\n        assert_eq!(\n            f(\"https://github.com/foo/bar\", Some(\"dev\"), Some(\"123\")).unwrap(),\n            \"github:foo/bar/123\"\n        );\n        assert_eq!(\n            f(\"https://github.com/foo/bar\", None, Some(\"123\")).unwrap(),\n            \"github:foo/bar/123\"\n        );\n        assert_eq!(\n            f(\"https://github.com/foo/bar\", Some(\"dev\"), None).unwrap(),\n            \"github:foo/bar/dev\"\n        );\n        assert_eq!(\n            f(\"https://github.com/foo/bar\", None, None).unwrap(),\n            \"github:foo/bar\"\n        );\n\n        assert_eq!(\n            f(\"https://github.com/foo/bar.git\", None, None).unwrap(),\n            \"github:foo/bar\"\n        );\n        assert_eq!(\n            f(\"https://github.com/foo/bar/\", None, None).unwrap(),\n            \"github:foo/bar\"\n        );\n        assert_eq!(\n            f(\"http://github.com/foo/bar.git\", None, None).unwrap(),\n            \"github:foo/bar\"\n        );\n        assert_eq!(\n            f(\"git+https://github.com/foo/bar.git\", None, None).unwrap(),\n            \"github:foo/bar\"\n        );\n    }\n}\n"
  },
  {
    "path": "noc/src/main.rs",
    "content": "use anyhow::Result;\nuse clap::Parser;\n\nmod init;\n\ntrait App {\n    fn run(self) -> Result<()>;\n}\n\n#[derive(Parser)]\n#[clap(version, about, long_about = None)]\nenum Args {\n    Init(init::Args),\n}\n\nimpl App for Args {\n    fn run(self) -> Result<()> {\n        match self {\n            Self::Init(args) => args.run(),\n        }\n    }\n}\n\nfn main() -> Result<()> {\n    Args::from_args().run()\n}\n"
  },
  {
    "path": "noc/templates/init-flake.nix",
    "content": "# See more usages of nocargo at https://github.com/oxalica/nocargo#readme\n{\n  {%- if let Some((pkg_name, _)) = main_pkg %}\n  description = \"Rust package {{ pkg_name|nix_escape }}\";\n  {%- else %}\n  description = \"My Rust packages\";\n  {%- endif %}\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs\";\n    flake-utils.url = \"github:numtide/flake-utils\";\n    nocargo = {\n      url = \"github:oxalica/nocargo\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n      # inputs.registry-crates-io.follows = \"registry-crates-io\";\n    };\n    # Optionally, you can override crates.io index to get cutting-edge packages.\n    # registry-crates-io = { url = \"github:rust-lang/crates.io-index\"; flake = false; };\n    {%- for (_, flake_ref) in registries %}\n    registry-{{ loop.index }} = { url = \"{{ flake_ref|nix_escape }}\"; flake = false; };\n    {%- endfor %}\n    {%- for (_, flake_ref) in git_srcs %}\n    git-{{ loop.index }} = { url = \"{{ flake_ref|nix_escape }}\"; flake = false; };\n    {%- endfor %}\n  };\n\n  outputs = { nixpkgs, flake-utils, nocargo, ... }@inputs:\n    flake-utils.lib.eachSystem [ \"x86_64-linux\" \"aarch64-linux\" ] (system:\n      let\n        ws = nocargo.lib.${system}.mkRustPackageOrWorkspace {\n          src = ./.;\n          {%- if !registries.is_empty() %}\n\n          # Referenced external registries other than crates.io.\n          extraRegistries = {\n            {%- for (source_id, _) in registries %}\n            \"{{ source_id|nix_escape }}\" = nocargo.lib.${system}.mkIndex inputs.registry-{{ loop.index }} {};\n            {%- endfor %}\n          };\n          {%- endif %}\n          {%- if !git_srcs.is_empty() %}\n\n          # Referenced external rust packages from git.\n          gitSrcs = {\n            {%- for (source_id, _) in git_srcs %}\n            \"{{ source_id|nix_escape }}\" = inputs.git-{{ loop.index }};\n            {%- endfor %}\n          };\n          {%- endif %}\n        };\n      in rec {\n        {%- if is_workspace %}\n        packages = {% if let Some((pkg_name, prod)) = main_pkg %}{\n          default = packages.{{ pkg_name|ident_or_str }}{% if prod.binary %}.bin{% endif %};\n        } // {% endif %}ws.release\n          // nixpkgs.lib.mapAttrs' (name: value: { name = \"${name}-dev\"; inherit value; }) ws.dev;\n        {%- else if let Some((pkg_name, prod)) = main_pkg %}\n        packages = {\n          default = packages.{{ pkg_name|ident_or_str }};\n          {{ pkg_name|ident_or_str }} = ws.release.{{ pkg_name|ident_or_str }}{% if prod.binary %}.bin{% endif %};\n          {{ pkg_name|ident_or_str }}-dev = ws.dev.{{ pkg_name|ident_or_str }}{% if prod.binary %}.bin{% endif %};\n        };\n        {%- endif %}\n      });\n}\n"
  },
  {
    "path": "scripts/cratesio-utils.py",
    "content": "#!/usr/bin/env nix-shell\n#!nix-shell -i python3 -p cargo \"python3.withPackages (ps: with ps; [ aiohttp toml ])\"\nfrom io import BytesIO\nfrom pathlib import Path\nfrom typing import Callable, Optional\nfrom typing_extensions import Self\nfrom urllib import request\nimport aiohttp\nimport argparse\nimport asyncio\nimport csv\nimport os\nimport re\nimport sqlite3\nimport subprocess\nimport sys\nimport tarfile\nimport toml\n\n# Check dependencies.\nsubprocess.check_call(['cargo', '--version'], stdout=subprocess.DEVNULL)\n\n# CRATE_TARBALL_URL = 'https://crates.io/api/v1/crates/{name}/{version}/download' # -> 302\nCRATE_TARBALL_URL = 'https://static.crates.io/crates/{name}/{name}-{version}.crate' # -> 200 application/gzip\n\nPOPULAR_CRATES_MANIFEST_PATH = Path(__file__).parent.parent / 'cache' / 'Cargo.toml'\nPROC_MACRO_LIST_PATH = Path(__file__).parent.parent / 'crates-io-override' / 'proc-macro.nix'\n\nCACHE_DIR = Path(os.environ.get('XDG_CACHE_HOME') or (Path.home() / '.cache')) / 'cratesio'\nCRATES_TOML_DIR = Path(os.environ.get('CRATES_TOML_DIR') or (CACHE_DIR / 'toml'))\n\ndef noisily(*args) -> None:\n    print(*args, file=sys.stderr)\n\nclass CratesioDB(sqlite3.Connection):\n    DB_URL = 'https://static.crates.io/db-dump.tar.gz'\n\n    DB_DIR = CACHE_DIR\n    DB_PATH = DB_DIR / 'db.sqlite'\n    MTIME_PATH = DB_DIR / 'mtime.txt'\n\n    INIT_SQL = r'''\n        PRAGMA journal_mode = off;\n        PRAGMA cache_size = -{cache_kb};\n\n        CREATE TABLE IF NOT EXISTS crates (\n            id INTEGER NOT NULL PRIMARY KEY,\n            name TEXT NOT NULL,\n            created_at TEXT NOT NULL,\n            updated_at TEXT NOT NULL,\n            downloads INTEGER NOT NULL\n        ) STRICT;\n        CREATE TABLE IF NOT EXISTS versions (\n            id INTEGER NOT NULL PRIMARY KEY,\n            crate_id INTEGER NOT NULL,\n            num TEXT NOT NULL,\n            updated_at TEXT NOT NULL,\n            created_at TEXT NOT NULL,\n            downloads INTEGER NOT NULL,\n            features TEXT NOT NULL,\n            yanked INTEGER NOT NULL,\n            license TEXT\n        ) STRICT;\n        CREATE TABLE IF NOT EXISTS version_downloads (\n            version_id INTEGER NOT NULL,\n            downloads INTEGER NOT NULL,\n            date TEXT NOT NULL,\n            PRIMARY KEY (version_id, date)\n        ) STRICT, WITHOUT ROWID;\n    '''\n\n    INIT_INDEX_SQL = r'''\n        CREATE INDEX IF NOT EXISTS versions_ix_crate_to_version ON versions\n            (crate_id, id);\n        ANALYZE;\n    '''\n\n    INSERTERS: dict[str, tuple[str, Callable[[dict[str, str]], tuple]]] = {\n        'crates.csv': (\n            'INSERT INTO crates VALUES (?,?,?,?,?)',\n            lambda row: (\n                int(row['id']),\n                row['name'],\n                row['created_at'],\n                row['updated_at'],\n                int(row['downloads']),\n            ),\n        ),\n        'versions.csv': (\n            'INSERT INTO versions VALUES (?,?,?,?,?,?,?,?,?)',\n            lambda row: (\n                int(row['id']),\n                int(row['crate_id']),\n                row['num'],\n                row['updated_at'],\n                row['created_at'],\n                int(row['downloads']),\n                row['features'],\n                row['yanked'] == 't',\n                row['license'],\n            ),\n        ),\n        'version_downloads.csv': (\n            'INSERT INTO version_downloads VALUES (?,?,?)',\n            lambda row: (\n                int(row['version_id']),\n                int(row['downloads']),\n                row['date'],\n            )\n        ),\n    }\n\n    def __init__(self, *, check: bool=True, cache_mb: int=1024) -> None:\n        assert not check or self.MTIME_PATH.exists(), 'Database not initialized, please run `sync` subcommand'\n        super().__init__(str(self.DB_PATH))\n        self.executescript(self.INIT_SQL.format(cache_kb=cache_mb * 1024))\n\n    @classmethod\n    def sync(cls, *, cache_mb: int=1024) -> None:\n        cls.DB_DIR.mkdir(exist_ok=True)\n        last_mtime = cls.MTIME_PATH.read_text() if cls.MTIME_PATH.exists() else None\n\n        noisily('Synchronizing database')\n        with request.urlopen(cls.DB_URL) as resp:\n            assert resp.status == 200, f'HTTP failure {resp.status}'\n            mtime: str = resp.headers['last-modified']\n            if mtime == last_mtime:\n                noisily(f'Database is up-to-date at {mtime}')\n                return\n\n            noisily(f'Fetching and importing database dump at {mtime}, previous at {last_mtime}')\n            cls.DB_PATH.unlink(missing_ok=True)\n            db = CratesioDB(check=False, cache_mb=cache_mb)\n\n            csv.field_size_limit(2 ** 30) # There are large fields.\n            with tarfile.open(fileobj=resp, mode='r|gz') as tar:\n                for member in tar:\n                    name = member.path.split('/')[-1]\n                    if name in cls.INSERTERS:\n                        sql, preprocessor = cls.INSERTERS[name]\n                        fileobj = tar.extractfile(member)\n                        assert fileobj is not None\n                        rdr = csv.DictReader(map(bytes.decode, fileobj))\n                        db.executemany(sql, map(preprocessor, rdr))\n\n            noisily(f'Creating indices')\n            db.executescript(cls.INIT_INDEX_SQL)\n            db.commit()\n            db.close()\n\n            cls.MTIME_PATH.write_text(mtime)\n            noisily('Database initialized')\n\ndef update_popular_crates(db: CratesioDB, *, time: str, limit: int) -> None:\n    class VersMajor(tuple):\n        RE_SEMVER = re.compile(r'^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$')\n\n        def __new__(cls: type[Self], s: str) -> Self:\n            m = cls.RE_SEMVER.match(s)\n            assert m is not None, f'Invalid semver: {s}'\n            maj, min, pat = map(int, (m[1], m[2], m[3]))\n            vers = (maj,) if maj else (maj, min) if min else (maj, min, pat)\n            return super().__new__(cls, vers)\n\n        def __str__(self) -> str:\n            return '.'.join(map(str, self))\n\n        # Reversed.\n        def __lt__(self, rhs: Self) -> bool:\n            return super().__gt__(rhs)\n\n    noisily('Querying database')\n    cursor = db.cursor()\n    cursor.execute('''\n        SELECT crates.name, versions.num\n        FROM version_downloads\n        JOIN versions ON versions.id == version_id\n        JOIN crates ON crates.id == versions.crate_id\n        WHERE version_downloads.date > DATE('now', ?)\n        GROUP BY version_id\n        ORDER BY SUM(version_downloads.downloads) DESC\n    ''', (time,))\n\n    crates_set: set[tuple[str, VersMajor]] = set()\n    for row in cursor:\n        crates_set.add((str(row[0]), VersMajor(row[1])))\n        if len(crates_set) == limit:\n            break\n\n    crates = sorted(crates_set)\n\n    noisily('======== Start of top crates')\n    for name, vers in crates:\n        noisily(name, vers)\n    noisily('======== End of top crates')\n\n    out_path = POPULAR_CRATES_MANIFEST_PATH\n    tmp_path = out_path.with_suffix('.tmp')\n    with out_path.open('r') as fin, tmp_path.open('w') as fout:\n        for line in fin:\n            fout.write(line)\n            if line.startswith('[dependencies]'):\n                break\n\n        last_name: Optional[str] = None\n        crate_idx = 1\n        for name, vers in crates:\n            if last_name != name:\n                crate_idx = 1\n                fout.write(f'{name} = \"{vers}\"\\n')\n            else:\n                crate_idx += 1\n                fout.write(f'{name}-{crate_idx} = {{ package = \"{name}\", version = \"{vers}\" }}\\n')\n            last_name = name\n    tmp_path.replace(out_path)\n\n    noisily('Updating lock file')\n    subprocess.check_call(['cargo', 'update', f'--manifest-path={out_path}'])\n\n    noisily('Verifying crates metadata')\n    subprocess.check_call(\n        ['cargo', 'metadata', f'--manifest-path={out_path}', '--format-version=1'],\n        stdout=subprocess.DEVNULL,\n    )\n\ndef list_popular_crates(db: CratesioDB, *, time: str, pat: Optional[str]) -> None:\n    noisily('Querying database')\n    cursor = db.cursor()\n    cursor.execute('''\n        SELECT crates.name, SUM(version_downloads.downloads) AS crate_downloads\n        FROM crates\n        JOIN versions ON versions.crate_id == crates.id\n        JOIN version_downloads ON version_downloads.version_id == versions.id\n        WHERE crates.name LIKE ? AND version_downloads.date > DATE('now', ?)\n        GROUP BY versions.crate_id\n        ORDER BY crate_downloads DESC\n    ''', (pat if pat is not None else '%', time))\n    try:\n        for row in cursor:\n            print(row[0], row[1])\n    except BrokenPipeError as _:\n        # Suppress backtrace.\n        exit(1)\n\ndef update_proc_macro_crates(db: CratesioDB, *, concurrency: int) -> None:\n    CRATES_TOML_DIR.mkdir(exist_ok=True)\n\n    noisily('Querying database')\n    cursor = db.cursor()\n    cursor.execute('''\n        SELECT crates.name, versions.num AS max_vers, MAX(versions.created_at)\n        FROM versions\n        JOIN crates ON crates.id == crate_id\n        WHERE NOT yanked\n        GROUP BY crate_id\n        ORDER BY crates.name ASC\n    ''')\n\n    RE_ITEMS = re.compile(r'\"([^\"]*)\"', re.S)\n    proc_macro_crates: set[str] = set(m[1] for m in RE_ITEMS.finditer(PROC_MACRO_LIST_PATH.read_text()))\n\n    async def load_or_fetch(sema: asyncio.Semaphore, name: str, version: str) -> None:\n        try:\n            out_path = CRATES_TOML_DIR / f'{name}.toml'\n            if not out_path.exists():\n                noisily(f'GET {name} {version}')\n                url = CRATE_TARBALL_URL.format(name=name, version=version)\n                async with aiohttp.request(method='GET', url=url) as resp:\n                    resp.raise_for_status()\n                    data = await resp.read()\n\n                with tarfile.open(mode='r|gz', fileobj=BytesIO(data)) as tar:\n                    for member in tar:\n                        segments = member.path.split('/')\n                        if len(segments) == 2 and segments[-1] == 'Cargo.toml':\n                            f = tar.extractfile(member)\n                            assert f is not None\n                            tmp_path = out_path.with_suffix('.tmp')\n                            tmp_path.write_bytes(f.read())\n                            tmp_path.replace(out_path)\n                            break\n                    else:\n                        assert False, 'No Cargo.toml found'\n        except (aiohttp.ClientError, tarfile.TarError, UnicodeDecodeError, AssertionError) as exc:\n            print(f'For {name} {version}: {exc}', file=sys.stderr)\n            return\n        finally:\n            sema.release()\n\n        try:\n            # Must exist if we are here.\n            with open(out_path, 'r') as fin:\n                manifest = toml.load(fin)\n            lib = manifest.get('lib', {})\n            if isinstance(lib, dict) and lib.get('proc-macro', False) is True:\n                proc_macro_crates.add(name)\n        except (UnicodeDecodeError, toml.TomlDecodeError) as exc:\n            print(f'For cached {name}: {exc}', file=sys.stderr)\n            return\n\n    async def proc() -> None:\n        sema = asyncio.Semaphore(concurrency)\n        for row in cursor:\n            name: str = row[0]\n            vers: str = row[1]\n            await sema.acquire()\n            asyncio.create_task(load_or_fetch(sema, name, vers))\n\n        # Wait until all done.\n        for _ in range(concurrency):\n            await sema.acquire()\n\n    noisily('Retrieving metadata')\n    asyncio.run(proc())\n\n    noisily(f'Writing to {PROC_MACRO_LIST_PATH}')\n    with PROC_MACRO_LIST_PATH.open('w') as fout:\n        fout.write('[\\n')\n        for name in sorted(proc_macro_crates):\n            assert '\"' not in name\n            fout.write(f'\"{name}\"\\n')\n        fout.write(']\\n')\n\ndef main() -> None:\n    parser = argparse.ArgumentParser(description='Metadata updater and utilities using crates.io database dump')\n    parser.add_argument('--cache-mb', type=int, required=False, default=1024, help='Sqlite cache size in MiB')\n    subparser = parser.add_subparsers(required=True)\n\n    p = subparser.add_parser('sync', help='Synchronize or initialize the database')\n    p.set_defaults(sync=True)\n\n    p = subparser.add_parser('update-popular-crates', help='Update popular crates cache')\n    p.add_argument('--limit', type=int, required=False, default=256, help='Number of top crates to cache')\n    p.add_argument('--time', type=str, default='-90 days', help='Time period to count recent downloads')\n    p.set_defaults(fn=update_popular_crates)\n\n    p = subparser.add_parser('list-popular-crates', help='Print popular crates with download counts in a given period')\n    p.add_argument('--time', type=str, default='-90 days', help='Time period to count recent downloads')\n    p.add_argument('--pat', type=str, default=None, help='Crate name pattern to filter for SQL \"LIKE\"')\n    p.set_defaults(fn=list_popular_crates)\n\n    p = subparser.add_parser('update-proc-macro-crates', help='Update the list of proc-macro crates')\n    p.add_argument('--concurrency', type=int, default=16, help='Connection concurrency')\n    p.set_defaults(fn=update_proc_macro_crates)\n\n    args = parser.parse_args()\n    if 'sync' in args:\n        CratesioDB.sync(cache_mb=args.cache_mb)\n    else:\n        subargs = vars(args)\n        with CratesioDB(cache_mb=subargs.pop('cache_mb')) as db:\n            subargs.pop('fn')(db, **subargs)\n\nmain()\n"
  },
  {
    "path": "tests/build-deps/Cargo.toml",
    "content": "[package]\nname = \"build-deps\"\nversion = \"0.0.0\"\nedition = \"2015\"\n\n[build-dependencies]\nsemver = \"1\"\n"
  },
  {
    "path": "tests/build-deps/build.rs",
    "content": "fn main() {\n    let s = semver::Version::new(1, 2, 3).to_string();\n    println!(\"cargo:rustc-cfg=result={:?}\", s);\n}\n"
  },
  {
    "path": "tests/build-deps/src/main.rs",
    "content": "#[cfg(result = \"1.2.3\")]\nfn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/build-feature-env-vars/Cargo.toml",
    "content": "[package]\nname = \"build-feature-env-vars\"\nversion = \"0.0.0\"\nedition = \"2015\"\n\n[features]\ndefault = [\"foo-bar\"]\nfoo-bar = []\nquux = []\n"
  },
  {
    "path": "tests/build-feature-env-vars/build.rs",
    "content": "use std::env::var;\n\nfn main() {\n    if var(\"CARGO_FEATURE_QUUX\").is_err() {\n        if let Ok(s) = var(\"CARGO_FEATURE_FOO_BAR\") {\n            println!(\"cargo:rustc-cfg=result={:?}\", s);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/build-feature-env-vars/src/main.rs",
    "content": "#[cfg(result = \"1\")]\nfn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/cap-lints/Cargo.toml",
    "content": "[package]\nname = \"cap-lints\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\n# error: use of deprecated associated function `try_lock::TryLock::<T>::try_lock_order`: This method is actually unsafe because it unsafely allows the use of weaker memory ordering. Please use try_lock_explicit instead\n#    --> src/lib.rs:209:63\n#     |\n# 209 |                     if let Some(mut locked) = self.inner.task.try_lock_order(SeqCst, SeqCst) {\n#     |                                                               ^^^^^^^^^^^^^^\n#     |\n# note: the lint level is defined here\n#    --> src/lib.rs:2:9\n#     |\n# 2   | #![deny(warnings)]\n#     |         ^^^^^^^^\n#     = note: `#[deny(deprecated)]` implied by `#[deny(warnings)]`\n#\n# https://github.com/seanmonstar/want/blob/v0.3.0/src/lib.rs#L352\nwant = \"=0.3.0\"\n"
  },
  {
    "path": "tests/cap-lints/src/main.rs",
    "content": "fn main() {\n    let _ = want::new();\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/crate-names/Cargo.toml",
    "content": "[package]\nname = \"crate-names\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\nb = \"=0.2.0\"\ncc = \"=1.0.73\"\nfnv = \"=1.0.7\"\nRustyXML = \"=0.3.0\" # Should be lowered.\n"
  },
  {
    "path": "tests/crate-names/src/main.rs",
    "content": "use std::hash::Hasher;\n\nfn main() {\n    assert_eq!(b::B, \"🅱️\");\n    let _ = cc::Build::new();\n    assert_eq!(fnv::FnvHasher::with_key(42).finish(), 42);\n    assert_eq!(xml::escape(\"<\"), \"&lt;\");\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/custom-lib-name/Cargo.toml",
    "content": "[package]\nname = \"custom-lib-name\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[lib]\nname = \"custom\"\n\n[dependencies]\ncolor-rs = \"=0.6.1\"\nrenamed = { package = \"color-rs\", version = \"=0.5.0\" }\n"
  },
  {
    "path": "tests/custom-lib-name/src/lib.rs",
    "content": "pub fn custom() -> i32 {\n    42\n}\n"
  },
  {
    "path": "tests/custom-lib-name/src/main.rs",
    "content": "fn main() {\n    assert_eq!(color::consts::PURPLE, color::Rgb::new(0x80, 0x00, 0x80));\n    assert_eq!(renamed::consts::PURPLE, renamed::Rgb::new(0x80, 0x00, 0x80));\n    assert_eq!(custom::custom(), 42);\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/default.nix",
    "content": "{ pkgs, self, inputs, defaultRegistries }:\nlet\n  inherit (pkgs.lib) mapAttrs attrNames attrValues assertMsg head mapAttrsToList;\n  inherit (self.lib.${pkgs.system}) mkRustPackageOrWorkspace;\n  inherit (self.packages.${pkgs.system}) noc;\n\n  git-semver-1-0-0 = builtins.fetchTarball {\n    url = \"https://github.com/dtolnay/semver/archive/1.0.0/master.tar.gz\";\n    sha256 = \"0s7gwj5l0h98spgm7vyxak9z3hgrachwxbnf1fpry5diz939x8n4\";\n  };\n\n  git-semver-1-0-12 = builtins.fetchTarball {\n    url = \"https://github.com/dtolnay/semver/archive/1.0.4/master.tar.gz\";\n    sha256 = \"1l2nkfmjgz2zkqw03hmy66q0v1rxvs7fc4kh63ph4lf1924wrmix\";\n  };\n\n  gitSrcs = {\n    \"https://github.com/dtolnay/semver?tag=1.0.0\" = git-semver-1-0-0;\n    \"http://github.com/dtolnay/semver\" = git-semver-1-0-12; # v1, v2\n    \"http://github.com/dtolnay/semver?branch=master\" = git-semver-1-0-12; # v3\n    \"ssh://git@github.com/dtolnay/semver?rev=a2ce5777dcd455246e4650e36dde8e2e96fcb3fd\" = git-semver-1-0-0;\n    \"ssh://git@github.com/dtolnay/semver\" = git-semver-1-0-12;\n  };\n\n  extraRegistries = {\n    \"https://www.github.com/rust-lang/crates.io-index\" =\n      head (attrValues defaultRegistries);\n  };\n\n  shouldBeHelloWorld = drv: pkgs.runCommand \"${drv.name}\" {} ''\n    binaries=(${drv.bin}/bin/*)\n    [[ ''${#binaries[@]} == 1 ]]\n    got=\"$(''${binaries[0]})\"\n    expect=\"Hello, world!\"\n    echo \"Got   : $got\"\n    echo \"Expect: $expect\"\n    [[ \"$got\" == \"$expect\" ]]\n    touch $out\n  '';\n\n  mkHelloWorldTest = src:\n    let\n      ws = mkRustPackageOrWorkspace {\n        inherit src gitSrcs extraRegistries;\n      };\n      profiles = mapAttrs (_: pkgs: shouldBeHelloWorld (head (attrValues pkgs))) ws;\n    in {\n      inherit (profiles) dev release;\n    };\n\n  mkWorkspaceTest = src: expectMembers: let\n    ws = mkRustPackageOrWorkspace { inherit src; };\n    gotMembers = attrNames ws.dev;\n  in\n    assert assertMsg (gotMembers == expectMembers) ''\n      Member assertion failed.\n      expect: ${toString expectMembers}\n      got:    ${toString gotMembers}\n    '';\n    ws;\n\n  # Recursive Nix setup.\n  # https://github.com/NixOS/nixpkgs/blob/e966ab3965a656efdd40b6ae0d8cec6183972edc/pkgs/top-level/make-tarball.nix#L45-L48\n  mkGenInit = name: path:\n    pkgs.runCommand \"gen-${name}\" {\n      nativeBuildInputs = [ noc pkgs.nix ];\n      checkFlags =\n        mapAttrsToList (from: to: \"--override-input ${from} ${to}\") {\n          inherit (inputs) nixpkgs flake-utils;\n          nocargo = self;\n          \"nocargo/registry-crates-io\" = inputs.registry-crates-io;\n          registry-1 = inputs.registry-crates-io;\n          git-1 = git-semver-1-0-0;\n          git-2 = git-semver-1-0-0;\n          git-3 = git-semver-1-0-0;\n          git-4 = git-semver-1-0-0;\n        };\n    } ''\n      cp -r ${path} src\n      chmod -R u+w src\n      cd src\n\n      echo \"generating flake.nix\"\n      noc init\n      cat flake.nix\n      install -D flake.nix $out/flake.nix\n\n      echo \"checking with 'nix flake check'\"\n      export NIX_STATE_DIR=$TMPDIR/nix/var\n      export NIX_PATH=\n      export HOME=$TMPDIR\n      nix-store --init\n      nixFlags=(\n        --offline\n        --option build-users-group \"\"\n        --option experimental-features \"ca-derivations nix-command flakes\"\n        --store $TMPDIR/nix/store\n      )\n\n      nix flake check \\\n        --no-build \\\n        --show-trace \\\n        $checkFlags \\\n        \"''${nixFlags[@]}\"\n    '';\n\nin\n{\n  _1000-hello-worlds = mapAttrs (name: path: mkHelloWorldTest path) {\n    build-deps = ./build-deps;\n    build-feature-env-vars = ./build-feature-env-vars;\n    cap-lints = ./cap-lints;\n    crate-names = ./crate-names;\n    custom-lib-name = ./custom-lib-name;\n    dependency-v1 = ./dependency-v1;\n    dependency-v2 = ./dependency-v2;\n    dependency-v3 = ./dependency-v3;\n    features = ./features;\n    libz-dynamic = ./libz-dynamic;\n    libz-static = ./libz-static;\n    lto-fat = ./lto-fat;\n    lto-proc-macro = ./lto-proc-macro;\n    lto-thin = ./lto-thin;\n    tokio-app = ./tokio-app;\n  } // {\n    workspace-inline = mkWorkspaceTest ./workspace-inline [ \"bar\" \"baz\" \"foo\" ];\n    workspace-proc-macro-lto = mkWorkspaceTest ./workspace-proc-macro-lto [ \"acro\" \"procm\" ];\n    workspace-virtual = mkWorkspaceTest ./workspace-virtual [ \"bar\" \"foo\" ];\n  };\n\n  _1100-gen-init = mapAttrs mkGenInit {\n    dependency-v1 = ./dependency-v1;\n    dependency-v2 = ./dependency-v2;\n    dependency-v3 = ./dependency-v3;\n    features = ./features;\n\n    workspace-virtual = ./workspace-virtual;\n    workspace-inline = ./workspace-inline;\n  };\n}\n"
  },
  {
    "path": "tests/dependency-v1/Cargo.toml",
    "content": "[package]\nname = \"dependencies\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\ncratesio = { package = \"semver\", version = \"1\" }\nregistry-index = { package = \"semver\", version = \"1\", registry-index = \"https://www.github.com/rust-lang/crates.io-index\" }\ngit-tag = { package = \"semver\", git = \"https://github.com/dtolnay/semver\", tag = \"1.0.0\" }\ngit-branch = { package = \"semver\", git = \"http://github.com/dtolnay/semver\", branch = \"master\" }\ngit-rev = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\", rev = \"a2ce5777dcd455246e4650e36dde8e2e96fcb3fd\" }\ngit-head = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\" }\n"
  },
  {
    "path": "tests/dependency-v1/README.md",
    "content": "This `Cargo.lock` is generated by rust 1.37.0.\n"
  },
  {
    "path": "tests/dependency-v1/src/main.rs",
    "content": "fn main() {\n    cratesio::Version::parse(\"1.2.3\").unwrap();\n    registry_index::Version::parse(\"1.2.3\").unwrap();\n    git_tag::Version::parse(\"1.2.3\").unwrap();\n    git_branch::Version::parse(\"1.2.3\").unwrap();\n    git_rev::Version::parse(\"1.2.3\").unwrap();\n    git_head::Version::parse(\"1.2.3\").unwrap();\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/dependency-v2/Cargo.toml",
    "content": "[package]\nname = \"dependencies\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\ncratesio = { package = \"semver\", version = \"1\" }\nregistry-index = { package = \"semver\", version = \"1\", registry-index = \"https://www.github.com/rust-lang/crates.io-index\" }\ngit-tag = { package = \"semver\", git = \"https://github.com/dtolnay/semver\", tag = \"1.0.0\" }\ngit-branch = { package = \"semver\", git = \"http://github.com/dtolnay/semver\", branch = \"master\" }\ngit-rev = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\", rev = \"a2ce5777dcd455246e4650e36dde8e2e96fcb3fd\" }\ngit-head = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\" }\n"
  },
  {
    "path": "tests/dependency-v2/README.md",
    "content": "This `Cargo.lock` is generated by rust 1.41.0.\n"
  },
  {
    "path": "tests/dependency-v2/src/main.rs",
    "content": "fn main() {\n    cratesio::Version::parse(\"1.2.3\").unwrap();\n    registry_index::Version::parse(\"1.2.3\").unwrap();\n    git_tag::Version::parse(\"1.2.3\").unwrap();\n    git_branch::Version::parse(\"1.2.3\").unwrap();\n    git_rev::Version::parse(\"1.2.3\").unwrap();\n    git_head::Version::parse(\"1.2.3\").unwrap();\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/dependency-v3/Cargo.toml",
    "content": "[package]\nname = \"dependencies\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\ncratesio = { package = \"semver\", version = \"1\" }\nregistry-index = { package = \"semver\", version = \"1\", registry-index = \"https://www.github.com/rust-lang/crates.io-index\" }\ngit-tag = { package = \"semver\", git = \"https://github.com/dtolnay/semver\", tag = \"1.0.0\" }\ngit-branch = { package = \"semver\", git = \"http://github.com/dtolnay/semver\", branch = \"master\" }\ngit-rev = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\", rev = \"a2ce5777dcd455246e4650e36dde8e2e96fcb3fd\" }\ngit-head = { package = \"semver\", git = \"ssh://git@github.com/dtolnay/semver\" }\n"
  },
  {
    "path": "tests/dependency-v3/src/main.rs",
    "content": "fn main() {\n    cratesio::Version::parse(\"1.2.3\").unwrap();\n    registry_index::Version::parse(\"1.2.3\").unwrap();\n    git_tag::Version::parse(\"1.2.3\").unwrap();\n    git_branch::Version::parse(\"1.2.3\").unwrap();\n    git_rev::Version::parse(\"1.2.3\").unwrap();\n    git_head::Version::parse(\"1.2.3\").unwrap();\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/fake-semver/Cargo.toml",
    "content": "# This crate is for tests in `support.nix` and will not be really built.\n[package]\nname = \"semver\"\nversion = \"1.0.0\"\nedition = \"2018\"\n\n[dependencies]\n"
  },
  {
    "path": "tests/fake-semver/src/lib.rs",
    "content": "\n"
  },
  {
    "path": "tests/features/Cargo.toml",
    "content": "[package]\nname = \"simple-features\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\nsemver = { version = \"1.0.12\", optional = true }\n\n[features]\ndefault = [ \"a\" ]\na = [\"default\", \"semver/serde\"]\nb = []\n"
  },
  {
    "path": "tests/features/src/main.rs",
    "content": "#[cfg(all(feature = \"a\", not(feature = \"b\")))]\nfn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/libz-dynamic/Cargo.toml",
    "content": "[package]\nname = \"libz-dynamic\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\nlibz-sys = { version = \"=1.1.6\", default-features = false }\n"
  },
  {
    "path": "tests/libz-dynamic/build.rs",
    "content": "fn main() {\n    std::env::var(\"DEP_Z_INCLUDE\").expect_err(\"Dynamic linking should not set DEP_Z_INCLUDE\");\n    println!(\"cargo:rustc-env=OKAY=\");\n}\n"
  },
  {
    "path": "tests/libz-dynamic/src/main.rs",
    "content": "fn main() {\n    let crc_init = unsafe { libz_sys::crc32(0, \"foo\".as_ptr() as _, 3) };\n    assert_eq!(crc_init, 2356372769);\n    assert_eq!(env!(\"OKAY\"), \"\");\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/libz-static/Cargo.toml",
    "content": "[package]\nname = \"libz-static\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\nlibz-sys = { version = \"=1.1.3\", default-features = false, features = [\"static\"] }\n"
  },
  {
    "path": "tests/libz-static/build.rs",
    "content": "fn main() {\n    let z_include = std::env::var(\"DEP_Z_INCLUDE\").unwrap();\n    let header = std::fs::read_to_string(z_include + \"/zlib.h\").unwrap();\n    let mut lines = header.lines();\n    assert_eq!(\n        lines.next().unwrap(),\n        \"/* zlib.h -- interface of the 'zlib' general purpose compression library\"\n    );\n    assert_eq!(\n        lines.next().unwrap(),\n        \"  version 1.2.11, January 15th, 2017\",\n        \"bundled libz MUST be 1.2.11\",\n    );\n    println!(\"cargo:rustc-env=OKAY=\");\n}\n"
  },
  {
    "path": "tests/libz-static/src/lib.rs",
    "content": "// Only available in the build script.\nconst _: [(); 1] = [(); option_env!(\"DEP_Z_INCLUDE\").is_none() as usize];\n"
  },
  {
    "path": "tests/libz-static/src/main.rs",
    "content": "fn main() {\n    // Only available in the build script.\n    assert!(option_env!(\"DEP_Z_INCLUDE\").is_none());\n\n    let crc_init = unsafe { libz_sys::crc32(0, \"foo\".as_ptr() as _, 3) };\n    assert_eq!(crc_init, 2356372769);\n    assert_eq!(env!(\"OKAY\"), \"\");\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/lto-fat/Cargo.toml",
    "content": "[package]\nname = \"lto-fat\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\nsemver = \"1\"\n\n[profile.release]\nlto = \"fat\"\n"
  },
  {
    "path": "tests/lto-fat/src/main.rs",
    "content": "fn main() {\n    assert_eq!(\n        semver::Version::parse(\"1.2.3\").unwrap().to_string(),\n        \"1.2.3\"\n    );\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/lto-proc-macro/Cargo.toml",
    "content": "[package]\nname = \"lto-proc-macro\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\nthiserror = \"1\"\n\n[profile.release]\nlto = \"thin\"\n"
  },
  {
    "path": "tests/lto-proc-macro/src/main.rs",
    "content": "#[derive(Debug, thiserror::Error)]\nenum Error {\n    #[error(\"Hello, {0}!\")]\n    Hello(&'static str),\n}\n\nfn main() {\n    println!(\"{}\", Error::Hello(\"world\"));\n}\n"
  },
  {
    "path": "tests/lto-thin/Cargo.toml",
    "content": "[package]\nname = \"lto-thin\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\nsemver = \"1\"\n\n[profile.release]\nlto = \"thin\"\n"
  },
  {
    "path": "tests/lto-thin/src/main.rs",
    "content": "fn main() {\n    assert_eq!(\n        semver::Version::parse(\"1.2.3\").unwrap().to_string(),\n        \"1.2.3\"\n    );\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/tokio-app/Cargo.toml",
    "content": "[package]\nname = \"tokio-app\"\nversion = \"0.0.0\"\nedition = \"2018\"\n\n[dependencies]\ntokio = { version = \"1\", features = [ \"rt-multi-thread\", \"macros\", \"time\" ], default-features = false }\n"
  },
  {
    "path": "tests/tokio-app/src/main.rs",
    "content": "#[tokio::main]\nasync fn main() {\n    tokio::time::sleep(std::time::Duration::from_millis(100)).await;\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/workspace-inline/Cargo.toml",
    "content": "[package]\nname = \"foo\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\nbar = { path = \"bar\" }\n\n[workspace]\nmembers = [\".\", \"b*\"]\n"
  },
  {
    "path": "tests/workspace-inline/bar/Cargo.toml",
    "content": "[package]\nname = \"bar\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\n"
  },
  {
    "path": "tests/workspace-inline/bar/src/lib.rs",
    "content": "pub fn hello() -> &'static str {\n    \"Hello\"\n}\n"
  },
  {
    "path": "tests/workspace-inline/baz/Cargo.toml",
    "content": "[package]\nname = \"baz\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\nbar = { path = \"../bar\" }\n"
  },
  {
    "path": "tests/workspace-inline/baz/src/lib.rs",
    "content": "pub fn show(s: String) {\n    assert!(s.starts_with(bar::hello()));\n    println!(\"{}\", s);\n}\n"
  },
  {
    "path": "tests/workspace-inline/src/main.rs",
    "content": "fn main() {\n    println!(\"{}, world!\", bar::hello());\n}\n"
  },
  {
    "path": "tests/workspace-proc-macro-lto/Cargo.toml",
    "content": "[package]\nname = \"acro\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\nprocm = { path = \"./procm\" }\n\n[workspace]\n# FIXME: \".\" is required.\nmembers = [\"procm\", \".\"]\n\n[profile.release]\nlto = \"thin\"\n"
  },
  {
    "path": "tests/workspace-proc-macro-lto/procm/Cargo.toml",
    "content": "[package]\nname = \"procm\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[lib]\nproc-macro = true\n"
  },
  {
    "path": "tests/workspace-proc-macro-lto/procm/src/lib.rs",
    "content": "use proc_macro::TokenStream;\n\n#[proc_macro]\npub fn acro(input: TokenStream) -> TokenStream {\n    format!(r#\"fn main() {{ println!({}) }}\"#, input).parse().unwrap()\n}\n"
  },
  {
    "path": "tests/workspace-proc-macro-lto/src/lib.rs",
    "content": "procm::acro!(\"Hello, world!\");\n"
  },
  {
    "path": "tests/workspace-virtual/Cargo.toml",
    "content": "[workspace]\nmembers = [ \"./crates/*\" ]\nexclude = [ \"./crates/./exc\" ]\n"
  },
  {
    "path": "tests/workspace-virtual/crates/bar/Cargo.toml",
    "content": "[package]\nname = \"bar\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\n"
  },
  {
    "path": "tests/workspace-virtual/crates/bar/src/lib.rs",
    "content": "pub fn world() -> &'static str {\n    \"world\"\n}\n"
  },
  {
    "path": "tests/workspace-virtual/crates/exc/Cargo.toml",
    "content": "[package]\nname = \"exc\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\n"
  },
  {
    "path": "tests/workspace-virtual/crates/exc/src/main.rs",
    "content": "fn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "tests/workspace-virtual/crates/foo/Cargo.toml",
    "content": "[package]\nname = \"foo\"\nversion = \"0.1.0\"\nedition = \"2018\"\n\n[dependencies]\nbar = { path = \"../bar\" }\n"
  },
  {
    "path": "tests/workspace-virtual/crates/foo/src/main.rs",
    "content": "fn main() {\n    println!(\"Hello, {}!\", bar::world());\n}\n"
  },
  {
    "path": "toml2json/Cargo.toml",
    "content": "[package]\nname = \"toml2json\"\nversion = \"1.0.0\"\nrust-version = \"1.36\"\n\n[dependencies]\nserde_json = \"1.0.0\"\ntoml = \"0.5\"\n"
  },
  {
    "path": "toml2json/README.md",
    "content": "## toml2json: minimal impl for toml -> json\n\nThis utility program is a dependency of every rust crate derivation.\nThus it's is designed to be simple and have minimal dependencies, instead of using `remarshal` which\npulls in tons of python packages.\n"
  },
  {
    "path": "toml2json/default.nix",
    "content": "{ stdenv, fetchurl, rustc }:\nlet\n  fetch = name: version: sha256:\n    fetchurl {\n      name = \"crate-${name}-${version}.tar.gz\";\n      url = \"https://crates.io/api/v1/crates/${name}/${version}/download\";\n      inherit sha256;\n    };\n\n  manifest = builtins.fromTOML (builtins.readFile ./Cargo.toml);\n  lock = builtins.fromTOML (builtins.readFile ./Cargo.lock);\n\nin stdenv.mkDerivation {\n  pname = manifest.package.name;\n  version = manifest.package.version;\n\n  srcs = map ({ name, version, checksum ? null, ... }: if checksum != null then fetch name version checksum else null) lock.package;\n\n  sourceRoot = \".\";\n\n  nativeBuildInputs = [ rustc ];\n\n  buildPhase = ''\n    buildFlagsArray+=(\n      --color=always\n      --out-dir .\n      -L .\n      -C codegen-units=1\n      -C opt-level=3\n      --cap-lints allow\n    )\n\n    run() {\n      echo \"rustc $* ''${buildFlagsArray[*]}\"\n      rustc \"$@\" \"''${buildFlagsArray[@]}\"\n    }\n\n    run itoa-*/src/lib.rs --crate-name itoa --crate-type lib \\\n      --cfg 'feature=\"default\"' --cfg 'feature=\"std\"'\n    run ryu-*/src/lib.rs --crate-name ryu --crate-type lib\n    run serde-*/src/lib.rs --crate-name serde --crate-type lib \\\n      --cfg 'feature=\"default\"' --cfg 'feature=\"std\"'\n    run serde_json-*/src/lib.rs --crate-name serde_json --crate-type lib \\\n      --edition=2018 \\\n      --cfg 'feature=\"default\"' --cfg 'feature=\"std\"' \\\n      --extern itoa=libitoa.rlib \\\n      --extern ryu=libryu.rlib \\\n      --extern serde=libserde.rlib\n    run toml-*/src/lib.rs --crate-name toml --crate-type lib \\\n      --edition=2018 \\\n      --extern serde=libserde.rlib\n    run ${./src/main.rs} --crate-name toml2json --crate-type bin \\\n      --extern serde_json=./libserde_json.rlib \\\n      --extern toml=libtoml.rlib\n  '';\n\n  testToml = ''\n    [hello]\n    world = \"good\"\n    [target.\"cfg(target = \\\"good\\\")\"]\n    foo = \"bar\"\n  '';\n\n  testJson = ''{\"hello\":{\"world\":\"good\"},\"target\":{\"cfg(target = \\\"good\\\")\":{\"foo\":\"bar\"}}}'';\n\n  doCheck = true;\n  checkPhase = ''\n    ./toml2json <<<\"$testToml\" >out.json\n    echo \"Got   : $(cat out.json)\"\n    echo \"Expect: $testJson\"\n    [[ \"$(cat out.json)\" == \"$testJson\" ]]\n  '';\n\n  installPhase = ''\n    mkdir -p $out/bin\n    cp -t $out/bin ./toml2json\n  '';\n}\n"
  },
  {
    "path": "toml2json/src/main.rs",
    "content": "use std::io::{stdin, stdout, Read, Write};\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    let mut input = Vec::new();\n    stdin().lock().read_to_end(&mut input)?;\n    let data: serde_json::Value = toml::from_slice(&input)?;\n    let mut output = serde_json::to_vec(&data)?;\n    output.push(b'\\n');\n    stdout().lock().write_all(&output)?;\n    Ok(())\n}\n"
  }
]