commit 60a97dc79d778726e30bebd07fa34822ceeae9f0
parent c0544cf7d571e5b075953258873953a8451b2097
Author: Zack Newman <zack@philomathiclife.com>
Date: Sun, 1 Feb 2026 14:58:48 -0700
address false positive lint
Diffstat:
| M | Cargo.toml | | | 99 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
| M | README.md | | | 8 | ++++---- |
| M | src/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> {