├── .appends └── .github │ └── labels.yml ├── .dockerignore ├── .github ├── CODEOWNERS ├── dependabot.yml ├── labels.yml └── workflows │ ├── ci.yml │ ├── deploy.yml │ ├── pause-community-contributions.yml │ ├── ping-cross-track-maintainers-team.yml │ └── sync-labels.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── bin ├── run-in-docker.sh ├── run-tests-in-docker.sh ├── run-tests.sh └── run.sh ├── local-registry ├── Cargo.lock ├── Cargo.toml └── dummy.rs ├── snippets ├── no_comments │ ├── Cargo.toml │ ├── expected_analysis.json │ └── src │ │ └── lib.rs ├── one_comment │ ├── Cargo.toml │ ├── expected_analysis.json │ └── src │ │ └── lib.rs ├── two_comments │ ├── Cargo.toml │ ├── expected_analysis.json │ └── src │ │ └── lib.rs └── with_dependency │ ├── Cargo.toml │ ├── expected_analysis.json │ └── src │ └── lib.rs └── src ├── lib.rs └── main.rs /.appends/.github/labels.yml: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------------------- # 2 | # These are the repository-specific labels that augment the Exercise-wide labels defined in # 3 | # https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml. # 4 | # ----------------------------------------------------------------------------------------- # 5 | 6 | - name: "bug" 7 | description: "Something isn't working" 8 | color: "d73a4a" 9 | 10 | - name: "duplicate" 11 | description: "This issue or pull request already exists" 12 | color: "cfd3d7" 13 | 14 | - name: "enhancement" 15 | description: "New feature or request" 16 | color: "a2eeef" 17 | 18 | - name: "good first issue" 19 | description: "Good for newcomers" 20 | color: "7057ff" 21 | 22 | - name: "help wanted" 23 | description: "Extra attention is needed" 24 | color: "008672" 25 | 26 | - name: "invalid" 27 | description: "This doesn't seem right" 28 | color: "e4e669" 29 | 30 | - name: "question" 31 | description: "Further information is requested" 32 | color: "d876e3" 33 | 34 | - name: "wontfix" 35 | description: "This will not be worked on" 36 | color: "ffffff" 37 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | **/*.rs.bk 3 | *.swp 4 | .git/ 5 | .appends 6 | .github 7 | .gitignore 8 | .gitattributes 9 | .dockerignore 10 | Dockerfile 11 | bin/ 12 | !bin/run.sh 13 | snippets/ 14 | tests/ 15 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @exercism/guardians 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | updates: 4 | # Keep dependencies for GitHub Actions up-to-date 5 | - package-ecosystem: 'github-actions' 6 | directory: '/' 7 | schedule: 8 | interval: 'monthly' 9 | labels: 10 | - 'x:size/small' 11 | - package-ecosystem: 'cargo' 12 | directory: '/local-registry' 13 | schedule: 14 | interval: 'monthly' 15 | groups: 16 | all: 17 | patterns: 18 | - "*" 19 | labels: 20 | - 'x:rep/tiny' 21 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | # --------------------------------------------------------------- # 2 | # This is an auto-generated file - Do not manually edit this file # 3 | # --------------------------------------------------------------- # 4 | 5 | # This file is automatically generated by concatenating two files: 6 | # 7 | # 1. The Exercism-wide labels: defined in https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml 8 | # 2. The repository-specific labels: defined in the `.appends/.github/labels.yml` file within this repository. 9 | # 10 | # If any of these two files change, a pull request is automatically created containing a re-generated version of this file. 11 | # Consequently, to change repository-specific labels you should update the `.appends/.github/labels.yml` file and _not_ this file. 12 | # 13 | # When the pull request has been merged, the GitHub labels will be automatically updated by the "Sync labels" workflow. 14 | # This typically takes 5-10 minutes. 15 | 16 | # --------------------------------------------------------------------- # 17 | # These are the Exercism-wide labels which are shared across all repos. # 18 | # --------------------------------------------------------------------- # 19 | 20 | # The following Exercism-wide labels are used to show "tasks" on the website, which will point users to things they can contribute to. 21 | 22 | # The `x:action/` labels describe what sort of work the contributor will be engaged in when working on the issue 23 | - name: "x:action/create" 24 | description: "Work on something from scratch" 25 | color: "ffffff" 26 | 27 | - name: "x:action/fix" 28 | description: "Fix an issue" 29 | color: "ffffff" 30 | 31 | - name: "x:action/improve" 32 | description: "Improve existing functionality/content" 33 | color: "ffffff" 34 | 35 | - name: "x:action/proofread" 36 | description: "Proofread text" 37 | color: "ffffff" 38 | 39 | - name: "x:action/sync" 40 | description: "Sync content with its latest version" 41 | color: "ffffff" 42 | 43 | # The `x:knowledge/` labels describe how much Exercism knowledge is required by the contributor 44 | - name: "x:knowledge/none" 45 | description: "No existing Exercism knowledge required" 46 | color: "ffffff" 47 | 48 | - name: "x:knowledge/elementary" 49 | description: "Little Exercism knowledge required" 50 | color: "ffffff" 51 | 52 | - name: "x:knowledge/intermediate" 53 | description: "Quite a bit of Exercism knowledge required" 54 | color: "ffffff" 55 | 56 | - name: "x:knowledge/advanced" 57 | description: "Comprehensive Exercism knowledge required" 58 | color: "ffffff" 59 | 60 | # The `x:module/` labels indicate what part of Exercism the contributor will be working on 61 | - name: "x:module/analyzer" 62 | description: "Work on Analyzers" 63 | color: "ffffff" 64 | 65 | - name: "x:module/concept" 66 | description: "Work on Concepts" 67 | color: "ffffff" 68 | 69 | - name: "x:module/concept-exercise" 70 | description: "Work on Concept Exercises" 71 | color: "ffffff" 72 | 73 | - name: "x:module/generator" 74 | description: "Work on Exercise generators" 75 | color: "ffffff" 76 | 77 | - name: "x:module/practice-exercise" 78 | description: "Work on Practice Exercises" 79 | color: "ffffff" 80 | 81 | - name: "x:module/representer" 82 | description: "Work on Representers" 83 | color: "ffffff" 84 | 85 | - name: "x:module/test-runner" 86 | description: "Work on Test Runners" 87 | color: "ffffff" 88 | 89 | # The `x:rep/` labels describe the amount of reputation to award 90 | # 91 | # For more information on reputation and how these labels should be used, 92 | # check out https://exercism.org/docs/using/product/reputation 93 | - name: "x:rep/tiny" 94 | description: "Tiny amount of reputation" 95 | color: "ffffff" 96 | 97 | - name: "x:rep/small" 98 | description: "Small amount of reputation" 99 | color: "ffffff" 100 | 101 | - name: "x:rep/medium" 102 | description: "Medium amount of reputation" 103 | color: "ffffff" 104 | 105 | - name: "x:rep/large" 106 | description: "Large amount of reputation" 107 | color: "ffffff" 108 | 109 | - name: "x:rep/massive" 110 | description: "Massive amount of reputation" 111 | color: "ffffff" 112 | 113 | # The `x:size/` labels describe the expected amount of work for a contributor 114 | - name: "x:size/tiny" 115 | description: "Tiny amount of work" 116 | color: "ffffff" 117 | 118 | - name: "x:size/small" 119 | description: "Small amount of work" 120 | color: "ffffff" 121 | 122 | - name: "x:size/medium" 123 | description: "Medium amount of work" 124 | color: "ffffff" 125 | 126 | - name: "x:size/large" 127 | description: "Large amount of work" 128 | color: "ffffff" 129 | 130 | - name: "x:size/massive" 131 | description: "Massive amount of work" 132 | color: "ffffff" 133 | 134 | # The `x:status/` label indicates if there is already someone working on the issue 135 | - name: "x:status/claimed" 136 | description: "Someone is working on this issue" 137 | color: "ffffff" 138 | 139 | # The `x:type/` labels describe what type of work the contributor will be engaged in 140 | - name: "x:type/ci" 141 | description: "Work on Continuous Integration (e.g. GitHub Actions workflows)" 142 | color: "ffffff" 143 | 144 | - name: "x:type/coding" 145 | description: "Write code that is not student-facing content (e.g. test-runners, generators, but not exercises)" 146 | color: "ffffff" 147 | 148 | - name: "x:type/content" 149 | description: "Work on content (e.g. exercises, concepts)" 150 | color: "ffffff" 151 | 152 | - name: "x:type/docker" 153 | description: "Work on Dockerfiles" 154 | color: "ffffff" 155 | 156 | - name: "x:type/docs" 157 | description: "Work on Documentation" 158 | color: "ffffff" 159 | 160 | # This Exercism-wide label is added to all automatically created pull requests that help migrate/prepare a track for Exercism v3 161 | - name: "v3-migration 🤖" 162 | description: "Preparing for Exercism v3" 163 | color: "e99695" 164 | 165 | # This Exercism-wide label can be used to bulk-close issues in preparation for pausing community contributions 166 | - name: "paused" 167 | description: "Work paused until further notice" 168 | color: "e4e669" 169 | 170 | # ----------------------------------------------------------------------------------------- # 171 | # These are the repository-specific labels that augment the Exercise-wide labels defined in # 172 | # https://github.com/exercism/org-wide-files/blob/main/global-files/.github/labels.yml. # 173 | # ----------------------------------------------------------------------------------------- # 174 | 175 | - name: "bug" 176 | description: "Something isn't working" 177 | color: "d73a4a" 178 | 179 | - name: "duplicate" 180 | description: "This issue or pull request already exists" 181 | color: "cfd3d7" 182 | 183 | - name: "enhancement" 184 | description: "New feature or request" 185 | color: "a2eeef" 186 | 187 | - name: "good first issue" 188 | description: "Good for newcomers" 189 | color: "7057ff" 190 | 191 | - name: "help wanted" 192 | description: "Extra attention is needed" 193 | color: "008672" 194 | 195 | - name: "invalid" 196 | description: "This doesn't seem right" 197 | color: "e4e669" 198 | 199 | - name: "question" 200 | description: "Further information is requested" 201 | color: "d876e3" 202 | 203 | - name: "wontfix" 204 | description: "This will not be worked on" 205 | color: "ffffff" 206 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | push: 8 | branches: 9 | - main 10 | 11 | jobs: 12 | build: 13 | name: Tests 14 | runs-on: ubuntu-22.04 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 18 | 19 | - name: Set up Docker Buildx 20 | uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 21 | with: 22 | install: true 23 | 24 | - name: Build Docker image and store in cache 25 | uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 26 | with: 27 | context: . 28 | push: false 29 | load: true 30 | tags: exercism/rust-analyzer 31 | cache-from: type=gha 32 | cache-to: type=gha,mode=max 33 | 34 | - name: Run Tests in Docker 35 | run: bin/run-tests-in-docker.sh 36 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | build-and-push-image: 14 | if: github.repository_owner == 'exercism' # Stops this job from running on forks. 15 | uses: exercism/github-actions/.github/workflows/docker-build-push-image.yml@main 16 | secrets: 17 | AWS_ACCOUNT_ID: ${{secrets.AWS_ACCOUNT_ID}} 18 | AWS_REGION: ${{secrets.AWS_REGION}} 19 | AWS_ECR_ACCESS_KEY_ID: ${{secrets.AWS_ECR_ACCESS_KEY_ID}} 20 | AWS_ECR_SECRET_ACCESS_KEY: ${{secrets.AWS_ECR_SECRET_ACCESS_KEY}} 21 | DOCKERHUB_USERNAME: ${{secrets.DOCKERHUB_USERNAME}} 22 | DOCKERHUB_PASSWORD: ${{secrets.DOCKERHUB_PASSWORD}} 23 | -------------------------------------------------------------------------------- /.github/workflows/pause-community-contributions.yml: -------------------------------------------------------------------------------- 1 | name: Pause Community Contributions 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | pull_request_target: 8 | types: 9 | - opened 10 | 11 | permissions: 12 | issues: write 13 | pull-requests: write 14 | 15 | jobs: 16 | pause: 17 | if: github.repository_owner == 'exercism' # Stops this job from running on forks 18 | uses: exercism/github-actions/.github/workflows/community-contributions.yml@main 19 | with: 20 | forum_category: rust 21 | secrets: 22 | github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }} 23 | -------------------------------------------------------------------------------- /.github/workflows/ping-cross-track-maintainers-team.yml: -------------------------------------------------------------------------------- 1 | name: Ping cross-track maintainers team 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | 8 | permissions: 9 | pull-requests: write 10 | 11 | jobs: 12 | ping: 13 | if: github.repository_owner == 'exercism' # Stops this job from running on forks 14 | uses: exercism/github-actions/.github/workflows/ping-cross-track-maintainers-team.yml@main 15 | secrets: 16 | github_membership_token: ${{ secrets.COMMUNITY_CONTRIBUTIONS_WORKFLOW_TOKEN }} 17 | -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yml: -------------------------------------------------------------------------------- 1 | name: Tools 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - .github/labels.yml 9 | - .github/workflows/sync-labels.yml 10 | workflow_dispatch: 11 | schedule: 12 | - cron: 0 0 1 * * # First day of each month 13 | 14 | permissions: 15 | issues: write 16 | 17 | jobs: 18 | sync-labels: 19 | uses: exercism/github-actions/.github/workflows/labels.yml@main 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.swp 3 | snippets/*/target/ 4 | snippets/*/Cargo.lock 5 | snippets/*/analysis.json 6 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Introduction 4 | 5 | Exercism is a platform centered around empathetic conversation. 6 | We have a low tolerance for communication that makes anyone feel unwelcome, unsupported, insulted or discriminated against. 7 | 8 | ## Seen or experienced something uncomfortable? 9 | 10 | If you see or experience abuse, harassment, discrimination, or feel unsafe or upset, please email [abuse@exercism.org](mailto:abuse@exercism.org?subject=%5BCoC%5D) and include \[CoC\] in the subject line. 11 | We will follow up with you as a priority. 12 | 13 | ## Enforcement 14 | 15 | We actively monitor for Code of Conduct (CoC) violations and take any reports of violations extremely seriously. 16 | We have banned contributors, mentors and users due to violations. 17 | 18 | After we receive a report of a CoC violation, we view that person's conversation history on Exercism and related communication channels and attempt to understand whether someone has deliberately broken the CoC, or accidentally crossed a line. 19 | We generally reach out to the person who has been reported to discuss any concerns we have and warn them that repeated violations will result in a ban. 20 | Sometimes we decide that no violation has occurred and that no action is required and sometimes we will also ban people on a first offense. 21 | We strive to be fair, but will err on the side of protecting the culture of our community. 22 | 23 | Exercism's leadership reserve the right to take whatever action they feel appropriate with regards to CoC violations. 24 | 25 | ## The simple version 26 | 27 | - Be empathetic 28 | - Be welcoming 29 | - Be kind 30 | - Be honest 31 | - Be supportive 32 | - Be polite 33 | 34 | ## The details 35 | 36 | Exercism should be a safe place for everybody regardless of 37 | 38 | - Gender, gender identity or gender expression 39 | - Sexual orientation 40 | - Disability 41 | - Physical appearance (including but not limited to body size) 42 | - Race 43 | - Age 44 | - Religion 45 | - Anything else you can think of 46 | 47 | As someone who is part of this community, you agree that: 48 | 49 | - We are collectively and individually committed to safety and inclusivity 50 | - We have zero tolerance for abuse, harassment, or discrimination 51 | - We respect people’s boundaries and identities 52 | - We refrain from using language that can be considered offensive or oppressive (systemically or otherwise), eg. sexist, racist, homophobic, transphobic, ableist, classist, etc. 53 | - this includes (but is not limited to) various slurs. 54 | - We avoid using offensive topics as a form of humor 55 | 56 | We actively work towards: 57 | 58 | - Being a safe community 59 | - Cultivating a network of support & encouragement for each other 60 | - Encouraging responsible and varied forms of expression 61 | 62 | We condemn: 63 | 64 | - Stalking, doxxing, or publishing private information 65 | - Violence, threats of violence or violent language 66 | - Anything that compromises people’s safety 67 | - Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature 68 | - The use of unwelcome, suggestive, derogatory or inappropriate nicknames or terms 69 | - Disrespect towards others (jokes, innuendo, dismissive attitudes) and towards differences of opinion 70 | - Intimidation or harassment (online or in-person). 71 | Please read the [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md) for how we interpret harassment 72 | - Inappropriate attention or contact 73 | - Not understanding the differences between constructive criticism and disparagement 74 | 75 | These things are NOT OK. 76 | 77 | Be aware of how your actions affect others. 78 | If it makes someone uncomfortable, stop. 79 | 80 | If you say something that is found offensive, and you are called out on it, try to: 81 | 82 | - Listen without interruption 83 | - Believe what the person is saying & do not attempt to disqualify what they have to say 84 | - Ask for tips / help with avoiding making the offense in the future 85 | - Apologize and ask forgiveness 86 | 87 | ## History 88 | 89 | This policy was initially adopted from the Front-end London Slack community and has been modified since. 90 | A version history can be seen on [GitHub](https://github.com/exercism/website-copy/edit/main/pages/code_of_conduct.md). 91 | 92 | _This policy is a "living" document, and subject to refinement and expansion in the future. 93 | This policy applies to the Exercism website, the Exercism GitHub organization, any other Exercism-related communication channels (e.g. Discord, Forum, Twitter, email) and any other Exercism entity or event._ 94 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "anyhow" 7 | version = "1.0.95" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 10 | 11 | [[package]] 12 | name = "bitflags" 13 | version = "2.8.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 16 | 17 | [[package]] 18 | name = "cfg-if" 19 | version = "1.0.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 22 | 23 | [[package]] 24 | name = "errno" 25 | version = "0.3.10" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 28 | dependencies = [ 29 | "libc", 30 | "windows-sys", 31 | ] 32 | 33 | [[package]] 34 | name = "fastrand" 35 | version = "2.3.0" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 38 | 39 | [[package]] 40 | name = "getrandom" 41 | version = "0.2.15" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 44 | dependencies = [ 45 | "cfg-if", 46 | "libc", 47 | "wasi", 48 | ] 49 | 50 | [[package]] 51 | name = "itoa" 52 | version = "1.0.14" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 55 | 56 | [[package]] 57 | name = "libc" 58 | version = "0.2.169" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 61 | 62 | [[package]] 63 | name = "linux-raw-sys" 64 | version = "0.4.15" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 67 | 68 | [[package]] 69 | name = "memchr" 70 | version = "2.7.4" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 73 | 74 | [[package]] 75 | name = "once_cell" 76 | version = "1.20.2" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 79 | 80 | [[package]] 81 | name = "proc-macro2" 82 | version = "1.0.93" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 85 | dependencies = [ 86 | "unicode-ident", 87 | ] 88 | 89 | [[package]] 90 | name = "quote" 91 | version = "1.0.38" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 94 | dependencies = [ 95 | "proc-macro2", 96 | ] 97 | 98 | [[package]] 99 | name = "rust-analyzer" 100 | version = "0.4.2" 101 | dependencies = [ 102 | "anyhow", 103 | "serde", 104 | "serde_json", 105 | "tempfile", 106 | ] 107 | 108 | [[package]] 109 | name = "rustix" 110 | version = "0.38.43" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" 113 | dependencies = [ 114 | "bitflags", 115 | "errno", 116 | "libc", 117 | "linux-raw-sys", 118 | "windows-sys", 119 | ] 120 | 121 | [[package]] 122 | name = "ryu" 123 | version = "1.0.18" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 126 | 127 | [[package]] 128 | name = "serde" 129 | version = "1.0.217" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 132 | dependencies = [ 133 | "serde_derive", 134 | ] 135 | 136 | [[package]] 137 | name = "serde_derive" 138 | version = "1.0.217" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 141 | dependencies = [ 142 | "proc-macro2", 143 | "quote", 144 | "syn", 145 | ] 146 | 147 | [[package]] 148 | name = "serde_json" 149 | version = "1.0.136" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" 152 | dependencies = [ 153 | "itoa", 154 | "memchr", 155 | "ryu", 156 | "serde", 157 | ] 158 | 159 | [[package]] 160 | name = "syn" 161 | version = "2.0.96" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 164 | dependencies = [ 165 | "proc-macro2", 166 | "quote", 167 | "unicode-ident", 168 | ] 169 | 170 | [[package]] 171 | name = "tempfile" 172 | version = "3.15.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" 175 | dependencies = [ 176 | "cfg-if", 177 | "fastrand", 178 | "getrandom", 179 | "once_cell", 180 | "rustix", 181 | "windows-sys", 182 | ] 183 | 184 | [[package]] 185 | name = "unicode-ident" 186 | version = "1.0.14" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 189 | 190 | [[package]] 191 | name = "wasi" 192 | version = "0.11.0+wasi-snapshot-preview1" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 195 | 196 | [[package]] 197 | name = "windows-sys" 198 | version = "0.59.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 201 | dependencies = [ 202 | "windows-targets", 203 | ] 204 | 205 | [[package]] 206 | name = "windows-targets" 207 | version = "0.52.6" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 210 | dependencies = [ 211 | "windows_aarch64_gnullvm", 212 | "windows_aarch64_msvc", 213 | "windows_i686_gnu", 214 | "windows_i686_gnullvm", 215 | "windows_i686_msvc", 216 | "windows_x86_64_gnu", 217 | "windows_x86_64_gnullvm", 218 | "windows_x86_64_msvc", 219 | ] 220 | 221 | [[package]] 222 | name = "windows_aarch64_gnullvm" 223 | version = "0.52.6" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 226 | 227 | [[package]] 228 | name = "windows_aarch64_msvc" 229 | version = "0.52.6" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 232 | 233 | [[package]] 234 | name = "windows_i686_gnu" 235 | version = "0.52.6" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 238 | 239 | [[package]] 240 | name = "windows_i686_gnullvm" 241 | version = "0.52.6" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 244 | 245 | [[package]] 246 | name = "windows_i686_msvc" 247 | version = "0.52.6" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 250 | 251 | [[package]] 252 | name = "windows_x86_64_gnu" 253 | version = "0.52.6" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 256 | 257 | [[package]] 258 | name = "windows_x86_64_gnullvm" 259 | version = "0.52.6" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 262 | 263 | [[package]] 264 | name = "windows_x86_64_msvc" 265 | version = "0.52.6" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 268 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-analyzer" 3 | version = "0.4.2" 4 | edition = "2021" 5 | description = "Exercism's automated analyzer for the Rust track." 6 | 7 | [dependencies] 8 | anyhow = "1.0.86" 9 | serde = { version = "1.0.176", features = ["derive"] } 10 | serde_json = "1.0.104" 11 | 12 | [dev-dependencies] 13 | tempfile = "3.12.0" 14 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:1.85-slim AS base 2 | 3 | WORKDIR /analyzer 4 | 5 | COPY . . 6 | 7 | RUN cargo build --release 8 | 9 | # cargo-local-registry stuff is copied from the test runner 10 | FROM rust:1.85 AS build-cargo-local-registry 11 | 12 | # install cargo-local-registry 13 | RUN cargo install --locked cargo-local-registry 14 | # download popular crates to local registry 15 | WORKDIR /local-registry 16 | COPY local-registry/* ./ 17 | RUN cargo generate-lockfile && cargo local-registry --sync Cargo.lock . 18 | 19 | FROM rust:1.85-slim 20 | 21 | WORKDIR /opt/analyzer 22 | 23 | RUN rustup component add clippy 24 | 25 | COPY ./bin/run.sh ./bin/ 26 | COPY --from=base /analyzer/target/release/rust-analyzer ./bin/rust-analyzer 27 | COPY --from=build-cargo-local-registry /local-registry local-registry/ 28 | # configure local-registry 29 | RUN echo '[source.crates-io]\n\ 30 | registry = "https://github.com/rust-lang/crates.io-index"\n\ 31 | replace-with = "local-registry"\n\ 32 | \n\ 33 | [source.local-registry]\n\ 34 | local-registry = "/opt/analyzer/local-registry/"\n' >> $CARGO_HOME/config.toml 35 | 36 | ENTRYPOINT ["bin/run.sh"] 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published 637 | by the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . 662 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rust-analyzer 2 | 3 | _Not to be confused with the [rust-analyzer of the Rust project][rust-project-rust-analyzer]!_ 4 | 5 | `rust-analyzer` is a little wrapper around clippy that massages its output to adhere to Exercism's [analyzer interface][analyzer-interface]. 6 | It is used to provide clippy's feedback to submissions on [Exercism's Rust track][exercism-rust]. 7 | Please find general documentation about Exercism's language analyzers [here][analyzers-doc]. 8 | 9 | ## Usage 10 | 11 | To run the utility using Cargo execute the following command: 12 | 13 | ```shell 14 | cargo run -- 15 | ``` 16 | 17 | In the context of the automatic mentoring the utility is invoked inside the Docker container via the `bin/run.sh` script. 18 | 19 | ## Building 20 | 21 | You should have the latest stable version of Rust [installed][install-rust] on you machine. 22 | Then from the project root run: 23 | 24 | ```shell 25 | cargo build 26 | ``` 27 | 28 | ## Testing 29 | 30 | The main tests are run in docker, use the following script: 31 | 32 | ```shell 33 | ./bin/run-tests-in-docker.sh 34 | ``` 35 | 36 | For unit tests: 37 | 38 | ```shell 39 | cargo test 40 | ``` 41 | 42 | [rust-project-rust-analyzer]: https://github.com/rust-lang/rust-analyzer 43 | [analyzer-interface]: https://exercism.org/docs/building/tooling/analyzers/interface 44 | [exercism-rust]: https://exercism.org/tracks/rust 45 | [analyzers-doc]: https://exercism.org/docs/building/tooling/analyzers 46 | [install-rust]: https://www.rust-lang.org/tools/install 47 | -------------------------------------------------------------------------------- /bin/run-in-docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Synopsis: 4 | # Run the analyzer on a solution using the analyzer Docker image. 5 | # The analyzer Docker image is built automatically. 6 | 7 | # Arguments: 8 | # $1: exercise slug 9 | # $2: path to solution folder 10 | # $3: path to output directory 11 | 12 | # Output: 13 | # Run the analyzer on a solution using the analyzer Docker image. 14 | # The analyzer Docker image is built automatically. 15 | 16 | # Example: 17 | # ./bin/run-in-docker.sh two-fer path/to/solution/folder/ path/to/output/directory/ 18 | 19 | # Stop executing when a command returns a non-zero return code 20 | set -e 21 | 22 | # If any required arguments is missing, print the usage and exit 23 | if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then 24 | echo "usage: ./bin/run-in-docker.sh exercise-slug path/to/solution/folder/ path/to/output/directory/" 25 | exit 1 26 | fi 27 | 28 | slug="$1" 29 | solution_dir=$(realpath "${2%/}") 30 | output_dir=$(realpath "${3%/}") 31 | 32 | # Create the output directory if it doesn't exist 33 | mkdir -p "${output_dir}" 34 | 35 | # Build the Docker image 36 | docker build --rm -t exercism/rust-analyzer . 37 | 38 | # Run the Docker image using the settings mimicking the production environment 39 | docker run \ 40 | --rm \ 41 | --network none \ 42 | --mount type=bind,src="${solution_dir}",dst=/solution \ 43 | --mount type=bind,src="${output_dir}",dst=/output \ 44 | --mount type=tmpfs,dst=/tmp \ 45 | exercism/rust-analyzer "${slug}" /solution /output 46 | -------------------------------------------------------------------------------- /bin/run-tests-in-docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Synopsis: 4 | # Test the analyzer Docker image by running it against a predefined set of 5 | # solutions with an expected output. 6 | # The analyzer Docker image is built automatically. 7 | 8 | # Output: 9 | # Outputs the diff of the expected analysis against the actual analysis 10 | # generated by the analyzer Docker image. 11 | 12 | # Example: 13 | # ./bin/run-tests-in-docker.sh 14 | 15 | # Stop executing when a command returns a non-zero return code 16 | set -e 17 | 18 | # Build the Docker image 19 | docker build --rm -t exercism/rust-analyzer . 20 | 21 | # Run the Docker image using the settings mimicking the production environment 22 | docker run \ 23 | --rm \ 24 | --network none \ 25 | --mount type=bind,src="${PWD}/snippets",dst=/opt/analyzer/snippets \ 26 | --mount type=tmpfs,dst=/tmp \ 27 | --volume "${PWD}/bin/run-tests.sh:/opt/analyzer/bin/run-tests.sh" \ 28 | --workdir /opt/analyzer \ 29 | --entrypoint /opt/analyzer/bin/run-tests.sh \ 30 | exercism/rust-analyzer 31 | -------------------------------------------------------------------------------- /bin/run-tests.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Synopsis: 4 | # Test the analyzer by running it against a predefined set of solutions 5 | # with an expected output. 6 | 7 | # Output: 8 | # Outputs the diff of the expected analysis against the actual analysis 9 | # generated by the analyzer. 10 | 11 | # Example: 12 | # ./bin/run-tests.sh 13 | 14 | exit_code=0 15 | 16 | # Iterate over all test directories 17 | for analysis_file in $(find snippets -name expected_analysis.json); do 18 | test_dir=$(dirname "${analysis_file}") 19 | test_dir_name=$(basename "${test_dir}") 20 | test_dir_path=$(realpath "${test_dir}") 21 | slug=$(echo $test_dir | awk -F '/' '{ print $2 }') 22 | 23 | bin/run.sh "${slug}" "${test_dir_path}" "${test_dir_path}" 24 | 25 | file="analysis.json" 26 | expected_file="expected_${file}" 27 | echo "${test_dir_name}: comparing ${file} to ${expected_file}" 28 | 29 | if ! diff "${test_dir_path}/${file}" "${test_dir_path}/${expected_file}"; then 30 | exit_code=1 31 | fi 32 | done 33 | 34 | exit ${exit_code} 35 | -------------------------------------------------------------------------------- /bin/run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | set -eu 3 | 4 | slug="$1" 5 | solution_dir="$2" 6 | output_dir="$3" 7 | 8 | /opt/analyzer/bin/rust-analyzer "$slug" "$solution_dir" "$output_dir" 9 | -------------------------------------------------------------------------------- /local-registry/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.7.8" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" 10 | dependencies = [ 11 | "getrandom 0.2.15", 12 | "once_cell", 13 | "version_check", 14 | ] 15 | 16 | [[package]] 17 | name = "ahash" 18 | version = "0.8.11" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 21 | dependencies = [ 22 | "cfg-if", 23 | "once_cell", 24 | "version_check", 25 | "zerocopy 0.7.35", 26 | ] 27 | 28 | [[package]] 29 | name = "aho-corasick" 30 | version = "1.1.3" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 33 | dependencies = [ 34 | "memchr", 35 | ] 36 | 37 | [[package]] 38 | name = "allocator-api2" 39 | version = "0.2.21" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 42 | 43 | [[package]] 44 | name = "android-tzdata" 45 | version = "0.1.1" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 48 | 49 | [[package]] 50 | name = "android_system_properties" 51 | version = "0.1.5" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 54 | dependencies = [ 55 | "libc", 56 | ] 57 | 58 | [[package]] 59 | name = "anes" 60 | version = "0.1.6" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" 63 | 64 | [[package]] 65 | name = "anstyle" 66 | version = "1.0.10" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 69 | 70 | [[package]] 71 | name = "anyhow" 72 | version = "1.0.98" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 75 | 76 | [[package]] 77 | name = "arr_macro" 78 | version = "0.2.1" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "c49336e062fa2ae8aca17a2f99c34d9c1a5d30827e8aff1cb4c294f253afe992" 81 | dependencies = [ 82 | "arr_macro_impl", 83 | "proc-macro-hack", 84 | "proc-macro-nested", 85 | ] 86 | 87 | [[package]] 88 | name = "arr_macro_impl" 89 | version = "0.2.1" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "9c6368f9ae5c6ec403ca910327ae0c9437b0a85255b6950c90d497e6177f6e5e" 92 | dependencies = [ 93 | "proc-macro-hack", 94 | "quote", 95 | "syn 1.0.109", 96 | ] 97 | 98 | [[package]] 99 | name = "arrayvec" 100 | version = "0.7.6" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 103 | 104 | [[package]] 105 | name = "ascii" 106 | version = "1.1.0" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" 109 | 110 | [[package]] 111 | name = "autocfg" 112 | version = "1.4.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 115 | 116 | [[package]] 117 | name = "bigdecimal" 118 | version = "0.4.8" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" 121 | dependencies = [ 122 | "autocfg", 123 | "libm", 124 | "num-bigint 0.4.6", 125 | "num-integer", 126 | "num-traits", 127 | ] 128 | 129 | [[package]] 130 | name = "bimap" 131 | version = "0.6.3" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" 134 | 135 | [[package]] 136 | name = "binary-heap-plus" 137 | version = "0.5.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "e4551d8382e911ecc0d0f0ffb602777988669be09447d536ff4388d1def11296" 140 | dependencies = [ 141 | "compare", 142 | ] 143 | 144 | [[package]] 145 | name = "bit-set" 146 | version = "0.8.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 149 | dependencies = [ 150 | "bit-vec", 151 | ] 152 | 153 | [[package]] 154 | name = "bit-vec" 155 | version = "0.8.0" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 158 | 159 | [[package]] 160 | name = "bitflags" 161 | version = "2.9.1" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 164 | 165 | [[package]] 166 | name = "bitmaps" 167 | version = "2.1.0" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" 170 | dependencies = [ 171 | "typenum", 172 | ] 173 | 174 | [[package]] 175 | name = "bitvec" 176 | version = "1.0.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 179 | dependencies = [ 180 | "funty", 181 | "radium", 182 | "tap", 183 | "wyz", 184 | ] 185 | 186 | [[package]] 187 | name = "block-buffer" 188 | version = "0.10.4" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 191 | dependencies = [ 192 | "generic-array", 193 | ] 194 | 195 | [[package]] 196 | name = "bstr" 197 | version = "1.12.0" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" 200 | dependencies = [ 201 | "memchr", 202 | "regex-automata", 203 | "serde", 204 | ] 205 | 206 | [[package]] 207 | name = "bumpalo" 208 | version = "3.16.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 211 | 212 | [[package]] 213 | name = "bytecount" 214 | version = "0.6.8" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" 217 | 218 | [[package]] 219 | name = "byteorder" 220 | version = "1.5.0" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 223 | 224 | [[package]] 225 | name = "cached" 226 | version = "0.55.1" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "b0839c297f8783316fcca9d90344424e968395413f0662a5481f79c6648bbc14" 229 | dependencies = [ 230 | "ahash 0.8.11", 231 | "cached_proc_macro", 232 | "cached_proc_macro_types", 233 | "hashbrown 0.14.5", 234 | "once_cell", 235 | "thiserror", 236 | "web-time", 237 | ] 238 | 239 | [[package]] 240 | name = "cached_proc_macro" 241 | version = "0.24.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "673992d934f0711b68ebb3e1b79cdc4be31634b37c98f26867ced0438ca5c603" 244 | dependencies = [ 245 | "darling", 246 | "proc-macro2", 247 | "quote", 248 | "syn 2.0.96", 249 | ] 250 | 251 | [[package]] 252 | name = "cached_proc_macro_types" 253 | version = "0.1.1" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" 256 | 257 | [[package]] 258 | name = "cast" 259 | version = "0.3.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 262 | 263 | [[package]] 264 | name = "cc" 265 | version = "1.2.10" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 268 | dependencies = [ 269 | "shlex", 270 | ] 271 | 272 | [[package]] 273 | name = "cfg-if" 274 | version = "1.0.0" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 277 | 278 | [[package]] 279 | name = "chrono" 280 | version = "0.4.41" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 283 | dependencies = [ 284 | "android-tzdata", 285 | "iana-time-zone", 286 | "js-sys", 287 | "num-traits", 288 | "wasm-bindgen", 289 | "windows-link", 290 | ] 291 | 292 | [[package]] 293 | name = "ciborium" 294 | version = "0.2.2" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 297 | dependencies = [ 298 | "ciborium-io", 299 | "ciborium-ll", 300 | "serde", 301 | ] 302 | 303 | [[package]] 304 | name = "ciborium-io" 305 | version = "0.2.2" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 308 | 309 | [[package]] 310 | name = "ciborium-ll" 311 | version = "0.2.2" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 314 | dependencies = [ 315 | "ciborium-io", 316 | "half", 317 | ] 318 | 319 | [[package]] 320 | name = "clap" 321 | version = "4.5.26" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" 324 | dependencies = [ 325 | "clap_builder", 326 | ] 327 | 328 | [[package]] 329 | name = "clap_builder" 330 | version = "4.5.26" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" 333 | dependencies = [ 334 | "anstyle", 335 | "clap_lex", 336 | ] 337 | 338 | [[package]] 339 | name = "clap_lex" 340 | version = "0.7.4" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 343 | 344 | [[package]] 345 | name = "compare" 346 | version = "0.1.0" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "120133d4db2ec47efe2e26502ee984747630c67f51974fca0b6c1340cf2368d3" 349 | 350 | [[package]] 351 | name = "convert_case" 352 | version = "0.8.0" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" 355 | dependencies = [ 356 | "unicode-segmentation", 357 | ] 358 | 359 | [[package]] 360 | name = "core-foundation-sys" 361 | version = "0.8.7" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 364 | 365 | [[package]] 366 | name = "counter" 367 | version = "0.6.0" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "f009fcafa949dc1fc46a762dae84d0c2687d3b550906b633c4979d58d2c6ae52" 370 | dependencies = [ 371 | "num-traits", 372 | ] 373 | 374 | [[package]] 375 | name = "cpufeatures" 376 | version = "0.2.16" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" 379 | dependencies = [ 380 | "libc", 381 | ] 382 | 383 | [[package]] 384 | name = "criterion" 385 | version = "0.6.0" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" 388 | dependencies = [ 389 | "anes", 390 | "cast", 391 | "ciborium", 392 | "clap", 393 | "criterion-plot", 394 | "itertools 0.13.0", 395 | "num-traits", 396 | "oorandom", 397 | "plotters", 398 | "rayon", 399 | "regex", 400 | "serde", 401 | "serde_json", 402 | "tinytemplate", 403 | "walkdir", 404 | ] 405 | 406 | [[package]] 407 | name = "criterion-plot" 408 | version = "0.5.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" 411 | dependencies = [ 412 | "cast", 413 | "itertools 0.10.5", 414 | ] 415 | 416 | [[package]] 417 | name = "crossbeam" 418 | version = "0.8.4" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" 421 | dependencies = [ 422 | "crossbeam-channel", 423 | "crossbeam-deque", 424 | "crossbeam-epoch", 425 | "crossbeam-queue", 426 | "crossbeam-utils", 427 | ] 428 | 429 | [[package]] 430 | name = "crossbeam-channel" 431 | version = "0.5.15" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 434 | dependencies = [ 435 | "crossbeam-utils", 436 | ] 437 | 438 | [[package]] 439 | name = "crossbeam-deque" 440 | version = "0.8.6" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 443 | dependencies = [ 444 | "crossbeam-epoch", 445 | "crossbeam-utils", 446 | ] 447 | 448 | [[package]] 449 | name = "crossbeam-epoch" 450 | version = "0.9.18" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 453 | dependencies = [ 454 | "crossbeam-utils", 455 | ] 456 | 457 | [[package]] 458 | name = "crossbeam-queue" 459 | version = "0.3.12" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 462 | dependencies = [ 463 | "crossbeam-utils", 464 | ] 465 | 466 | [[package]] 467 | name = "crossbeam-utils" 468 | version = "0.8.21" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 471 | 472 | [[package]] 473 | name = "crunchy" 474 | version = "0.2.2" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 477 | 478 | [[package]] 479 | name = "crypto-common" 480 | version = "0.1.6" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 483 | dependencies = [ 484 | "generic-array", 485 | "typenum", 486 | ] 487 | 488 | [[package]] 489 | name = "darling" 490 | version = "0.20.10" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 493 | dependencies = [ 494 | "darling_core", 495 | "darling_macro", 496 | ] 497 | 498 | [[package]] 499 | name = "darling_core" 500 | version = "0.20.10" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 503 | dependencies = [ 504 | "fnv", 505 | "ident_case", 506 | "proc-macro2", 507 | "quote", 508 | "strsim", 509 | "syn 2.0.96", 510 | ] 511 | 512 | [[package]] 513 | name = "darling_macro" 514 | version = "0.20.10" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 517 | dependencies = [ 518 | "darling_core", 519 | "quote", 520 | "syn 2.0.96", 521 | ] 522 | 523 | [[package]] 524 | name = "dashmap" 525 | version = "6.1.0" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 528 | dependencies = [ 529 | "cfg-if", 530 | "crossbeam-utils", 531 | "hashbrown 0.14.5", 532 | "lock_api", 533 | "once_cell", 534 | "parking_lot_core", 535 | ] 536 | 537 | [[package]] 538 | name = "deranged" 539 | version = "0.4.1" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" 542 | dependencies = [ 543 | "powerfmt", 544 | ] 545 | 546 | [[package]] 547 | name = "derive_more" 548 | version = "2.0.1" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 551 | dependencies = [ 552 | "derive_more-impl", 553 | ] 554 | 555 | [[package]] 556 | name = "derive_more-impl" 557 | version = "2.0.1" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 560 | dependencies = [ 561 | "proc-macro2", 562 | "quote", 563 | "syn 2.0.96", 564 | ] 565 | 566 | [[package]] 567 | name = "diff" 568 | version = "0.1.13" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 571 | 572 | [[package]] 573 | name = "digest" 574 | version = "0.10.7" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 577 | dependencies = [ 578 | "block-buffer", 579 | "crypto-common", 580 | ] 581 | 582 | [[package]] 583 | name = "digits_iterator" 584 | version = "0.1.0" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "af83450b771231745d43edf36dc9b7813ab83be5e8cbea344ccced1a09dfebcd" 587 | 588 | [[package]] 589 | name = "divisors" 590 | version = "0.2.1" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "bbb1463b94567b1d22f0e07d13a70dcc25f39f88ad8cc197ecb978efddb9136e" 593 | dependencies = [ 594 | "num 0.2.1", 595 | ] 596 | 597 | [[package]] 598 | name = "divrem" 599 | version = "1.0.0" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "69dde51e8fef5e12c1d65e0929b03d66e4c0c18282bc30ed2ca050ad6f44dd82" 602 | 603 | [[package]] 604 | name = "dummy_package" 605 | version = "0.1.0" 606 | dependencies = [ 607 | "anyhow", 608 | "arr_macro", 609 | "arrayvec", 610 | "ascii", 611 | "bigdecimal", 612 | "bimap", 613 | "binary-heap-plus", 614 | "bit-set", 615 | "bitflags", 616 | "bitvec", 617 | "bstr", 618 | "bytecount", 619 | "cached", 620 | "cast", 621 | "chrono", 622 | "convert_case", 623 | "counter", 624 | "criterion", 625 | "crossbeam", 626 | "crossbeam-channel", 627 | "crossbeam-utils", 628 | "dashmap", 629 | "derive_more", 630 | "digits_iterator", 631 | "divisors", 632 | "divrem", 633 | "duplicate", 634 | "easybench", 635 | "either", 636 | "enum-iterator", 637 | "enum-primitive-derive", 638 | "enumset", 639 | "fixedbitset", 640 | "flagset", 641 | "frunk", 642 | "gcd", 643 | "hashbag", 644 | "hexlit", 645 | "if_chain", 646 | "im", 647 | "indexmap", 648 | "indoc", 649 | "int-enum", 650 | "integer-sqrt", 651 | "itertools 0.14.0", 652 | "itoa", 653 | "kmp", 654 | "linked-hash-map", 655 | "linked_hash_set", 656 | "maplit", 657 | "memoize", 658 | "mod_exp", 659 | "modinverse", 660 | "multimap", 661 | "multiset", 662 | "ndarray", 663 | "nom", 664 | "num 0.4.3", 665 | "num-bigint 0.4.6", 666 | "num-derive", 667 | "num-format", 668 | "num-integer", 669 | "num-traits", 670 | "num_cpus", 671 | "num_enum", 672 | "numtoa", 673 | "pest", 674 | "pest_derive", 675 | "phf", 676 | "phf_macros", 677 | "pretty_assertions", 678 | "proptest", 679 | "quickcheck", 680 | "quickcheck_macros", 681 | "rand 0.9.1", 682 | "rand_chacha 0.9.0", 683 | "rayon", 684 | "regex-lite", 685 | "rstest", 686 | "rstest_reuse", 687 | "serde", 688 | "serde_derive", 689 | "spinning_top", 690 | "static_assertions", 691 | "strfmt", 692 | "strum", 693 | "strum_macros", 694 | "subslice", 695 | "thiserror", 696 | "threadpool", 697 | "time", 698 | "tinyset", 699 | "transpose", 700 | "unic-segment", 701 | "unicase", 702 | "unicode-normalization", 703 | "unicode-reverse", 704 | "unicode-segmentation", 705 | "unzip-n", 706 | "uuid", 707 | "voca_rs", 708 | "xvii", 709 | ] 710 | 711 | [[package]] 712 | name = "duplicate" 713 | version = "2.0.0" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1" 716 | dependencies = [ 717 | "heck", 718 | "proc-macro2", 719 | "proc-macro2-diagnostics", 720 | ] 721 | 722 | [[package]] 723 | name = "easybench" 724 | version = "1.1.1" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "0fe5e0c7c863ab37184b6310b4ff6b857c71814ff38e93c5b99fbda1467a5a32" 727 | 728 | [[package]] 729 | name = "either" 730 | version = "1.15.0" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 733 | 734 | [[package]] 735 | name = "enum-iterator" 736 | version = "2.1.0" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "c280b9e6b3ae19e152d8e31cf47f18389781e119d4013a2a2bb0180e5facc635" 739 | dependencies = [ 740 | "enum-iterator-derive", 741 | ] 742 | 743 | [[package]] 744 | name = "enum-iterator-derive" 745 | version = "1.4.0" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" 748 | dependencies = [ 749 | "proc-macro2", 750 | "quote", 751 | "syn 2.0.96", 752 | ] 753 | 754 | [[package]] 755 | name = "enum-primitive-derive" 756 | version = "0.3.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "ba7795da175654fe16979af73f81f26a8ea27638d8d9823d317016888a63dc4c" 759 | dependencies = [ 760 | "num-traits", 761 | "quote", 762 | "syn 2.0.96", 763 | ] 764 | 765 | [[package]] 766 | name = "enumset" 767 | version = "1.1.6" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" 770 | dependencies = [ 771 | "enumset_derive", 772 | ] 773 | 774 | [[package]] 775 | name = "enumset_derive" 776 | version = "0.11.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" 779 | dependencies = [ 780 | "darling", 781 | "proc-macro2", 782 | "quote", 783 | "syn 2.0.96", 784 | ] 785 | 786 | [[package]] 787 | name = "env_logger" 788 | version = "0.8.4" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" 791 | dependencies = [ 792 | "log", 793 | "regex", 794 | ] 795 | 796 | [[package]] 797 | name = "equivalent" 798 | version = "1.0.1" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 801 | 802 | [[package]] 803 | name = "errno" 804 | version = "0.3.10" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 807 | dependencies = [ 808 | "libc", 809 | "windows-sys", 810 | ] 811 | 812 | [[package]] 813 | name = "fastrand" 814 | version = "2.3.0" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 817 | 818 | [[package]] 819 | name = "fixedbitset" 820 | version = "0.5.7" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 823 | 824 | [[package]] 825 | name = "flagset" 826 | version = "0.4.7" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" 829 | 830 | [[package]] 831 | name = "fnv" 832 | version = "1.0.7" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 835 | 836 | [[package]] 837 | name = "frunk" 838 | version = "0.4.3" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "874b6a17738fc273ec753618bac60ddaeac48cb1d7684c3e7bd472e57a28b817" 841 | dependencies = [ 842 | "frunk_core", 843 | "frunk_derives", 844 | "frunk_proc_macros", 845 | "serde", 846 | ] 847 | 848 | [[package]] 849 | name = "frunk_core" 850 | version = "0.4.3" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "3529a07095650187788833d585c219761114005d5976185760cf794d265b6a5c" 853 | dependencies = [ 854 | "serde", 855 | ] 856 | 857 | [[package]] 858 | name = "frunk_derives" 859 | version = "0.4.3" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "e99b8b3c28ae0e84b604c75f721c21dc77afb3706076af5e8216d15fd1deaae3" 862 | dependencies = [ 863 | "frunk_proc_macro_helpers", 864 | "quote", 865 | "syn 2.0.96", 866 | ] 867 | 868 | [[package]] 869 | name = "frunk_proc_macro_helpers" 870 | version = "0.1.3" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "05a956ef36c377977e512e227dcad20f68c2786ac7a54dacece3746046fea5ce" 873 | dependencies = [ 874 | "frunk_core", 875 | "proc-macro2", 876 | "quote", 877 | "syn 2.0.96", 878 | ] 879 | 880 | [[package]] 881 | name = "frunk_proc_macros" 882 | version = "0.1.3" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "67e86c2c9183662713fea27ea527aad20fb15fee635a71081ff91bf93df4dc51" 885 | dependencies = [ 886 | "frunk_core", 887 | "frunk_proc_macro_helpers", 888 | "quote", 889 | "syn 2.0.96", 890 | ] 891 | 892 | [[package]] 893 | name = "funty" 894 | version = "2.0.0" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 897 | 898 | [[package]] 899 | name = "futures-core" 900 | version = "0.3.31" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 903 | 904 | [[package]] 905 | name = "futures-macro" 906 | version = "0.3.31" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 909 | dependencies = [ 910 | "proc-macro2", 911 | "quote", 912 | "syn 2.0.96", 913 | ] 914 | 915 | [[package]] 916 | name = "futures-task" 917 | version = "0.3.31" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 920 | 921 | [[package]] 922 | name = "futures-timer" 923 | version = "3.0.3" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" 926 | 927 | [[package]] 928 | name = "futures-util" 929 | version = "0.3.31" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 932 | dependencies = [ 933 | "futures-core", 934 | "futures-macro", 935 | "futures-task", 936 | "pin-project-lite", 937 | "pin-utils", 938 | "slab", 939 | ] 940 | 941 | [[package]] 942 | name = "gcd" 943 | version = "2.3.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" 946 | 947 | [[package]] 948 | name = "generic-array" 949 | version = "0.14.7" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 952 | dependencies = [ 953 | "typenum", 954 | "version_check", 955 | ] 956 | 957 | [[package]] 958 | name = "getrandom" 959 | version = "0.2.15" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 962 | dependencies = [ 963 | "cfg-if", 964 | "libc", 965 | "wasi 0.11.0+wasi-snapshot-preview1", 966 | ] 967 | 968 | [[package]] 969 | name = "getrandom" 970 | version = "0.3.1" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 973 | dependencies = [ 974 | "cfg-if", 975 | "libc", 976 | "wasi 0.13.3+wasi-0.2.2", 977 | "windows-targets", 978 | ] 979 | 980 | [[package]] 981 | name = "glob" 982 | version = "0.3.2" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 985 | 986 | [[package]] 987 | name = "half" 988 | version = "2.4.1" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 991 | dependencies = [ 992 | "cfg-if", 993 | "crunchy", 994 | ] 995 | 996 | [[package]] 997 | name = "hashbag" 998 | version = "0.1.12" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "98f494b2060b2a8f5e63379e1e487258e014cee1b1725a735816c0107a2e9d93" 1001 | 1002 | [[package]] 1003 | name = "hashbrown" 1004 | version = "0.12.3" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1007 | dependencies = [ 1008 | "ahash 0.7.8", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "hashbrown" 1013 | version = "0.14.5" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1016 | dependencies = [ 1017 | "ahash 0.8.11", 1018 | "allocator-api2", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "hashbrown" 1023 | version = "0.15.2" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1026 | 1027 | [[package]] 1028 | name = "heck" 1029 | version = "0.5.0" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1032 | 1033 | [[package]] 1034 | name = "hermit-abi" 1035 | version = "0.5.1" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" 1038 | 1039 | [[package]] 1040 | name = "hexlit" 1041 | version = "0.5.5" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "5b6e75c860d4216ac53f9ac88b25c99eaedba075b3a7b2ed31f2adc51a74fffd" 1044 | 1045 | [[package]] 1046 | name = "iana-time-zone" 1047 | version = "0.1.61" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 1050 | dependencies = [ 1051 | "android_system_properties", 1052 | "core-foundation-sys", 1053 | "iana-time-zone-haiku", 1054 | "js-sys", 1055 | "wasm-bindgen", 1056 | "windows-core", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "iana-time-zone-haiku" 1061 | version = "0.1.2" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1064 | dependencies = [ 1065 | "cc", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "ident_case" 1070 | version = "1.0.1" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1073 | 1074 | [[package]] 1075 | name = "if_chain" 1076 | version = "1.0.2" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" 1079 | 1080 | [[package]] 1081 | name = "im" 1082 | version = "15.1.0" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" 1085 | dependencies = [ 1086 | "bitmaps", 1087 | "rand_core 0.6.4", 1088 | "rand_xoshiro", 1089 | "sized-chunks", 1090 | "typenum", 1091 | "version_check", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "indexmap" 1096 | version = "2.9.0" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1099 | dependencies = [ 1100 | "equivalent", 1101 | "hashbrown 0.15.2", 1102 | ] 1103 | 1104 | [[package]] 1105 | name = "indoc" 1106 | version = "2.0.6" 1107 | source = "registry+https://github.com/rust-lang/crates.io-index" 1108 | checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" 1109 | 1110 | [[package]] 1111 | name = "int-enum" 1112 | version = "1.2.0" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "e366a1634cccc76b4cfd3e7580de9b605e4d93f1edac48d786c1f867c0def495" 1115 | dependencies = [ 1116 | "proc-macro2", 1117 | "proc-macro2-diagnostics", 1118 | "quote", 1119 | "syn 2.0.96", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "integer-sqrt" 1124 | version = "0.1.5" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" 1127 | dependencies = [ 1128 | "num-traits", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "itertools" 1133 | version = "0.10.5" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1136 | dependencies = [ 1137 | "either", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "itertools" 1142 | version = "0.13.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 1145 | dependencies = [ 1146 | "either", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "itertools" 1151 | version = "0.14.0" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1154 | dependencies = [ 1155 | "either", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "itoa" 1160 | version = "1.0.15" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1163 | 1164 | [[package]] 1165 | name = "js-sys" 1166 | version = "0.3.77" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1169 | dependencies = [ 1170 | "once_cell", 1171 | "wasm-bindgen", 1172 | ] 1173 | 1174 | [[package]] 1175 | name = "kmp" 1176 | version = "0.1.1" 1177 | source = "registry+https://github.com/rust-lang/crates.io-index" 1178 | checksum = "131bddab59a64213cc1e9f0c5be010d7eb485951358ab7e52017888dec482028" 1179 | 1180 | [[package]] 1181 | name = "lazy_static" 1182 | version = "1.5.0" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1185 | 1186 | [[package]] 1187 | name = "libc" 1188 | version = "0.2.169" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 1191 | 1192 | [[package]] 1193 | name = "libm" 1194 | version = "0.2.11" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 1197 | 1198 | [[package]] 1199 | name = "linked-hash-map" 1200 | version = "0.5.6" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1203 | 1204 | [[package]] 1205 | name = "linked_hash_set" 1206 | version = "0.1.5" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "bae85b5be22d9843c80e5fc80e9b64c8a3b1f98f867c709956eca3efff4e92e2" 1209 | dependencies = [ 1210 | "linked-hash-map", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "linux-raw-sys" 1215 | version = "0.4.15" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1218 | 1219 | [[package]] 1220 | name = "lock_api" 1221 | version = "0.4.12" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1224 | dependencies = [ 1225 | "autocfg", 1226 | "scopeguard", 1227 | ] 1228 | 1229 | [[package]] 1230 | name = "log" 1231 | version = "0.4.25" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 1234 | 1235 | [[package]] 1236 | name = "lru" 1237 | version = "0.7.8" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" 1240 | dependencies = [ 1241 | "hashbrown 0.12.3", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "maplit" 1246 | version = "1.0.2" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" 1249 | 1250 | [[package]] 1251 | name = "matrixmultiply" 1252 | version = "0.3.9" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" 1255 | dependencies = [ 1256 | "autocfg", 1257 | "rawpointer", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "memchr" 1262 | version = "2.7.4" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1265 | 1266 | [[package]] 1267 | name = "memoize" 1268 | version = "0.5.1" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "f8d1d5792299bab3f8b5d88d1b7a7cb50ad7ef039a8c4d45a6b84880a6526276" 1271 | dependencies = [ 1272 | "lazy_static", 1273 | "lru", 1274 | "memoize-inner", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "memoize-inner" 1279 | version = "0.5.1" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "6dd8f89255d8ff313afabed9a3c83ef0993cc056679dfd001f5111a026f876f7" 1282 | dependencies = [ 1283 | "lazy_static", 1284 | "proc-macro2", 1285 | "quote", 1286 | "syn 1.0.109", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "mod_exp" 1291 | version = "1.0.1" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "bb4a3fad6af79fcf8d1417b2f6359d814a173fb413a1bd48ba04208b42b0d8b0" 1294 | dependencies = [ 1295 | "num 0.2.1", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "modinverse" 1300 | version = "0.1.1" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "2f62f577f148cc1a9466e7065a22e59466a7d537cceba5e77e57181d0f706633" 1303 | dependencies = [ 1304 | "num-integer", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "multimap" 1309 | version = "0.10.1" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" 1312 | dependencies = [ 1313 | "serde", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "multiset" 1318 | version = "0.0.5" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "ce8738c9ddd350996cb8b8b718192851df960803764bcdaa3afb44a63b1ddb5c" 1321 | 1322 | [[package]] 1323 | name = "ndarray" 1324 | version = "0.16.1" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" 1327 | dependencies = [ 1328 | "matrixmultiply", 1329 | "num-complex 0.4.6", 1330 | "num-integer", 1331 | "num-traits", 1332 | "portable-atomic", 1333 | "portable-atomic-util", 1334 | "rawpointer", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "nom" 1339 | version = "8.0.0" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 1342 | dependencies = [ 1343 | "memchr", 1344 | ] 1345 | 1346 | [[package]] 1347 | name = "num" 1348 | version = "0.2.1" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" 1351 | dependencies = [ 1352 | "num-bigint 0.2.6", 1353 | "num-complex 0.2.4", 1354 | "num-integer", 1355 | "num-iter", 1356 | "num-rational 0.2.4", 1357 | "num-traits", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "num" 1362 | version = "0.4.3" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" 1365 | dependencies = [ 1366 | "num-bigint 0.4.6", 1367 | "num-complex 0.4.6", 1368 | "num-integer", 1369 | "num-iter", 1370 | "num-rational 0.4.2", 1371 | "num-traits", 1372 | ] 1373 | 1374 | [[package]] 1375 | name = "num-bigint" 1376 | version = "0.2.6" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" 1379 | dependencies = [ 1380 | "autocfg", 1381 | "num-integer", 1382 | "num-traits", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "num-bigint" 1387 | version = "0.4.6" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1390 | dependencies = [ 1391 | "num-integer", 1392 | "num-traits", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "num-complex" 1397 | version = "0.2.4" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" 1400 | dependencies = [ 1401 | "autocfg", 1402 | "num-traits", 1403 | ] 1404 | 1405 | [[package]] 1406 | name = "num-complex" 1407 | version = "0.4.6" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 1410 | dependencies = [ 1411 | "num-traits", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "num-conv" 1416 | version = "0.1.0" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1419 | 1420 | [[package]] 1421 | name = "num-derive" 1422 | version = "0.4.2" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 1425 | dependencies = [ 1426 | "proc-macro2", 1427 | "quote", 1428 | "syn 2.0.96", 1429 | ] 1430 | 1431 | [[package]] 1432 | name = "num-format" 1433 | version = "0.4.4" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" 1436 | dependencies = [ 1437 | "arrayvec", 1438 | "itoa", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "num-integer" 1443 | version = "0.1.46" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1446 | dependencies = [ 1447 | "num-traits", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "num-iter" 1452 | version = "0.1.45" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1455 | dependencies = [ 1456 | "autocfg", 1457 | "num-integer", 1458 | "num-traits", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "num-rational" 1463 | version = "0.2.4" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" 1466 | dependencies = [ 1467 | "autocfg", 1468 | "num-bigint 0.2.6", 1469 | "num-integer", 1470 | "num-traits", 1471 | ] 1472 | 1473 | [[package]] 1474 | name = "num-rational" 1475 | version = "0.4.2" 1476 | source = "registry+https://github.com/rust-lang/crates.io-index" 1477 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 1478 | dependencies = [ 1479 | "num-bigint 0.4.6", 1480 | "num-integer", 1481 | "num-traits", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "num-traits" 1486 | version = "0.2.19" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1489 | dependencies = [ 1490 | "autocfg", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "num_cpus" 1495 | version = "1.17.0" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" 1498 | dependencies = [ 1499 | "hermit-abi", 1500 | "libc", 1501 | ] 1502 | 1503 | [[package]] 1504 | name = "num_enum" 1505 | version = "0.7.3" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 1508 | dependencies = [ 1509 | "num_enum_derive", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "num_enum_derive" 1514 | version = "0.7.3" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 1517 | dependencies = [ 1518 | "proc-macro-crate", 1519 | "proc-macro2", 1520 | "quote", 1521 | "syn 2.0.96", 1522 | ] 1523 | 1524 | [[package]] 1525 | name = "numtoa" 1526 | version = "0.2.4" 1527 | source = "registry+https://github.com/rust-lang/crates.io-index" 1528 | checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" 1529 | 1530 | [[package]] 1531 | name = "once_cell" 1532 | version = "1.20.2" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1535 | 1536 | [[package]] 1537 | name = "oorandom" 1538 | version = "11.1.4" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" 1541 | 1542 | [[package]] 1543 | name = "parking_lot_core" 1544 | version = "0.9.10" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1547 | dependencies = [ 1548 | "cfg-if", 1549 | "libc", 1550 | "redox_syscall", 1551 | "smallvec", 1552 | "windows-targets", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "pest" 1557 | version = "2.8.0" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" 1560 | dependencies = [ 1561 | "memchr", 1562 | "thiserror", 1563 | "ucd-trie", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "pest_derive" 1568 | version = "2.8.0" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" 1571 | dependencies = [ 1572 | "pest", 1573 | "pest_generator", 1574 | ] 1575 | 1576 | [[package]] 1577 | name = "pest_generator" 1578 | version = "2.8.0" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" 1581 | dependencies = [ 1582 | "pest", 1583 | "pest_meta", 1584 | "proc-macro2", 1585 | "quote", 1586 | "syn 2.0.96", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "pest_meta" 1591 | version = "2.8.0" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" 1594 | dependencies = [ 1595 | "once_cell", 1596 | "pest", 1597 | "sha2", 1598 | ] 1599 | 1600 | [[package]] 1601 | name = "phf" 1602 | version = "0.11.3" 1603 | source = "registry+https://github.com/rust-lang/crates.io-index" 1604 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1605 | dependencies = [ 1606 | "phf_shared", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "phf_generator" 1611 | version = "0.11.3" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 1614 | dependencies = [ 1615 | "phf_shared", 1616 | "rand 0.8.5", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "phf_macros" 1621 | version = "0.11.3" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" 1624 | dependencies = [ 1625 | "phf_generator", 1626 | "phf_shared", 1627 | "proc-macro2", 1628 | "quote", 1629 | "syn 2.0.96", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "phf_shared" 1634 | version = "0.11.3" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1637 | dependencies = [ 1638 | "siphasher", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "pin-project-lite" 1643 | version = "0.2.16" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1646 | 1647 | [[package]] 1648 | name = "pin-utils" 1649 | version = "0.1.0" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1652 | 1653 | [[package]] 1654 | name = "plotters" 1655 | version = "0.3.7" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 1658 | dependencies = [ 1659 | "num-traits", 1660 | "plotters-backend", 1661 | "plotters-svg", 1662 | "wasm-bindgen", 1663 | "web-sys", 1664 | ] 1665 | 1666 | [[package]] 1667 | name = "plotters-backend" 1668 | version = "0.3.7" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 1671 | 1672 | [[package]] 1673 | name = "plotters-svg" 1674 | version = "0.3.7" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 1677 | dependencies = [ 1678 | "plotters-backend", 1679 | ] 1680 | 1681 | [[package]] 1682 | name = "portable-atomic" 1683 | version = "1.10.0" 1684 | source = "registry+https://github.com/rust-lang/crates.io-index" 1685 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 1686 | 1687 | [[package]] 1688 | name = "portable-atomic-util" 1689 | version = "0.2.4" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 1692 | dependencies = [ 1693 | "portable-atomic", 1694 | ] 1695 | 1696 | [[package]] 1697 | name = "powerfmt" 1698 | version = "0.2.0" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1701 | 1702 | [[package]] 1703 | name = "ppv-lite86" 1704 | version = "0.2.20" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1707 | dependencies = [ 1708 | "zerocopy 0.7.35", 1709 | ] 1710 | 1711 | [[package]] 1712 | name = "pretty_assertions" 1713 | version = "1.4.1" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" 1716 | dependencies = [ 1717 | "diff", 1718 | "yansi", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "proc-macro-crate" 1723 | version = "3.2.0" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 1726 | dependencies = [ 1727 | "toml_edit", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "proc-macro-hack" 1732 | version = "0.5.20+deprecated" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" 1735 | 1736 | [[package]] 1737 | name = "proc-macro-nested" 1738 | version = "0.1.7" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" 1741 | 1742 | [[package]] 1743 | name = "proc-macro2" 1744 | version = "1.0.93" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1747 | dependencies = [ 1748 | "unicode-ident", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "proc-macro2-diagnostics" 1753 | version = "0.10.1" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 1756 | dependencies = [ 1757 | "proc-macro2", 1758 | "quote", 1759 | "syn 2.0.96", 1760 | "version_check", 1761 | "yansi", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "proptest" 1766 | version = "1.6.0" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" 1769 | dependencies = [ 1770 | "bit-set", 1771 | "bit-vec", 1772 | "bitflags", 1773 | "lazy_static", 1774 | "num-traits", 1775 | "rand 0.8.5", 1776 | "rand_chacha 0.3.1", 1777 | "rand_xorshift", 1778 | "regex-syntax", 1779 | "rusty-fork", 1780 | "tempfile", 1781 | "unarray", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "quick-error" 1786 | version = "1.2.3" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1789 | 1790 | [[package]] 1791 | name = "quickcheck" 1792 | version = "1.0.3" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" 1795 | dependencies = [ 1796 | "env_logger", 1797 | "log", 1798 | "rand 0.8.5", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "quickcheck_macros" 1803 | version = "1.1.0" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "f71ee38b42f8459a88d3362be6f9b841ad2d5421844f61eb1c59c11bff3ac14a" 1806 | dependencies = [ 1807 | "proc-macro2", 1808 | "quote", 1809 | "syn 2.0.96", 1810 | ] 1811 | 1812 | [[package]] 1813 | name = "quote" 1814 | version = "1.0.38" 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" 1816 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1817 | dependencies = [ 1818 | "proc-macro2", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "radium" 1823 | version = "0.7.0" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 1826 | 1827 | [[package]] 1828 | name = "rand" 1829 | version = "0.8.5" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1832 | dependencies = [ 1833 | "libc", 1834 | "rand_chacha 0.3.1", 1835 | "rand_core 0.6.4", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "rand" 1840 | version = "0.9.1" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" 1843 | dependencies = [ 1844 | "rand_chacha 0.9.0", 1845 | "rand_core 0.9.0", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "rand_chacha" 1850 | version = "0.3.1" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1853 | dependencies = [ 1854 | "ppv-lite86", 1855 | "rand_core 0.6.4", 1856 | ] 1857 | 1858 | [[package]] 1859 | name = "rand_chacha" 1860 | version = "0.9.0" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1863 | dependencies = [ 1864 | "ppv-lite86", 1865 | "rand_core 0.9.0", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "rand_core" 1870 | version = "0.6.4" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1873 | dependencies = [ 1874 | "getrandom 0.2.15", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "rand_core" 1879 | version = "0.9.0" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" 1882 | dependencies = [ 1883 | "getrandom 0.3.1", 1884 | "zerocopy 0.8.14", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "rand_xorshift" 1889 | version = "0.3.0" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" 1892 | dependencies = [ 1893 | "rand_core 0.6.4", 1894 | ] 1895 | 1896 | [[package]] 1897 | name = "rand_xoshiro" 1898 | version = "0.6.0" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" 1901 | dependencies = [ 1902 | "rand_core 0.6.4", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "rawpointer" 1907 | version = "0.2.1" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" 1910 | 1911 | [[package]] 1912 | name = "rayon" 1913 | version = "1.10.0" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1916 | dependencies = [ 1917 | "either", 1918 | "rayon-core", 1919 | ] 1920 | 1921 | [[package]] 1922 | name = "rayon-core" 1923 | version = "1.12.1" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1926 | dependencies = [ 1927 | "crossbeam-deque", 1928 | "crossbeam-utils", 1929 | ] 1930 | 1931 | [[package]] 1932 | name = "redox_syscall" 1933 | version = "0.5.8" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1936 | dependencies = [ 1937 | "bitflags", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "regex" 1942 | version = "1.11.1" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1945 | dependencies = [ 1946 | "aho-corasick", 1947 | "memchr", 1948 | "regex-automata", 1949 | "regex-syntax", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "regex-automata" 1954 | version = "0.4.9" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1957 | dependencies = [ 1958 | "aho-corasick", 1959 | "memchr", 1960 | "regex-syntax", 1961 | ] 1962 | 1963 | [[package]] 1964 | name = "regex-lite" 1965 | version = "0.1.6" 1966 | source = "registry+https://github.com/rust-lang/crates.io-index" 1967 | checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" 1968 | 1969 | [[package]] 1970 | name = "regex-syntax" 1971 | version = "0.8.5" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1974 | 1975 | [[package]] 1976 | name = "relative-path" 1977 | version = "1.9.3" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" 1980 | 1981 | [[package]] 1982 | name = "rstest" 1983 | version = "0.25.0" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "6fc39292f8613e913f7df8fa892b8944ceb47c247b78e1b1ae2f09e019be789d" 1986 | dependencies = [ 1987 | "futures-timer", 1988 | "futures-util", 1989 | "rstest_macros", 1990 | "rustc_version", 1991 | ] 1992 | 1993 | [[package]] 1994 | name = "rstest_macros" 1995 | version = "0.25.0" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "1f168d99749d307be9de54d23fd226628d99768225ef08f6ffb52e0182a27746" 1998 | dependencies = [ 1999 | "cfg-if", 2000 | "glob", 2001 | "proc-macro-crate", 2002 | "proc-macro2", 2003 | "quote", 2004 | "regex", 2005 | "relative-path", 2006 | "rustc_version", 2007 | "syn 2.0.96", 2008 | "unicode-ident", 2009 | ] 2010 | 2011 | [[package]] 2012 | name = "rstest_reuse" 2013 | version = "0.7.0" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" 2016 | dependencies = [ 2017 | "quote", 2018 | "rand 0.8.5", 2019 | "syn 2.0.96", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "rustc_version" 2024 | version = "0.4.1" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2027 | dependencies = [ 2028 | "semver", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "rustix" 2033 | version = "0.38.43" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" 2036 | dependencies = [ 2037 | "bitflags", 2038 | "errno", 2039 | "libc", 2040 | "linux-raw-sys", 2041 | "windows-sys", 2042 | ] 2043 | 2044 | [[package]] 2045 | name = "rustversion" 2046 | version = "1.0.19" 2047 | source = "registry+https://github.com/rust-lang/crates.io-index" 2048 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 2049 | 2050 | [[package]] 2051 | name = "rusty-fork" 2052 | version = "0.3.0" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" 2055 | dependencies = [ 2056 | "fnv", 2057 | "quick-error", 2058 | "tempfile", 2059 | "wait-timeout", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "ryu" 2064 | version = "1.0.18" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 2067 | 2068 | [[package]] 2069 | name = "same-file" 2070 | version = "1.0.6" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2073 | dependencies = [ 2074 | "winapi-util", 2075 | ] 2076 | 2077 | [[package]] 2078 | name = "scopeguard" 2079 | version = "1.2.0" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2082 | 2083 | [[package]] 2084 | name = "semver" 2085 | version = "1.0.24" 2086 | source = "registry+https://github.com/rust-lang/crates.io-index" 2087 | checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" 2088 | 2089 | [[package]] 2090 | name = "serde" 2091 | version = "1.0.219" 2092 | source = "registry+https://github.com/rust-lang/crates.io-index" 2093 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2094 | dependencies = [ 2095 | "serde_derive", 2096 | ] 2097 | 2098 | [[package]] 2099 | name = "serde_derive" 2100 | version = "1.0.219" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2103 | dependencies = [ 2104 | "proc-macro2", 2105 | "quote", 2106 | "syn 2.0.96", 2107 | ] 2108 | 2109 | [[package]] 2110 | name = "serde_json" 2111 | version = "1.0.136" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" 2114 | dependencies = [ 2115 | "itoa", 2116 | "memchr", 2117 | "ryu", 2118 | "serde", 2119 | ] 2120 | 2121 | [[package]] 2122 | name = "sha2" 2123 | version = "0.10.8" 2124 | source = "registry+https://github.com/rust-lang/crates.io-index" 2125 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2126 | dependencies = [ 2127 | "cfg-if", 2128 | "cpufeatures", 2129 | "digest", 2130 | ] 2131 | 2132 | [[package]] 2133 | name = "shlex" 2134 | version = "1.3.0" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2137 | 2138 | [[package]] 2139 | name = "siphasher" 2140 | version = "1.0.1" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2143 | 2144 | [[package]] 2145 | name = "sized-chunks" 2146 | version = "0.6.5" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" 2149 | dependencies = [ 2150 | "bitmaps", 2151 | "typenum", 2152 | ] 2153 | 2154 | [[package]] 2155 | name = "slab" 2156 | version = "0.4.9" 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" 2158 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2159 | dependencies = [ 2160 | "autocfg", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "smallvec" 2165 | version = "1.13.2" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2168 | 2169 | [[package]] 2170 | name = "spinning_top" 2171 | version = "0.3.0" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" 2174 | dependencies = [ 2175 | "lock_api", 2176 | ] 2177 | 2178 | [[package]] 2179 | name = "static_assertions" 2180 | version = "1.1.0" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2183 | 2184 | [[package]] 2185 | name = "stfu8" 2186 | version = "0.2.7" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" 2189 | 2190 | [[package]] 2191 | name = "strength_reduce" 2192 | version = "0.2.4" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" 2195 | 2196 | [[package]] 2197 | name = "strfmt" 2198 | version = "0.2.4" 2199 | source = "registry+https://github.com/rust-lang/crates.io-index" 2200 | checksum = "7a8348af2d9fc3258c8733b8d9d8db2e56f54b2363a4b5b81585c7875ed65e65" 2201 | 2202 | [[package]] 2203 | name = "strsim" 2204 | version = "0.11.1" 2205 | source = "registry+https://github.com/rust-lang/crates.io-index" 2206 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2207 | 2208 | [[package]] 2209 | name = "strum" 2210 | version = "0.27.1" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" 2213 | 2214 | [[package]] 2215 | name = "strum_macros" 2216 | version = "0.27.1" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" 2219 | dependencies = [ 2220 | "heck", 2221 | "proc-macro2", 2222 | "quote", 2223 | "rustversion", 2224 | "syn 2.0.96", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "subslice" 2229 | version = "0.2.3" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "e0a8e4809a3bb02de01f1f7faf1ba01a83af9e8eabcd4d31dd6e413d14d56aae" 2232 | dependencies = [ 2233 | "memchr", 2234 | ] 2235 | 2236 | [[package]] 2237 | name = "syn" 2238 | version = "1.0.109" 2239 | source = "registry+https://github.com/rust-lang/crates.io-index" 2240 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2241 | dependencies = [ 2242 | "proc-macro2", 2243 | "quote", 2244 | "unicode-ident", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "syn" 2249 | version = "2.0.96" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 2252 | dependencies = [ 2253 | "proc-macro2", 2254 | "quote", 2255 | "unicode-ident", 2256 | ] 2257 | 2258 | [[package]] 2259 | name = "tap" 2260 | version = "1.0.1" 2261 | source = "registry+https://github.com/rust-lang/crates.io-index" 2262 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 2263 | 2264 | [[package]] 2265 | name = "tempfile" 2266 | version = "3.15.0" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" 2269 | dependencies = [ 2270 | "cfg-if", 2271 | "fastrand", 2272 | "getrandom 0.2.15", 2273 | "once_cell", 2274 | "rustix", 2275 | "windows-sys", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "thiserror" 2280 | version = "2.0.12" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 2283 | dependencies = [ 2284 | "thiserror-impl", 2285 | ] 2286 | 2287 | [[package]] 2288 | name = "thiserror-impl" 2289 | version = "2.0.12" 2290 | source = "registry+https://github.com/rust-lang/crates.io-index" 2291 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 2292 | dependencies = [ 2293 | "proc-macro2", 2294 | "quote", 2295 | "syn 2.0.96", 2296 | ] 2297 | 2298 | [[package]] 2299 | name = "threadpool" 2300 | version = "1.8.1" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 2303 | dependencies = [ 2304 | "num_cpus", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "time" 2309 | version = "0.3.41" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 2312 | dependencies = [ 2313 | "deranged", 2314 | "num-conv", 2315 | "powerfmt", 2316 | "serde", 2317 | "time-core", 2318 | ] 2319 | 2320 | [[package]] 2321 | name = "time-core" 2322 | version = "0.1.4" 2323 | source = "registry+https://github.com/rust-lang/crates.io-index" 2324 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 2325 | 2326 | [[package]] 2327 | name = "tinyset" 2328 | version = "0.5.2" 2329 | source = "registry+https://github.com/rust-lang/crates.io-index" 2330 | checksum = "abffc3150284599ddf14202b43742cf6efc731eaa39a851b84e4a98ae88623fe" 2331 | dependencies = [ 2332 | "rand 0.8.5", 2333 | ] 2334 | 2335 | [[package]] 2336 | name = "tinytemplate" 2337 | version = "1.2.1" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" 2340 | dependencies = [ 2341 | "serde", 2342 | "serde_json", 2343 | ] 2344 | 2345 | [[package]] 2346 | name = "tinyvec" 2347 | version = "1.8.1" 2348 | source = "registry+https://github.com/rust-lang/crates.io-index" 2349 | checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 2350 | dependencies = [ 2351 | "tinyvec_macros", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "tinyvec_macros" 2356 | version = "0.1.1" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2359 | 2360 | [[package]] 2361 | name = "toml_datetime" 2362 | version = "0.6.8" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 2365 | 2366 | [[package]] 2367 | name = "toml_edit" 2368 | version = "0.22.22" 2369 | source = "registry+https://github.com/rust-lang/crates.io-index" 2370 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 2371 | dependencies = [ 2372 | "indexmap", 2373 | "toml_datetime", 2374 | "winnow", 2375 | ] 2376 | 2377 | [[package]] 2378 | name = "transpose" 2379 | version = "0.2.3" 2380 | source = "registry+https://github.com/rust-lang/crates.io-index" 2381 | checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" 2382 | dependencies = [ 2383 | "num-integer", 2384 | "strength_reduce", 2385 | ] 2386 | 2387 | [[package]] 2388 | name = "typenum" 2389 | version = "1.17.0" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2392 | 2393 | [[package]] 2394 | name = "ucd-trie" 2395 | version = "0.1.7" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 2398 | 2399 | [[package]] 2400 | name = "unarray" 2401 | version = "0.1.4" 2402 | source = "registry+https://github.com/rust-lang/crates.io-index" 2403 | checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" 2404 | 2405 | [[package]] 2406 | name = "unic-char-property" 2407 | version = "0.9.0" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" 2410 | dependencies = [ 2411 | "unic-char-range", 2412 | ] 2413 | 2414 | [[package]] 2415 | name = "unic-char-range" 2416 | version = "0.9.0" 2417 | source = "registry+https://github.com/rust-lang/crates.io-index" 2418 | checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" 2419 | 2420 | [[package]] 2421 | name = "unic-common" 2422 | version = "0.9.0" 2423 | source = "registry+https://github.com/rust-lang/crates.io-index" 2424 | checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" 2425 | 2426 | [[package]] 2427 | name = "unic-segment" 2428 | version = "0.9.0" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" 2431 | dependencies = [ 2432 | "unic-ucd-segment", 2433 | ] 2434 | 2435 | [[package]] 2436 | name = "unic-ucd-segment" 2437 | version = "0.9.0" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" 2440 | dependencies = [ 2441 | "unic-char-property", 2442 | "unic-char-range", 2443 | "unic-ucd-version", 2444 | ] 2445 | 2446 | [[package]] 2447 | name = "unic-ucd-version" 2448 | version = "0.9.0" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" 2451 | dependencies = [ 2452 | "unic-common", 2453 | ] 2454 | 2455 | [[package]] 2456 | name = "unicase" 2457 | version = "2.8.1" 2458 | source = "registry+https://github.com/rust-lang/crates.io-index" 2459 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2460 | 2461 | [[package]] 2462 | name = "unicode-ident" 2463 | version = "1.0.14" 2464 | source = "registry+https://github.com/rust-lang/crates.io-index" 2465 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 2466 | 2467 | [[package]] 2468 | name = "unicode-normalization" 2469 | version = "0.1.24" 2470 | source = "registry+https://github.com/rust-lang/crates.io-index" 2471 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2472 | dependencies = [ 2473 | "tinyvec", 2474 | ] 2475 | 2476 | [[package]] 2477 | name = "unicode-reverse" 2478 | version = "1.0.9" 2479 | source = "registry+https://github.com/rust-lang/crates.io-index" 2480 | checksum = "4b6f4888ebc23094adfb574fdca9fdc891826287a6397d2cd28802ffd6f20c76" 2481 | dependencies = [ 2482 | "unicode-segmentation", 2483 | ] 2484 | 2485 | [[package]] 2486 | name = "unicode-segmentation" 2487 | version = "1.12.0" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 2490 | 2491 | [[package]] 2492 | name = "unzip-n" 2493 | version = "0.1.2" 2494 | source = "registry+https://github.com/rust-lang/crates.io-index" 2495 | checksum = "c2e7e85a0596447f0f2ac090e16bc4c516c6fe91771fb0c0ccf7fa3dae896b9c" 2496 | dependencies = [ 2497 | "proc-macro2", 2498 | "quote", 2499 | "syn 1.0.109", 2500 | ] 2501 | 2502 | [[package]] 2503 | name = "uuid" 2504 | version = "1.17.0" 2505 | source = "registry+https://github.com/rust-lang/crates.io-index" 2506 | checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 2507 | dependencies = [ 2508 | "js-sys", 2509 | "wasm-bindgen", 2510 | ] 2511 | 2512 | [[package]] 2513 | name = "version_check" 2514 | version = "0.9.5" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2517 | 2518 | [[package]] 2519 | name = "voca_rs" 2520 | version = "1.15.2" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "3e44efbf25e32768d5ecd22244feacc3d3b3eca72d318f5ef0a4764c2c158e18" 2523 | dependencies = [ 2524 | "regex", 2525 | "stfu8", 2526 | "unicode-segmentation", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "wait-timeout" 2531 | version = "0.2.0" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 2534 | dependencies = [ 2535 | "libc", 2536 | ] 2537 | 2538 | [[package]] 2539 | name = "walkdir" 2540 | version = "2.5.0" 2541 | source = "registry+https://github.com/rust-lang/crates.io-index" 2542 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2543 | dependencies = [ 2544 | "same-file", 2545 | "winapi-util", 2546 | ] 2547 | 2548 | [[package]] 2549 | name = "wasi" 2550 | version = "0.11.0+wasi-snapshot-preview1" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2553 | 2554 | [[package]] 2555 | name = "wasi" 2556 | version = "0.13.3+wasi-0.2.2" 2557 | source = "registry+https://github.com/rust-lang/crates.io-index" 2558 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 2559 | dependencies = [ 2560 | "wit-bindgen-rt", 2561 | ] 2562 | 2563 | [[package]] 2564 | name = "wasm-bindgen" 2565 | version = "0.2.100" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2568 | dependencies = [ 2569 | "cfg-if", 2570 | "once_cell", 2571 | "rustversion", 2572 | "wasm-bindgen-macro", 2573 | ] 2574 | 2575 | [[package]] 2576 | name = "wasm-bindgen-backend" 2577 | version = "0.2.100" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2580 | dependencies = [ 2581 | "bumpalo", 2582 | "log", 2583 | "proc-macro2", 2584 | "quote", 2585 | "syn 2.0.96", 2586 | "wasm-bindgen-shared", 2587 | ] 2588 | 2589 | [[package]] 2590 | name = "wasm-bindgen-macro" 2591 | version = "0.2.100" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2594 | dependencies = [ 2595 | "quote", 2596 | "wasm-bindgen-macro-support", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "wasm-bindgen-macro-support" 2601 | version = "0.2.100" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2604 | dependencies = [ 2605 | "proc-macro2", 2606 | "quote", 2607 | "syn 2.0.96", 2608 | "wasm-bindgen-backend", 2609 | "wasm-bindgen-shared", 2610 | ] 2611 | 2612 | [[package]] 2613 | name = "wasm-bindgen-shared" 2614 | version = "0.2.100" 2615 | source = "registry+https://github.com/rust-lang/crates.io-index" 2616 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2617 | dependencies = [ 2618 | "unicode-ident", 2619 | ] 2620 | 2621 | [[package]] 2622 | name = "web-sys" 2623 | version = "0.3.77" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2626 | dependencies = [ 2627 | "js-sys", 2628 | "wasm-bindgen", 2629 | ] 2630 | 2631 | [[package]] 2632 | name = "web-time" 2633 | version = "1.1.0" 2634 | source = "registry+https://github.com/rust-lang/crates.io-index" 2635 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2636 | dependencies = [ 2637 | "js-sys", 2638 | "wasm-bindgen", 2639 | ] 2640 | 2641 | [[package]] 2642 | name = "winapi-util" 2643 | version = "0.1.9" 2644 | source = "registry+https://github.com/rust-lang/crates.io-index" 2645 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2646 | dependencies = [ 2647 | "windows-sys", 2648 | ] 2649 | 2650 | [[package]] 2651 | name = "windows-core" 2652 | version = "0.52.0" 2653 | source = "registry+https://github.com/rust-lang/crates.io-index" 2654 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2655 | dependencies = [ 2656 | "windows-targets", 2657 | ] 2658 | 2659 | [[package]] 2660 | name = "windows-link" 2661 | version = "0.1.0" 2662 | source = "registry+https://github.com/rust-lang/crates.io-index" 2663 | checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" 2664 | 2665 | [[package]] 2666 | name = "windows-sys" 2667 | version = "0.59.0" 2668 | source = "registry+https://github.com/rust-lang/crates.io-index" 2669 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2670 | dependencies = [ 2671 | "windows-targets", 2672 | ] 2673 | 2674 | [[package]] 2675 | name = "windows-targets" 2676 | version = "0.52.6" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2679 | dependencies = [ 2680 | "windows_aarch64_gnullvm", 2681 | "windows_aarch64_msvc", 2682 | "windows_i686_gnu", 2683 | "windows_i686_gnullvm", 2684 | "windows_i686_msvc", 2685 | "windows_x86_64_gnu", 2686 | "windows_x86_64_gnullvm", 2687 | "windows_x86_64_msvc", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "windows_aarch64_gnullvm" 2692 | version = "0.52.6" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2695 | 2696 | [[package]] 2697 | name = "windows_aarch64_msvc" 2698 | version = "0.52.6" 2699 | source = "registry+https://github.com/rust-lang/crates.io-index" 2700 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2701 | 2702 | [[package]] 2703 | name = "windows_i686_gnu" 2704 | version = "0.52.6" 2705 | source = "registry+https://github.com/rust-lang/crates.io-index" 2706 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2707 | 2708 | [[package]] 2709 | name = "windows_i686_gnullvm" 2710 | version = "0.52.6" 2711 | source = "registry+https://github.com/rust-lang/crates.io-index" 2712 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2713 | 2714 | [[package]] 2715 | name = "windows_i686_msvc" 2716 | version = "0.52.6" 2717 | source = "registry+https://github.com/rust-lang/crates.io-index" 2718 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2719 | 2720 | [[package]] 2721 | name = "windows_x86_64_gnu" 2722 | version = "0.52.6" 2723 | source = "registry+https://github.com/rust-lang/crates.io-index" 2724 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2725 | 2726 | [[package]] 2727 | name = "windows_x86_64_gnullvm" 2728 | version = "0.52.6" 2729 | source = "registry+https://github.com/rust-lang/crates.io-index" 2730 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2731 | 2732 | [[package]] 2733 | name = "windows_x86_64_msvc" 2734 | version = "0.52.6" 2735 | source = "registry+https://github.com/rust-lang/crates.io-index" 2736 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2737 | 2738 | [[package]] 2739 | name = "winnow" 2740 | version = "0.6.24" 2741 | source = "registry+https://github.com/rust-lang/crates.io-index" 2742 | checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" 2743 | dependencies = [ 2744 | "memchr", 2745 | ] 2746 | 2747 | [[package]] 2748 | name = "wit-bindgen-rt" 2749 | version = "0.33.0" 2750 | source = "registry+https://github.com/rust-lang/crates.io-index" 2751 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 2752 | dependencies = [ 2753 | "bitflags", 2754 | ] 2755 | 2756 | [[package]] 2757 | name = "wyz" 2758 | version = "0.5.1" 2759 | source = "registry+https://github.com/rust-lang/crates.io-index" 2760 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 2761 | dependencies = [ 2762 | "tap", 2763 | ] 2764 | 2765 | [[package]] 2766 | name = "xvii" 2767 | version = "0.4.1" 2768 | source = "registry+https://github.com/rust-lang/crates.io-index" 2769 | checksum = "19584eefc323032120947667838f42de93de155d532ae816b19073b4598ee5ed" 2770 | 2771 | [[package]] 2772 | name = "yansi" 2773 | version = "1.0.1" 2774 | source = "registry+https://github.com/rust-lang/crates.io-index" 2775 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 2776 | 2777 | [[package]] 2778 | name = "zerocopy" 2779 | version = "0.7.35" 2780 | source = "registry+https://github.com/rust-lang/crates.io-index" 2781 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2782 | dependencies = [ 2783 | "byteorder", 2784 | "zerocopy-derive 0.7.35", 2785 | ] 2786 | 2787 | [[package]] 2788 | name = "zerocopy" 2789 | version = "0.8.14" 2790 | source = "registry+https://github.com/rust-lang/crates.io-index" 2791 | checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" 2792 | dependencies = [ 2793 | "zerocopy-derive 0.8.14", 2794 | ] 2795 | 2796 | [[package]] 2797 | name = "zerocopy-derive" 2798 | version = "0.7.35" 2799 | source = "registry+https://github.com/rust-lang/crates.io-index" 2800 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2801 | dependencies = [ 2802 | "proc-macro2", 2803 | "quote", 2804 | "syn 2.0.96", 2805 | ] 2806 | 2807 | [[package]] 2808 | name = "zerocopy-derive" 2809 | version = "0.8.14" 2810 | source = "registry+https://github.com/rust-lang/crates.io-index" 2811 | checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" 2812 | dependencies = [ 2813 | "proc-macro2", 2814 | "quote", 2815 | "syn 2.0.96", 2816 | ] 2817 | -------------------------------------------------------------------------------- /local-registry/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "dummy_package" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | path = "dummy.rs" 8 | 9 | # IMPORTANT: These dependencies should be kept in sync with the ones at 10 | # https://github.com/exercism/rust-test-runner/blob/main/local-registry/Cargo.toml 11 | # 12 | [dependencies] 13 | anyhow = "1.0.98" 14 | arrayvec = "0.7.6" 15 | arr_macro = "0.2.1" 16 | ascii = "1.1.0" 17 | bigdecimal = "0.4.8" 18 | bimap = "0.6.3" 19 | binary-heap-plus = "0.5.0" 20 | bitflags = "2.9.1" 21 | bit-set = "0.8.0" 22 | bitvec = "1.0.1" 23 | bstr = "1.12.0" 24 | bytecount = "0.6.8" 25 | cached = "0.55.1" 26 | cast = "0.3.0" 27 | chrono = "0.4.41" 28 | convert_case = "0.8.0" 29 | counter = "0.6.0" 30 | criterion = "0.6.0" 31 | crossbeam = "0.8.4" 32 | crossbeam-channel = "0.5.15" 33 | crossbeam-utils = "0.8.21" 34 | dashmap = "6.1.0" 35 | derive_more = "2.0.1" 36 | digits_iterator = "0.1.0" 37 | divisors = "0.2.1" 38 | divrem = "1.0.0" 39 | duplicate = "2.0.0" 40 | easybench = "1.1.1" 41 | either = "1.15.0" 42 | enum-iterator = "2.1.0" 43 | enum-primitive-derive = "0.3.0" 44 | enumset = "1.1.6" 45 | fixedbitset = "0.5.7" 46 | flagset = "0.4.7" 47 | frunk = "0.4.3" 48 | gcd = "2.3.0" 49 | hashbag = "0.1.12" 50 | hexlit = "0.5.5" 51 | if_chain = "1.0.2" 52 | im = "15.1.0" 53 | indexmap = "2.9.0" 54 | indoc = "2.0.6" 55 | integer-sqrt = "0.1.5" 56 | int-enum = "1.2.0" 57 | itertools = "0.14.0" 58 | itoa = "1.0.15" 59 | kmp = "0.1.1" 60 | linked-hash-map = "0.5.6" 61 | linked_hash_set = "0.1.5" 62 | maplit = "1.0.2" 63 | memoize = "0.5.1" 64 | mod_exp = "1.0.1" 65 | modinverse = "0.1.1" 66 | multimap = "0.10.1" 67 | multiset = "0.0.5" 68 | ndarray = "0.16.1" 69 | nom = "8.0.0" 70 | num = "0.4.3" 71 | num-bigint = "0.4.6" 72 | num_cpus = "1.17.0" 73 | num-derive = "0.4.2" 74 | num_enum = "0.7.3" 75 | num-format = "0.4.4" 76 | num-integer = "0.1.46" 77 | numtoa = "0.2.4" 78 | num-traits = "0.2.19" 79 | pest = "2.8.0" 80 | pest_derive = "2.8.0" 81 | phf = "0.11.2" 82 | phf_macros = "0.11.2" 83 | pretty_assertions = "1.4.1" 84 | proptest = "1.6.0" 85 | quickcheck = "1.0.3" 86 | quickcheck_macros = "1.1.0" 87 | rand = "0.9.1" 88 | rand_chacha = "0.9.0" 89 | rayon = "1.10.0" 90 | regex-lite = "0.1.6" 91 | rstest = "0.25.0" 92 | rstest_reuse = "0.7.0" 93 | serde = "1.0.219" 94 | serde_derive = "1.0.173" 95 | spinning_top = "0.3.0" 96 | static_assertions = "1.1.0" 97 | strfmt = "0.2.4" 98 | strum = "0.27.1" 99 | strum_macros = "0.27.1" 100 | subslice = "0.2.3" 101 | thiserror = "2.0.12" 102 | threadpool = "1.8.1" 103 | time = "0.3.41" 104 | tinyset = "0.5.2" 105 | transpose = "0.2.3" 106 | unicase = "2.8.1" 107 | unicode-normalization = "0.1.24" 108 | unicode-reverse = "1.0.9" 109 | unicode-segmentation = "1.12.0" 110 | unic-segment = "0.9.0" 111 | unzip-n = "0.1.2" 112 | uuid = "1.17.0" 113 | voca_rs = "1.15.2" 114 | xvii = "0.4.0" 115 | -------------------------------------------------------------------------------- /local-registry/dummy.rs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/rust-analyzer/fc4f49598cb75655e56dd98be3d5135843370d76/local-registry/dummy.rs -------------------------------------------------------------------------------- /snippets/no_comments/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = 'dummy' 3 | version = '0.1.0' 4 | edition = '2021' 5 | -------------------------------------------------------------------------------- /snippets/no_comments/expected_analysis.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": [] 3 | } -------------------------------------------------------------------------------- /snippets/no_comments/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub fn add(a: i32, b: i32) -> i32 { 2 | a + b 3 | } 4 | -------------------------------------------------------------------------------- /snippets/one_comment/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = 'dummy' 3 | version = '0.1.0' 4 | edition = '2021' 5 | -------------------------------------------------------------------------------- /snippets/one_comment/expected_analysis.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": [ 3 | { 4 | "comment": "rust.general.clippy", 5 | "params": { 6 | "clippy_msg": "warning: `--x` could be misinterpreted as pre-decrement by C programmers, is usually a no-op\n --> src/lib.rs:2:5\n |\n2 | --x\n | ^^^\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_neg\n = note: `#[warn(clippy::double_neg)]` on by default" 7 | }, 8 | "type": "informative" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /snippets/one_comment/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub fn decrement(x: i32) -> i32 { 2 | --x 3 | } 4 | -------------------------------------------------------------------------------- /snippets/two_comments/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = 'dummy' 3 | version = '0.1.0' 4 | edition = '2021' 5 | -------------------------------------------------------------------------------- /snippets/two_comments/expected_analysis.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": [ 3 | { 4 | "comment": "rust.general.clippy", 5 | "params": { 6 | "clippy_msg": "warning: `--x` could be misinterpreted as pre-decrement by C programmers, is usually a no-op\n --> src/lib.rs:2:12\n |\n2 | return --x;\n | ^^^\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_neg\n = note: `#[warn(clippy::double_neg)]` on by default" 7 | }, 8 | "type": "informative" 9 | }, 10 | { 11 | "comment": "rust.general.clippy", 12 | "params": { 13 | "clippy_msg": "warning: unneeded `return` statement\n --> src/lib.rs:2:5\n |\n2 | return --x;\n | ^^^^^^^^^^\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return\n = note: `#[warn(clippy::needless_return)]` on by default\nhelp: remove `return`\n |\n2 - return --x;\n2 + --x\n |" 14 | }, 15 | "type": "informative" 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /snippets/two_comments/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub fn decrement(x: i32) -> i32 { 2 | return --x; 3 | } 4 | -------------------------------------------------------------------------------- /snippets/with_dependency/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "with_dependency" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | itertools = "*" 8 | -------------------------------------------------------------------------------- /snippets/with_dependency/expected_analysis.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": [ 3 | { 4 | "comment": "rust.general.clippy", 5 | "params": { 6 | "clippy_msg": "warning: `--x` could be misinterpreted as pre-decrement by C programmers, is usually a no-op\n --> src/lib.rs:2:5\n |\n2 | --x\n | ^^^\n |\n = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#double_neg\n = note: `#[warn(clippy::double_neg)]` on by default" 7 | }, 8 | "type": "informative" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /snippets/with_dependency/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub fn decrement(x: i32) -> i32 { 2 | --x 3 | } 4 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::{path::Path, process::Command}; 2 | 3 | use anyhow::{Context, Result}; 4 | use serde::Serialize; 5 | 6 | pub fn analyze_exercise(solution_dir: &Path) -> Result { 7 | let manifest_path = solution_dir.join("Cargo.toml"); 8 | 9 | let clippy_output = Command::new("cargo") 10 | .arg("clippy") 11 | .arg("--offline") 12 | .arg("--quiet") // suppress compilation progress output 13 | .arg("--manifest-path") 14 | .arg(manifest_path.display().to_string()) 15 | .output() 16 | .context("failed to run clippy")? 17 | .stderr; 18 | let clippy_output = 19 | String::from_utf8(clippy_output).context("failed to parse clippy output to UTF-8")?; 20 | 21 | let comments = clippy_output 22 | .split("\n\n") 23 | .filter(|s| !s.trim().is_empty()) 24 | .map(Into::into) 25 | .map(AnalysisComment::new) 26 | .collect(); 27 | Ok(AnalysisOutput { comments }) 28 | } 29 | 30 | #[derive(Debug, Clone, PartialEq, Eq, Serialize)] 31 | pub struct AnalysisOutput { 32 | // summary: String, // optional in spec 33 | comments: Vec, 34 | } 35 | 36 | #[derive(Debug, Clone, PartialEq, Eq, Serialize)] 37 | struct AnalysisComment { 38 | comment: WebsiteCopyPointer, 39 | params: ClippyParams, 40 | r#type: AnalysisType, 41 | } 42 | 43 | impl AnalysisComment { 44 | fn new(clippy_msg: String) -> Self { 45 | Self { 46 | comment: WebsiteCopyPointer::GeneralClippy, 47 | params: ClippyParams { clippy_msg }, 48 | r#type: AnalysisType::Informative, 49 | } 50 | } 51 | } 52 | 53 | /// Must reference a comment in the website-copy repo. 54 | /// A dot (`.`) represents a file path separator. 55 | /// https://github.com/exercism/website-copy/tree/main/analyzer-comments/rust 56 | #[derive(Debug, Clone, PartialEq, Eq, Serialize)] 57 | enum WebsiteCopyPointer { 58 | #[serde(rename = "rust.general.clippy")] 59 | GeneralClippy, 60 | } 61 | 62 | #[derive(Debug, Clone, PartialEq, Eq, Serialize)] 63 | struct ClippyParams { 64 | clippy_msg: String, 65 | } 66 | 67 | /// This enum is defined for the sake of completeness and clarity about the 68 | /// analyzer interface. However, only the "informative" type is used for 69 | /// messages generated by clippy. This is because clippy is quite aggressive 70 | /// and we would risk inconveniencing our users if we pushed them to fix every 71 | /// single clippy warning. 72 | #[allow(unused)] 73 | #[derive(Debug, Clone, PartialEq, Eq, Serialize)] 74 | #[serde(rename_all = "lowercase")] 75 | enum AnalysisType { 76 | Essential, 77 | Actionable, 78 | Informative, 79 | Celebratory, 80 | } 81 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::Path}; 2 | 3 | use anyhow::{bail, Context, Result}; 4 | use rust_analyzer::analyze_exercise; 5 | 6 | pub fn main() -> Result<()> { 7 | let args: Vec<_> = std::env::args().skip(1).collect(); 8 | if args.len() != 3 { 9 | bail!("usage:\nrust-analyzer "); 10 | } 11 | 12 | let _slug = &args[0]; 13 | let solution_dir = Path::new(&args[1]); 14 | let output_dir = Path::new(&args[2]); 15 | 16 | if !solution_dir.exists() { 17 | bail!("invalid path: {}", solution_dir.display()); 18 | } 19 | if !output_dir.exists() { 20 | bail!("invalid path: {}", output_dir.display()); 21 | } 22 | 23 | let analysis = analyze_exercise(solution_dir)?; 24 | 25 | let analysis = serde_json::to_string_pretty(&analysis)?; 26 | fs::write(output_dir.join("analysis.json"), &analysis) 27 | .context("failed to write to analysis.json") 28 | } 29 | --------------------------------------------------------------------------------