diff --git a/.cspell.yml b/.cspell.yml new file mode 100644 index 0000000..0b2507e --- /dev/null +++ b/.cspell.yml @@ -0,0 +1,5 @@ +version: 0.2 +words: + - bytesize + - quickcheck + - serde diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..25306e1 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + - package-ecosystem: cargo + directory: / + schedule: + interval: monthly diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 32f5b0d..ae42350 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,16 +41,16 @@ jobs: runs-on: ${{ matrix.os.runner }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust (${{ matrix.toolchain.name }}) - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: toolchain: ${{ matrix.toolchain.version }} target: thumbv6m-none-eabi - name: Install just, nextest - uses: taiki-e/install-action@v2.44.25 + uses: taiki-e/install-action@v2.58.29 with: tool: just,nextest diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 7d455eb..d582663 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -15,15 +15,15 @@ jobs: coverage: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: components: llvm-tools-preview - name: Install just & cargo-llvm-cov - uses: taiki-e/install-action@v2.44.5 + uses: taiki-e/install-action@v2.58.29 with: tool: just,cargo-llvm-cov @@ -31,7 +31,7 @@ jobs: run: just test-coverage-codecov - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4.5.0 + uses: codecov/codecov-action@v5.5.0 with: fail_ci_if_error: true files: codecov.json diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 66e397c..7e4abcf 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -20,15 +20,15 @@ jobs: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: components: clippy - name: Install just, cargo-hack - uses: taiki-e/install-action@v2.44.25 + uses: taiki-e/install-action@v2.58.29 with: tool: just,cargo-hack @@ -38,10 +38,10 @@ jobs: rustfmt: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust (nightly) - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: toolchain: nightly components: rustfmt @@ -52,10 +52,10 @@ jobs: docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust (nightly) - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: toolchain: nightly components: rust-docs @@ -68,15 +68,15 @@ jobs: sorted-deps: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Rust - uses: actions-rust-lang/setup-rust-toolchain@v1.10.1 + uses: actions-rust-lang/setup-rust-toolchain@v1.14.1 with: components: clippy - name: Install just, cargo-sort - uses: taiki-e/install-action@v2.44.25 + uses: taiki-e/install-action@v2.58.29 with: tool: just,cargo-sort diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bc4ca1..ecab778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +## 2.1.0 + +- Support parsing and formatting exabytes (EB) & exbibytes (EiB). +- Migrate `serde` dependency to `serde_core`. + ## 2.0.1 - Add support for precision in `Display` implementations. diff --git a/Cargo.lock b/Cargo.lock index 8f3bd33..bc34c91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,54 +13,55 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bytesize" -version = "2.0.1" +version = "2.1.0" dependencies = [ "arbitrary", "divan", "quickcheck", "serde", + "serde_core", "serde_json", "toml", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "clap" -version = "4.5.30" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstyle", "clap_lex", @@ -69,9 +70,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "condtype" @@ -81,9 +82,9 @@ checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" [[package]] name = "divan" -version = "0.1.17" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0583193020b29b03682d8d33bb53a5b0f50df6daacece12ca99b904cfdcb8c4" +checksum = "a405457ec78b8fe08b0e32b4a3570ab5dff6dd16eb9e76a5ee0a9d9cbd898933" dependencies = [ "cfg-if", "clap", @@ -95,9 +96,9 @@ dependencies = [ [[package]] name = "divan-macros" -version = "0.1.17" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc51d98e636f5e3b0759a39257458b22619cac7e96d932da6eeb052891bb67c" +checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323" dependencies = [ "proc-macro2", "quote", @@ -122,19 +123,19 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.0", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -143,15 +144,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "indexmap" -version = "2.7.1" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" dependencies = [ "equivalent", "hashbrown", @@ -159,39 +160,39 @@ 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.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "log" -version = "0.4.26" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -209,9 +210,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -236,9 +237,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -248,9 +249,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -259,49 +260,59 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.0", ] [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" dependencies = [ "proc-macro2", "quote", @@ -310,30 +321,31 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" dependencies = [ "serde", ] [[package]] name = "syn" -version = "2.0.98" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -342,75 +354,102 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ "rustix", - "windows-sys", + "windows-sys 0.60.2", ] [[package]] name = "toml" -version = "0.8.20" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" dependencies = [ + "indexmap", "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_parser", + "toml_writer", + "winnow", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" dependencies = [ "serde", ] [[package]] -name = "toml_edit" -version = "0.22.24" +name = "toml_parser" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", "winnow", ] +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" -version = "0.52.6" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link 0.1.3", "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", @@ -423,57 +462,54 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" -version = "0.52.6" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" -dependencies = [ - "memchr", -] +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" diff --git a/Cargo.toml b/Cargo.toml index 054096f..b1a1dff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bytesize" description = "Semantic wrapper for byte count representations" -version = "2.0.1" +version = "2.1.0" authors = [ "Hyunsik Choi ", "MrCroxx ", @@ -14,22 +14,28 @@ license = "Apache-2.0" edition = "2021" rust-version = "1.70" +[package.metadata.cargo_check_external_types] +allowed_external_types = ["arbitrary::*", "serde_core::*"] + +[package.metadata.docs.rs] +all-features = true + [features] default = ["std"] std = [] arbitrary = ["dep:arbitrary"] -serde = ["dep:serde"] +serde = ["dep:serde_core"] [dependencies] arbitrary = { version = "1", optional = true } -serde = { version = "1", optional = true } +serde_core = { version = "1", optional = true } [dev-dependencies] divan = "0.1" quickcheck = "1" serde = { version = "1", features = ["derive"] } serde_json = "1" -toml = "0.8" +toml = "0.9" [[bench]] name = "display" diff --git a/README.md b/README.md index b00a7e6..ad45667 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ [![crates.io](https://img.shields.io/crates/v/bytesize?label=latest)](https://crates.io/crates/bytesize) -[![Documentation](https://docs.rs/bytesize/badge.svg?version=2.0.1)](https://docs.rs/bytesize/2.0.1) +[![Documentation](https://docs.rs/bytesize/badge.svg?version=2.1.0)](https://docs.rs/bytesize/2.1.0) ![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg) ![Apache 2.0 licensed](https://img.shields.io/crates/l/bytesize.svg)
-[![Dependency Status](https://deps.rs/crate/bytesize/2.0.1/status.svg)](https://deps.rs/crate/bytesize/2.0.1) +[![Dependency Status](https://deps.rs/crate/bytesize/2.1.0/status.svg)](https://deps.rs/crate/bytesize/2.1.0) [![Download](https://img.shields.io/crates/d/bytesize.svg)](https://crates.io/crates/bytesize) diff --git a/src/display.rs b/src/display.rs index 43ad24f..0cb2e62 100644 --- a/src/display.rs +++ b/src/display.rs @@ -76,7 +76,7 @@ pub struct Display { impl Display { /// Format using IEC (binary) units. /// - /// E.g., `4.2 MiB`. + /// E.g., `11.8 MiB`. #[must_use] #[doc(alias = "binary")] pub fn iec(mut self) -> Self { @@ -86,7 +86,7 @@ impl Display { /// Format using a short style and IEC (binary) units. /// - /// E.g., `4.2 MB`. + /// E.g., `11.8M`. /// /// Designed to produce output compatible with `sort -h`. #[must_use] @@ -98,7 +98,7 @@ impl Display { /// Format using SI (decimal) units. /// - /// E.g., `4.2M`. + /// E.g., `12.3 MB`. #[must_use] #[doc(alias = "decimal")] pub fn si(mut self) -> Self { @@ -108,7 +108,7 @@ impl Display { /// Format using a short style and SI (decimal) units. /// - /// E.g., `4.2M`. + /// E.g., `12.3M`. #[must_use] #[doc(alias = "decimal")] pub fn si_short(mut self) -> Self { @@ -298,8 +298,8 @@ mod tests { #[test] fn precision() { let size = ByteSize::mib(1908); - assert_eq!("1.9 GiB".to_string(), format!("{}", size)); - assert_eq!("2 GiB".to_string(), format!("{:.0}", size)); - assert_eq!("1.86328 GiB".to_string(), format!("{:.5}", size)); + assert_eq!("1.9 GiB".to_string(), format!("{size}")); + assert_eq!("2 GiB".to_string(), format!("{size:.0}")); + assert_eq!("1.86328 GiB".to_string(), format!("{size:.5}")); } } diff --git a/src/lib.rs b/src/lib.rs index 8e3709c..49e98f0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ //! //! Features: //! -//! - Pre-defined constants for various size units (e.g., B, Kb, Kib, Mb, Mib, Gb, Gib, ... PB). +//! - Pre-defined constants for various size units (e.g., B, KB, KiB, MB, MiB, ... EB, EiB). //! - `ByteSize` type which presents size units convertible to different size units. //! - Arithmetic operations for `ByteSize`. //! - `FromStr` impl for `ByteSize`, allowing for parsing string size representations like "1.5KiB" @@ -68,6 +68,8 @@ pub const GB: u64 = 1_000_000_000; pub const TB: u64 = 1_000_000_000_000; /// Number of bytes in 1 petabyte. pub const PB: u64 = 1_000_000_000_000_000; +/// Number of bytes in 1 exabyte. +pub const EB: u64 = 1_000_000_000_000_000_000; /// Number of bytes in 1 kibibyte. pub const KIB: u64 = 1_024; @@ -79,6 +81,8 @@ pub const GIB: u64 = 1_073_741_824; pub const TIB: u64 = 1_099_511_627_776; /// Number of bytes in 1 pebibyte. pub const PIB: u64 = 1_125_899_906_842_624; +/// Number of bytes in 1 exbibyte. +pub const EIB: u64 = 1_152_921_504_606_846_976; /// IEC (binary) units. /// @@ -146,6 +150,16 @@ pub fn pib>(size: V) -> u64 { size.into() * PIB } +/// Converts a quantity of exabytes to bytes. +pub fn eb>(size: V) -> u64 { + size.into() * EB +} + +/// Converts a quantity of exbibytes to bytes. +pub fn eib>(size: V) -> u64 { + size.into() * EIB +} + /// Byte size representation. #[derive(Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Default)] pub struct ByteSize(pub u64); @@ -217,6 +231,18 @@ impl ByteSize { ByteSize(size * PIB) } + /// Constructs a byte size wrapper from a quantity of exabytes. + #[inline(always)] + pub const fn eb(size: u64) -> ByteSize { + ByteSize(size * EB) + } + + /// Constructs a byte size wrapper from a quantity of exbibytes. + #[inline(always)] + pub const fn eib(size: u64) -> ByteSize { + ByteSize(size * EIB) + } + /// Returns byte count. #[inline(always)] pub const fn as_u64(&self) -> u64 { @@ -459,11 +485,12 @@ mod tests { assert!(ByteSize::mb(1) != ByteSize::kib(1024)); assert!(ByteSize::mb(1) < ByteSize::kib(1024)); assert!(ByteSize::b(0) < ByteSize::tib(1)); + assert!(ByteSize::pib(1) < ByteSize::eb(1)); } #[track_caller] fn assert_display(expected: &str, b: ByteSize) { - assert_eq!(expected, format!("{}", b)); + assert_eq!(expected, format!("{b}")); } #[test] @@ -475,6 +502,7 @@ mod tests { assert_display("518.0 GiB", ByteSize::gib(518)); assert_display("815.0 TiB", ByteSize::tib(815)); assert_display("609.0 PiB", ByteSize::pib(609)); + assert_display("15.0 EiB", ByteSize::eib(15)); } #[test] diff --git a/src/parse.rs b/src/parse.rs index 012aa28..a33710e 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -17,15 +17,11 @@ impl str::FromStr for ByteSize { match suffix.parse::() { Ok(u) => Ok(Self((v * u) as u64)), Err(error) => Err(format!( - "couldn't parse {:?} into a known SI unit, {}", - suffix, error + "couldn't parse {suffix:?} into a known SI unit, {error}" )), } } - Err(error) => Err(format!( - "couldn't parse {:?} into a ByteSize, {}", - value, error - )), + Err(error) => Err(format!("couldn't parse {value:?} into a ByteSize, {error}")), } } } @@ -62,12 +58,14 @@ enum Unit { GigaByte, TeraByte, PetaByte, + ExaByte, // power of twos KibiByte, MebiByte, GibiByte, TebiByte, PebiByte, + ExbiByte, } impl Unit { @@ -80,12 +78,14 @@ impl Unit { Self::GigaByte => crate::GB, Self::TeraByte => crate::TB, Self::PetaByte => crate::PB, + Self::ExaByte => crate::EB, // binary units Self::KibiByte => crate::KIB, Self::MebiByte => crate::MIB, Self::GibiByte => crate::GIB, Self::TebiByte => crate::TIB, Self::PebiByte => crate::PIB, + Self::ExbiByte => crate::EIB, } } } @@ -171,13 +171,15 @@ impl str::FromStr for Unit { "g" | "gb" => Ok(Self::GigaByte), "t" | "tb" => Ok(Self::TeraByte), "p" | "pb" => Ok(Self::PetaByte), + "e" | "eb" => Ok(Self::ExaByte), // power of twos "ki" | "kib" => Ok(Self::KibiByte), "mi" | "mib" => Ok(Self::MebiByte), "gi" | "gib" => Ok(Self::GibiByte), "ti" | "tib" => Ok(Self::TebiByte), "pi" | "pib" => Ok(Self::PebiByte), - _ => Err(format!("couldn't parse unit of {:?}", unit)), + "ei" | "eib" => Ok(Self::ExbiByte), + _ => Err(format!("couldn't parse unit of {unit:?}")), } } } diff --git a/src/serde.rs b/src/serde.rs index 1933898..de588b6 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -1,7 +1,7 @@ use alloc::string::{String, ToString as _}; use core::fmt; -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +use serde_core::{de, Deserialize, Deserializer, Serialize, Serializer}; use crate::ByteSize; @@ -71,6 +71,8 @@ impl Serialize for ByteSize { mod tests { use super::*; + use serde::{Deserialize, Serialize}; + #[test] fn test_serde() { #[derive(Serialize, Deserialize)]