base64url_nopad

base64url without padding library.
git clone https://git.philomathiclife.com/repos/base64url_nopad
Log | Files | Refs | README

commit 60a97dc79d778726e30bebd07fa34822ceeae9f0
parent c0544cf7d571e5b075953258873953a8451b2097
Author: Zack Newman <zack@philomathiclife.com>
Date:   Sun,  1 Feb 2026 14:58:48 -0700

address false positive lint

Diffstat:
MCargo.toml | 99++++++++++++++++++++++++++++++++++++++++---------------------------------------
MREADME.md | 8++++----
Msrc/lib.rs | 15++++++---------
3 files changed, 60 insertions(+), 62 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml @@ -9,59 +9,60 @@ license = "MIT OR Apache-2.0" name = "base64url_nopad" readme = "README.md" repository = "https://git.philomathiclife.com/repos/base64url_nopad/" -rust-version = "1.89.0" -version = "0.1.2" +rust-version = "1.93.0" +version = "0.1.3" [lints.rust] -ambiguous_negative_literals = { level = "deny", priority = -1 } -closure_returning_async_block = { level = "deny", priority = -1 } -deprecated_safe = { level = "deny", priority = -1 } -deref_into_dyn_supertrait = { level = "deny", priority = -1 } -ffi_unwind_calls = { level = "deny", priority = -1 } -future_incompatible = { level = "deny", priority = -1 } -#fuzzy_provenance_casts = { level = "deny", priority = -1 } -impl_trait_redundant_captures = { level = "deny", priority = -1 } -keyword_idents = { level = "deny", priority = -1 } -let_underscore = { level = "deny", priority = -1 } -linker_messages = { level = "deny", priority = -1 } -#lossy_provenance_casts = { level = "deny", priority = -1 } -macro_use_extern_crate = { level = "deny", priority = -1 } -meta_variable_misuse = { level = "deny", priority = -1 } -missing_copy_implementations = { level = "deny", priority = -1 } -missing_debug_implementations = { level = "deny", priority = -1 } -missing_docs = { level = "deny", priority = -1 } -#multiple_supertrait_upcastable = { level = "deny", priority = -1 } -#must_not_suspend = { level = "deny", priority = -1 } -non_ascii_idents = { level = "deny", priority = -1 } -#non_exhaustive_omitted_patterns = { level = "deny", priority = -1 } -nonstandard_style = { level = "deny", priority = -1 } -redundant_imports = { level = "deny", priority = -1 } -redundant_lifetimes = { level = "deny", priority = -1 } -refining_impl_trait = { level = "deny", priority = -1 } -rust_2018_compatibility = { level = "deny", priority = -1 } -rust_2018_idioms = { level = "deny", priority = -1 } -rust_2021_compatibility = { level = "deny", priority = -1 } -rust_2024_compatibility = { level = "deny", priority = -1 } -single_use_lifetimes = { level = "deny", priority = -1 } -#supertrait_item_shadowing_definition = { level = "deny", priority = -1 } -#supertrait_item_shadowing_usage = { level = "deny", priority = -1 } -trivial_casts = { level = "deny", priority = -1 } -trivial_numeric_casts = { level = "deny", priority = -1 } -unit_bindings = { level = "deny", priority = -1 } -unknown_or_malformed_diagnostic_attributes = { level = "deny", priority = -1 } -unnameable_types = { level = "deny", priority = -1 } -#unqualified_local_imports = { level = "deny", priority = -1 } -unreachable_pub = { level = "deny", priority = -1 } -unsafe_code = { level = "deny", priority = -1 } -unstable_features = { level = "deny", priority = -1 } +deprecated-safe = { level = "deny", priority = -1 } +future-incompatible = { level = "deny", priority = -1 } +keyword-idents = { level = "deny", priority = -1 } +let-underscore = { level = "deny", priority = -1 } +nonstandard-style = { level = "deny", priority = -1 } +refining-impl-trait = { level = "deny", priority = -1 } +rust-2018-compatibility = { level = "deny", priority = -1 } +rust-2018-idioms = { level = "deny", priority = -1 } +rust-2021-compatibility = { level = "deny", priority = -1 } +rust-2024-compatibility = { level = "deny", priority = -1 } +unknown-or-malformed-diagnostic-attributes = { level = "deny", priority = -1 } unused = { level = "deny", priority = -1 } -unused_crate_dependencies = { level = "deny", priority = -1 } -unused_import_braces = { level = "deny", priority = -1 } -unused_lifetimes = { level = "deny", priority = -1 } -unused_qualifications = { level = "deny", priority = -1 } -unused_results = { level = "deny", priority = -1 } -variant_size_differences = { level = "deny", priority = -1 } warnings = { level = "deny", priority = -1 } +ambiguous-negative-literals = { level = "deny", priority = -1 } +closure-returning-async-block = { level = "deny", priority = -1 } +deprecated-in-future = { level = "deny", priority = -1 } +deref-into-dyn-supertrait = { level = "deny", priority = -1 } +ffi-unwind-calls = { level = "deny", priority = -1 } +#fuzzy-provenance-casts = { level = "deny", priority = -1 } +impl-trait-redundant-captures = { level = "deny", priority = -1 } +linker-messages = { level = "deny", priority = -1 } +#lossy-provenance-casts = { level = "deny", priority = -1 } +macro-use-extern-crate = { level = "deny", priority = -1 } +meta-variable-misuse = { level = "deny", priority = -1 } +missing-copy-implementations = { level = "deny", priority = -1 } +missing-debug-implementations = { level = "deny", priority = -1 } +missing-docs = { level = "deny", priority = -1 } +#multiple-supertrait-upcastable = { level = "deny", priority = -1 } +#must-not-suspend = { level = "deny", priority = -1 } +non-ascii-idents = { level = "deny", priority = -1 } +#non-exhaustive-omitted-patterns = { level = "deny", priority = -1 } +redundant-imports = { level = "deny", priority = -1 } +redundant-lifetimes = { level = "deny", priority = -1 } +#resolving-to-items-shadowing-supertrait-items = { level = "deny", priority = -1 } +#shadowing-supertrait-items = { level = "deny", priority = -1 } +single-use-lifetimes = { level = "deny", priority = -1 } +trivial-casts = { level = "deny", priority = -1 } +trivial-numeric-casts = { level = "deny", priority = -1 } +unit-bindings = { level = "deny", priority = -1 } +unnameable-types = { level = "deny", priority = -1 } +#unqualified-local-imports = { level = "deny", priority = -1 } +unreachable-pub = { level = "deny", priority = -1 } +unsafe-code = { level = "deny", priority = -1 } +unstable-features = { level = "deny", priority = -1 } +unused-crate-dependencies = { level = "deny", priority = -1 } +unused-import-braces = { level = "deny", priority = -1 } +unused-lifetimes = { level = "deny", priority = -1 } +unused-qualifications = { level = "deny", priority = -1 } +unused-results = { level = "deny", priority = -1 } +variant-size-differences = { level = "deny", priority = -1 } [lints.clippy] cargo = { level = "deny", priority = -1 } diff --git a/README.md b/README.md @@ -74,10 +74,10 @@ at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. -Before any PR is sent, `cargo clippy --all-targets`, `cargo test --all-targets`, and `cargo test --doc` should be -run _for each possible combination of "features"_ using the stable and MSRV toolchains. One easy way to achieve this -is by invoking [`ci-cargo`](https://crates.io/crates/ci-cargo) as `ci-cargo clippy --all-targets test --all-targets` -in the `base64url_nopad` directory. +Before any PR is sent, `cargo clippy --all-targets`, `cargo test --all-targets -- --include-ignored`, and +`cargo test --doc` should be run _for each possible combination of "features"_ using the stable and MSRV toolchains. +One easy way to achieve this is by invoking [`ci-cargo`](https://crates.io/crates/ci-cargo) as +`ci-cargo clippy --all-targets test --all-targets --include-ignored` in the `base64url_nopad` directory. Last, `RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features` should be run to ensure documentation can be built. diff --git a/src/lib.rs b/src/lib.rs @@ -45,6 +45,10 @@ //! possible `panic`s are isolated to convenience functions that `panic` instead of error. Strict encoding and //! decoding is performed; thus if an input contains _any_ invalid data, it is guaranteed to fail when decoding //! it (e.g., trailing non-zero bits). +#![expect( + clippy::doc_paragraphs_missing_punctuation, + reason = "false positive for crate documentation having image links" +)] #![no_std] #![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(any(doc, feature = "alloc"))] @@ -1180,7 +1184,6 @@ pub const fn encode_buffer<'a>(input: &[u8], output: &'a mut [u8]) -> &'a mut st /// ); /// # Ok::<_, TryReserveError>(()) /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[expect(unsafe_code, reason = "comment justifies correctness")] #[inline] @@ -1225,7 +1228,6 @@ pub fn try_encode(input: &[u8]) -> Result<String, TryReserveError> { /// "e3t7e3t7e3t7e3t7e3t7e3t7e3t7ew" /// ); /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[expect( clippy::unwrap_used, @@ -1386,7 +1388,6 @@ pub fn encode_write<W: Write>(mut input: &[u8], writer: &mut W) -> fmt::Result { /// assert_eq!(buffer, "AAgCgDe3t7e3t7e3t7e3t7e3t7e3t7e3t7ew"); /// # Ok::<_, TryReserveError>(()) /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[expect(unsafe_code, reason = "comment justifies correctness")] #[expect( @@ -1437,7 +1438,6 @@ pub fn try_encode_append<'a>( /// assert_eq!(buffer, "AAgCgDe3t7e3t7e3t7e3t7e3t7e3t7e3t7ew"); /// # Ok::<_, TryReserveError>(()) /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[inline] pub fn try_encode_append_only(input: &[u8], s: &mut String) -> Result<(), TryReserveError> { @@ -1474,7 +1474,6 @@ pub fn try_encode_append_only(input: &[u8], s: &mut String) -> Result<(), TryRes /// ); /// assert_eq!(buffer, "AAgCgDe3t7e3t7e3t7e3t7e3t7e3t7e3t7ew"); /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[expect( clippy::unwrap_used, @@ -1506,7 +1505,6 @@ pub fn encode_append<'a>(input: &[u8], s: &'a mut String) -> &'a mut str { /// assert_eq!(buffer, "AAgCgDe3t7e3t7e3t7e3t7e3t7e3t7e3t7ew"); /// # Ok::<_, TryReserveError>(()) /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[inline] pub fn encode_append_only(input: &[u8], s: &mut String) { @@ -1594,6 +1592,8 @@ enum FourOrdinal { Fourth, } /// Error returned from [`decode_buffer`] and [`decode`]. +/// +/// Note when [`alloc`](./index.html#alloc) is not enabled, [`Copy`] is also implemented. #[derive(Clone, Debug, Eq, PartialEq)] pub enum DecodeErr { /// The encoded input had an invalid length. @@ -1605,11 +1605,9 @@ pub enum DecodeErr { /// The encoded data contained an invalid `u8`. InvalidByte, /// [`decode`] could not allocate enough memory to contain the decoded data. - #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] TryReserve(TryReserveError), } -#[cfg_attr(docsrs, doc(cfg(not(feature = "alloc"))))] #[cfg(not(feature = "alloc"))] impl Copy for DecodeErr {} impl Display for DecodeErr { @@ -1774,7 +1772,6 @@ pub const fn decode_buffer<'a>( /// assert_eq!(base64url_nopad::decode(b"C8Aa_A--91VZbx0")?, [0x0b, 0xc0, 0x1a, 0xfc, 0x0f, 0xbe, 0xf7, b'U', b'Y', b'o', 0x1d]); /// # Ok::<_, DecodeErr>(()) /// ``` -#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] #[cfg(feature = "alloc")] #[inline] pub fn decode(input: &[u8]) -> Result<Vec<u8>, DecodeErr> {