diff --git a/.github/workflows/audit-check.yml b/.github/workflows/audit-check.yml index 2dc757c..88b318b 100644 --- a/.github/workflows/audit-check.yml +++ b/.github/workflows/audit-check.yml @@ -6,7 +6,7 @@ on: jobs: audit-check: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: checks: write issues: write diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40d9ac8..24db34c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,16 +5,13 @@ on: workflow_dispatch: env: + CARGO_TERM_COLOR: always CI: 1 jobs: clippy: - name: Clippy validation${{ matrix.all-features && ' with all features' || '' }} - strategy: - fail-fast: false - matrix: - all-features: [ false ] - runs-on: ubuntu-latest + name: Clippy validation + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -27,20 +24,21 @@ jobs: cache: false - name: Rust Cache - uses: Swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2.7.7 + uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8 with: - prefix-key: v1-rust - key: all-features-${{ matrix.all-features }} + prefix-key: v2-rust cache-on-failure: true - name: Run clippy uses: clechasseur/rs-clippy-check@23f6dcf86d7e4e0d98b000bba0bb81ac587c44aa # v4.0.2 with: - args: --workspace --all-targets ${{ matrix.all-features && '--all-features' || '' }} -- -D warnings + args: --workspace --all-targets --feature-powerset -- -D warnings + tool: cargo-hack + cache-key: v1-clippy fmt: name: Rustfmt check - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -58,18 +56,14 @@ jobs: args: --all build: - name: Build for Rust ${{ matrix.toolchain }}${{ matrix.experimental && ' (experimental)' || '' }} on ${{ matrix.os }}${{ matrix.ignore-lock && ' without Cargo.lock' || '' }}${{ matrix.all-features && ' with all features' || '' }} + name: Build for Rust ${{ matrix.toolchain }}${{ matrix.experimental && ' (experimental)' || '' }} on ${{ matrix.os }}${{ matrix.ignore-lock && ' without Cargo.lock' || '' }} strategy: fail-fast: false matrix: - toolchain: [ 1.75.0, stable ] - os: [ ubuntu ] + toolchain: [ 1.81.0, stable ] + os: [ ubuntu-24.04 ] ignore-lock: [ false ] - all-features: [ false ] - include: - - experimental: false - runs-on: ${{ matrix.os }}-latest - continue-on-error: ${{ matrix.experimental }} + runs-on: ${{ matrix.os }} steps: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -85,22 +79,21 @@ jobs: cache: false - name: Rust Cache - if: ${{ !matrix.experimental }} - uses: Swatinem/rust-cache@f0deed1e0edfc6a9be95417288c0e1099b1eeec3 # v2.7.7 + uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8 with: - prefix-key: v2-rust - key: ignore-lock-${{ matrix.ignore-lock }}-all-features-${{ matrix.all-features }} + prefix-key: v3-rust + key: ignore-lock-${{ matrix.ignore-lock }} cache-on-failure: true - - name: Install just - uses: taiki-e/install-action@3c8fc6eaa5fcff049bb133c1f540c6c2287a191f # v2.49.10 + - name: Install required tools + uses: taiki-e/install-action@f1390fd0d8205ae79e5e57b1d1e300dceeb4163e # v2.49.44 with: - tool: just + tool: just,cargo-hack env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Run checks - run: just all_features=${{ matrix.all-features }} check + - name: Run checks on feature powerset + run: just check-powerset - name: Run tests - run: just all_features=${{ matrix.all-features }} test + run: just test diff --git a/.gitignore b/.gitignore index 710a684..7c50b35 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,6 @@ target*/ # These are backup files generated by rustfmt **/*.rs.bk -# Files that exist while we run `cargo minimal-versions`/`cargo msrv` -*.msrv-prep*.bak - # MSVC Windows builds of rustc generate these, which store debugging information *.pdb @@ -21,10 +18,15 @@ target*/ # docker-compose.override.yml is meant to be local-only docker-compose.override.yml -# Profiling files generated by cargo-tarpaulin +# Profiling files generated by cargo-tarpaulin and cargo-llvm-cov *.profraw cobertura.xml tarpaulin-report.* +cov.json +codecov.json + +# Local environment overrides +.env # aocf input cache .aocf/cache diff --git a/Cargo.lock b/Cargo.lock index 014db5e..aae83ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,19 +67,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" [[package]] name = "aocf" @@ -117,7 +118,7 @@ version = "0.1.0" dependencies = [ "aoclp", "bit-vec", - "clap 4.5.31", + "clap 4.5.35", "itertools", "paste", "primes", @@ -176,15 +177,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "cc" -version = "1.2.5" +version = "1.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" +checksum = "525046617d8376e3db1deffb079e91cef90a89fc3ca5c185bbf8c9ecdd15cd5c" dependencies = [ "shlex", ] @@ -214,19 +215,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" dependencies = [ "clap_builder", - "clap_derive 4.5.28", + "clap_derive 4.5.32", ] [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" dependencies = [ "anstream", "anstyle", @@ -249,14 +250,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.28" +version = "4.5.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] @@ -286,7 +287,7 @@ dependencies = [ name = "codingquest_clp_solutions" version = "0.1.0" dependencies = [ - "clap 4.5.31", + "clap 4.5.35", "codingquest_clp", "itertools", ] @@ -314,20 +315,20 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -363,9 +364,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -388,7 +389,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -465,9 +478,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -489,9 +502,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -510,9 +523,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -539,7 +552,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] @@ -590,33 +603,33 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" @@ -626,9 +639,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -717,9 +730,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "os_str_bytes" @@ -771,22 +784,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "regex" version = "1.11.1" @@ -818,15 +837,14 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -839,11 +857,11 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "0.38.42" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -852,9 +870,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ "log", "once_cell", @@ -867,15 +885,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -884,41 +902,41 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -934,15 +952,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "spin" -version = "0.9.8" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "stable_deref_trait" @@ -981,7 +993,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] @@ -1003,9 +1015,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.91" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -1032,17 +1044,17 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.2", "once_cell", "rustix", "windows-sys 0.59.0", @@ -1059,9 +1071,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" [[package]] name = "tinystr" @@ -1075,9 +1087,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-xid" @@ -1148,11 +1160,20 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -1270,6 +1291,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -1302,28 +1332,28 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", "synstructure 0.13.1", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", "synstructure 0.13.1", ] @@ -1352,5 +1382,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.91", + "syn 2.0.100", ] diff --git a/Cargo.toml b/Cargo.toml index 8ed7b9d..47e7ca7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,10 @@ members = ["aoclp", "aoclp_solutions", "codingquest_clp", "codingquest_clp_solut default-members = ["aoclp_solutions"] [workspace.dependencies] -anyhow = "1.0.96" +anyhow = "1.0.97" aocf = "0.1.21" bit-vec = "0.8.0" -clap = { version = "4.5.31", features = ["derive"] } +clap = { version = "4.5.35", features = ["derive"] } itertools = "0.14.0" num = "0.4.3" paste = "1.0.15" diff --git a/LICENSE b/LICENSE index 62ec544..f706171 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Charles Lechasseur +Copyright (c) 2024-2025 Charles Lechasseur Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/aoclp/src/looping.rs b/aoclp/src/looping.rs index 319a87c..daccc2d 100644 --- a/aoclp/src/looping.rs +++ b/aoclp/src/looping.rs @@ -93,7 +93,7 @@ where self.len() } - fn last(self) -> Option + fn last(mut self) -> Option where Self: Sized, { @@ -105,7 +105,7 @@ where self.cycle .into_iter() .nth(last_pos_in_cycle) - .or_else(|| self.prefix.last()) + .or_else(|| self.prefix.next_back()) } fn nth(&mut self, n: usize) -> Option { diff --git a/aoclp_solutions/Cargo.toml b/aoclp_solutions/Cargo.toml index 78bb36e..2670a88 100644 --- a/aoclp_solutions/Cargo.toml +++ b/aoclp_solutions/Cargo.toml @@ -2,7 +2,7 @@ name = "aoclp_solutions" version = "0.1.0" edition = "2021" -rust-version = "1.75.0" +rust-version = "1.81.0" [dependencies] aoclp = { path = "../aoclp" } diff --git a/aoclp_solutions/README.md b/aoclp_solutions/README.md index 12ef362..e1e9d13 100644 --- a/aoclp_solutions/README.md +++ b/aoclp_solutions/README.md @@ -4,7 +4,7 @@ My solutions to [Advent of Code](https://adventofcode.com/) puzzles in Rust 🦀 ## Requirements -* [Rust](https://www.rust-lang.org/) 1.75.0 or later +* [Rust](https://www.rust-lang.org/) 1.81.0 or later * [aocf](https://crates.io/crates/aocf) CLI ## Setting your session cookie diff --git a/codingquest_clp_solutions/Cargo.toml b/codingquest_clp_solutions/Cargo.toml index 79da08f..c3193f9 100644 --- a/codingquest_clp_solutions/Cargo.toml +++ b/codingquest_clp_solutions/Cargo.toml @@ -2,7 +2,7 @@ name = "codingquest_clp_solutions" version = "0.1.0" edition = "2021" -rust-version = "1.75.0" +rust-version = "1.81.0" [dependencies] clap = { workspace = true, features = ["derive"] } diff --git a/codingquest_clp_solutions/README.md b/codingquest_clp_solutions/README.md index 2b0e0f9..5420b83 100644 --- a/codingquest_clp_solutions/README.md +++ b/codingquest_clp_solutions/README.md @@ -4,7 +4,7 @@ My solutions to [Coding Quest](https://codingquest.io/) puzzles in Rust 🦀 ## Requirements -* [Rust](https://www.rust-lang.org/) 1.75.0 or later +* [Rust](https://www.rust-lang.org/) 1.81.0 or later ## Saving problem input data diff --git a/justfile b/justfile index 5400f42..9fe799e 100644 --- a/justfile +++ b/justfile @@ -4,9 +4,14 @@ toolchain := "" tool := "cargo" cargo := tool + (if toolchain != "" { " +" + toolchain } else { "" }) +cargo_nightly := cargo + " +nightly" +cargo_hack := cargo + " hack" +cargo_tarpaulin := cargo + " tarpaulin" +cargo_llvm_cov := cargo_nightly + " llvm-cov" all_features := "true" all_features_flag := if all_features == "true" { "--all-features" } else { "" } +feature_powerset_flag := if all_features == "true" { "--feature-powerset" } else { "" } all_targets := "true" all_targets_flag := if all_targets == "true" { "--all-targets" } else { "" } @@ -20,58 +25,81 @@ target_tuple_flag := if target_tuple != "" { "--target " + target_tuple } else { release := "false" release_flag := if release == "true" { "--release" } else { "" } -cargo_tarpaulin := tool + " tarpaulin" +workspace := "true" +package := "" +workspace_flag := if workspace != "true" { "" } else if package != "" { "" } else { "--workspace" } +all_flag := if workspace_flag == "" { "" } else { "--all" } +package_flag := if package != "" { "--package " + package } else { workspace_flag } +package_all_flag := if package != "" { "--package " + package } else { all_flag } +package_only_flag := if package != "" { "--package " + package } else { "" } + +warnings_as_errors := "true" +clippy_flags := if warnings_as_errors == "true" { "-- -D warnings" } else { "" } + +force_prep := "false" +force_prep_flag := if force_prep == "true" { "--force" } else { "" } + +just := "just all_features=" + all_features + " all_targets=" + all_targets + " message_format=" + message_format + " target_tuple=" + target_tuple + " release=" + release + " workspace=" + workspace + " package=" + package + " warnings_as_errors=" + warnings_as_errors + " force_prep=" + force_prep + +skip_test_reqs_value := "running" [private] default: @just --list -# Run main executable -run *extra_args: - {{cargo}} run {{all_features_flag}} {{target_tuple_flag}} {{release_flag}} {{ if extra_args != '' { '-- ' + extra_args } else { '' } }} +@_before-test: +@_after-test: +@_check-test-reqs: + echo '{{ skip_test_reqs_value }}' -_run_solutions bin_name *extra_args: - {{cargo}} run --package {{bin_name}} {{all_features_flag}} {{target_tuple_flag}} {{release_flag}} {{ if extra_args != '' { '-- ' + extra_args } else { '' } }} +@_run-tests *cmd: + {{ if env('CI', '') != '' { cmd } else if `just _check-test-reqs` == skip_test_reqs_value { cmd } else { just + " _run-with-test-reqs " + cmd } }} -# Run AoC solutions executable -@aoc *extra_args: - just _run_solutions aoclp_solutions {{extra_args}} +_run-with-test-reqs *cmd: _before-test && _after-test + {{cmd}} -# Run CodingQuest.io solutions executable -@cq *extra_args: - just _run_solutions codingquest_clp_solutions {{extra_args}} +# Run an executable +run bin_name="" *extra_args: (_run-it "--bin" bin_name extra_args) + +# Run an example +teach example_name *extra_args: (_run-it "--example" example_name extra_args) -# Run clippy and rustfmt on workspace files +_run-it run_param run_param_value *extra_args: + {{cargo}} run {{package_only_flag}} {{all_features_flag}} {{target_tuple_flag}} {{release_flag}} {{ if run_param_value != '' { run_param + ' ' + run_param_value } else { '' } }} {{ if extra_args != '' { '-- ' + extra_args } else { '' } }} + +# Run `cargo hack clippy` for the feature powerset and rustfmt tidy: clippy fmt -# Run clippy on workspace files -clippy: - {{cargo}} clippy --workspace {{all_targets_flag}} {{all_features_flag}} {{target_tuple_flag}} -- -D warnings +# Run `cargo hack clippy` for the feature powerset +clippy *extra_args: + {{cargo_hack}} clippy {{package_flag}} {{all_targets_flag}} {{feature_powerset_flag}} {{message_format_flag}} {{target_tuple_flag}} {{extra_args}} {{clippy_flags}} -# Run rustfmt on workspace files -fmt: - cargo +nightly fmt --all +# Run rustfmt +fmt *extra_args: + {{cargo_nightly}} fmt {{package_all_flag}} {{message_format_flag}} {{extra_args}} -# Run `cargo check` on workspace +# Run `cargo check` check *extra_args: - {{cargo}} check --workspace {{all_targets_flag}} {{all_features_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} + {{cargo}} check {{package_flag}} {{all_targets_flag}} {{all_features_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} + +# Run `cargo hack check` for the feature powerset +check-powerset *extra_args: + {{cargo_hack}} check {{package_flag}} --no-dev-deps --lib --bins {{feature_powerset_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} -# Run `cargo build` on workspace +# Run `cargo build` build *extra_args: - {{cargo}} build --workspace {{all_targets_flag}} {{all_features_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} + {{cargo}} build {{package_flag}} {{all_targets_flag}} {{all_features_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} -# Run `cargo test` on workspace -test *extra_args: - {{cargo}} test --workspace {{all_features_flag}} {{message_format_flag}} {{target_tuple_flag}} {{release_flag}} {{extra_args}} +# Run `cargo test` +@test *extra_args: (_run-tests cargo "test" package_flag all_features_flag message_format_flag target_tuple_flag release_flag extra_args) # Run `cargo update` to update dependencies in Cargo.lock update *extra_args: {{cargo}} update {{extra_args}} # Run `cargo tarpaulin` to produce code coverage -@tarpaulin *extra_args: - @{{cargo_tarpaulin}} --target-dir target-tarpaulin {{extra_args}} - {{ if env('CI', '') == '' { `just _open-tarpaulin` } else { ` ` } }} +@tarpaulin *extra_args: (_run-tests cargo_tarpaulin "--target-dir target/tarpaulin-target" extra_args) + {{ if env('CI', '') == '' { "just _open-tarpaulin" } else { "" } }} [unix] @_open-tarpaulin: @@ -81,54 +109,58 @@ update *extra_args: @_open-tarpaulin: ./tarpaulin-report.html +# Run `cargo llvm-cov` to produce code coverage +@llvm-cov *extra_args: (_run-tests cargo_llvm_cov "--codecov --output-path codecov.json" package_flag all_targets_flag all_features_flag target_tuple_flag extra_args) + {{cargo_llvm_cov}} report --html {{ if env('CI', '') == '' { '--open' } else { '' } }} + # Generate documentation with rustdoc doc: _doc _doc $RUSTDOCFLAGS="-D warnings": - {{cargo}} doc {{ if env('CI', '') != '' { '--no-deps' } else { '--open' } }} --workspace {{all_features_flag}} {{message_format_flag}} + {{cargo}} doc {{ if env('CI', '') != '' { '--no-deps' } else { '--open' } }} {{package_flag}} {{all_features_flag}} {{message_format_flag}} # Check doc coverage with Nightly rustdoc doc-coverage: _doc-coverage _doc-coverage $RUSTDOCFLAGS="-Z unstable-options --show-coverage": - cargo +nightly doc --no-deps --workspace {{all_features_flag}} {{message_format_flag}} + {{cargo_nightly}} doc --no-deps {{package_flag}} {{all_features_flag}} {{message_format_flag}} [private] minimize: - {{cargo}} hack --remove-dev-deps --workspace - cargo +nightly update -Z minimal-versions + {{cargo_hack}} --remove-dev-deps {{package_flag}} + {{cargo_nightly}} update -Z minimal-versions -# Run `cargo minimal-versions check` on workspace -check-minimal: prep _check-minimal-only && (_rimraf "target-minimal") unprep +# Run `cargo minimal-versions check` +check-minimal: prep _check-minimal-only && unprep -_check-minimal-only: (_rimraf "target-minimal") - {{cargo}} minimal-versions check --target-dir target-minimal --workspace --lib --bins {{all_features_flag}} {{message_format_flag}} +_check-minimal-only: (_rimraf "target/check-minimal-target") + {{cargo}} minimal-versions check --target-dir target/check-minimal-target {{package_flag}} --lib --bins {{all_features_flag}} {{message_format_flag}} # Run `cargo msrv` with `cargo minimal-versions check` -msrv-minimal: (prep "--manifest-backup-suffix .msrv-prep.outer.bak") && (_rimraf "target-minimal") (unprep "--manifest-backup-suffix .msrv-prep.outer.bak") - {{cargo}} msrv find -- just all_features="{{all_features}}" message_format="{{message_format}}" target_tuple="{{target_tuple}}" _check-minimal-only +msrv-minimal: (prep "--manifest-backup-suffix .msrv-prep.outer.bak") && (unprep "--manifest-backup-suffix .msrv-prep.outer.bak") + {{cargo}} msrv find -- {{just}} _check-minimal-only # Run `cargo msrv` with `cargo check` -msrv *extra_args: (prep "--manifest-backup-suffix .msrv-prep.outer.bak --no-merge-pinned-dependencies") && (_rimraf "target-msrv") (unprep "--manifest-backup-suffix .msrv-prep.outer.bak") - {{cargo}} msrv find -- just all_features="{{all_features}}" all_targets="{{all_targets}}" message_format="{{message_format}}" target_tuple="{{target_tuple}}" _msrv-check {{extra_args}} +msrv *extra_args: (prep "--manifest-backup-suffix .msrv-prep.outer.bak --no-merge-pinned-dependencies") && (unprep "--manifest-backup-suffix .msrv-prep.outer.bak") + {{cargo}} msrv find -- {{just}} _msrv-check {{extra_args}} -_msrv-check *extra_args: (_rimraf "target-msrv") - just all_features="{{all_features}}" all_targets="{{all_targets}}" message_format="{{message_format}}" target_tuple="{{target_tuple}}" check --target-dir target-msrv {{extra_args}} +_msrv-check *extra_args: (_rimraf "target/msrv-target") (check "--target-dir target/msrv-target" extra_args) -# Perform `cargo publish` dry-run +# Perform `cargo publish` dry-run on a package test-package *extra_args: - {{cargo}} publish --dry-run {{extra_args}} + {{cargo}} publish {{package_flag}} --dry-run {{extra_args}} -# Run `cargo msrv-prep` on workspace +# Run `cargo msrv-prep` prep *extra_args: - {{cargo}} msrv-prep --workspace {{extra_args}} + {{cargo}} msrv-prep {{package_flag}} --backup-root-manifest {{force_prep_flag}} {{extra_args}} -# Run `cargo msrv-unprep` on workspace +# Run `cargo msrv-unprep` unprep *extra_args: - {{cargo}} msrv-unprep --workspace {{extra_args}} + {{cargo}} msrv-unprep {{package_flag}} --backup-root-manifest {{extra_args}} # ----- Utilities ----- +# Removes a directory (like `rm -rf`) @_rimraf target_dir: {{ if path_exists(target_dir) == "true" { "just _rimraf-it '" + target_dir + "'" } else { "" } }} @@ -139,3 +171,18 @@ unprep *extra_args: [windows] @_rimraf-it target_dir: Remove-Item "{{target_dir}}" -Recurse + +# Prints state of docker container to stdout +@_check-container-state name: + docker container ls --filter "name={{name}}" --format "{{{{.State}}" + +# ----- Project-specific recipes ----- + +_run_solutions bin_name *extra_args: + {{cargo}} run --package {{bin_name}} {{all_features_flag}} {{target_tuple_flag}} {{release_flag}} {{ if extra_args != '' { '-- ' + extra_args } else { '' } }} + +# Run AoC solutions executable +aoc *extra_args: (_run_solutions "aoclp_solutions" extra_args) + +# Run CodingQuest.io solutions executable +cq *extra_args: (_run_solutions "codingquest_clp_solutions" extra_args)