diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fa3b78..35e70c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [0.24.10] - 2025-10-26 + +### Fixed +- Removed the deprecated `doc_auto_cfg` rustdoc feature gate so documentation + builds succeed on the docs.rs nightly toolchain again. + ## [0.24.9] - 2025-10-25 ### Fixed diff --git a/Cargo.lock b/Cargo.lock index ea54a92..ace4d34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1806,7 +1806,7 @@ dependencies = [ [[package]] name = "masterror" -version = "0.24.9" +version = "0.24.10" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 0cc6195..030778d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "masterror" -version = "0.24.9" +version = "0.24.10" rust-version = "1.90" edition = "2024" license = "MIT OR Apache-2.0" diff --git a/README.md b/README.md index ff235d9..68640d7 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,9 @@ The build script keeps the full feature snippet below in sync with ~~~toml [dependencies] -masterror = { version = "0.24.9", default-features = false } +masterror = { version = "0.24.10", default-features = false } # or with features: -# masterror = { version = "0.24.9", features = [ +# masterror = { version = "0.24.10", features = [ # "std", "axum", "actix", "openapi", # "serde_json", "tracing", "metrics", "backtrace", # "sqlx", "sqlx-migrate", "reqwest", "redis", @@ -446,4 +446,3 @@ assert_eq!(problem.grpc.expect("grpc").name, "UNAUTHENTICATED"); --- MSRV: **1.90** · License: **MIT OR Apache-2.0** · No `unsafe` - diff --git a/src/convert/axum.rs b/src/convert/axum.rs index d0e5af5..d1fd3ab 100644 --- a/src/convert/axum.rs +++ b/src/convert/axum.rs @@ -47,7 +47,8 @@ use axum::{ use crate::{AppError, response::ProblemJson}; impl AppError { - /// Map this error to an HTTP status derived from its [`AppErrorKind`]. + /// Map this error to an HTTP status derived from its + /// [`crate::AppErrorKind`]. /// /// This is the transport-specific view over the framework-agnostic /// `AppErrorKind::http_status()` mapping. diff --git a/src/convert/redis.rs b/src/convert/redis.rs index 7a4a99c..a430071 100644 --- a/src/convert/redis.rs +++ b/src/convert/redis.rs @@ -38,7 +38,7 @@ use redis::{ErrorKind, RedisError, RetryMethod}; #[cfg(feature = "redis")] use crate::{AppErrorKind, Context, Error, field}; -/// Map any [`redis::RedisError`] into an [`AppError`] with kind `Cache`. +/// Map any [`redis::RedisError`] into an [`crate::AppError`] with kind `Cache`. /// /// Rationale: Redis is treated as a backend cache dependency. /// Detailed driver errors are kept in the message for diagnostics. diff --git a/src/convert/reqwest.rs b/src/convert/reqwest.rs index 5fa756e..bf59652 100644 --- a/src/convert/reqwest.rs +++ b/src/convert/reqwest.rs @@ -49,7 +49,8 @@ use reqwest::{Error as ReqwestError, StatusCode}; use crate::{AppErrorKind, Context, Error, FieldRedaction, field}; -/// Map a [`reqwest::Error`] into an [`Error`] according to its category. +/// Map a [`reqwest::Error`] into an [`struct@crate::Error`] according to its +/// category. /// /// - Timeout → `Timeout` /// - Connect or request build error → `Network` diff --git a/src/convert/serde_json.rs b/src/convert/serde_json.rs index bd22754..092df46 100644 --- a/src/convert/serde_json.rs +++ b/src/convert/serde_json.rs @@ -39,7 +39,7 @@ use serde_json::{Error as SjError, error::Category}; #[cfg(feature = "serde_json")] use crate::{AppErrorKind, Context, Error, field}; -/// Map a [`serde_json::Error`] into an [`AppError`]. +/// Map a [`serde_json::Error`] into an [`crate::AppError`]. /// /// Errors are classified to `Serialization` or `Deserialization` using /// [`serde_json::Error::classify`]. The original error string is preserved for diff --git a/src/convert/sqlx.rs b/src/convert/sqlx.rs index 33c8695..6e54aaf 100644 --- a/src/convert/sqlx.rs +++ b/src/convert/sqlx.rs @@ -53,7 +53,7 @@ const SQLSTATE_CODE_OVERRIDES: &[(&str, AppCode)] = &[ #[cfg(feature = "sqlx")] const SQLSTATE_RETRY_HINTS: &[(&str, u64)] = &[("40001", 1), ("55P03", 1)]; -/// Map a `sqlx_core::error::Error` into [`Error`]. +/// Map a `sqlx_core::error::Error` into [`struct@crate::Error`]. /// /// - `RowNotFound` → `AppErrorKind::NotFound` /// - database constraint errors attach SQLSTATE and constraint metadata @@ -71,7 +71,7 @@ impl From for Error { } } -/// Map a `sqlx::migrate::MigrateError` into [`Error`]. +/// Map a `sqlx::migrate::MigrateError` into [`struct@crate::Error`]. /// /// Errors are categorised as `Database` with metadata describing the failing /// migration phase. diff --git a/src/convert/telegram_webapp_sdk.rs b/src/convert/telegram_webapp_sdk.rs index d5529b0..42d5d60 100644 --- a/src/convert/telegram_webapp_sdk.rs +++ b/src/convert/telegram_webapp_sdk.rs @@ -41,7 +41,8 @@ use telegram_webapp_sdk::utils::validate_init_data::ValidationError; #[cfg(feature = "telegram-webapp-sdk")] use crate::{AppErrorKind, Context, Error, field}; -/// Map [`ValidationError`] into an [`AppError`] with kind `TelegramAuth`. +/// Map [`ValidationError`] into an [`crate::AppError`] with kind +/// `TelegramAuth`. #[cfg(feature = "telegram-webapp-sdk")] #[cfg_attr(docsrs, doc(cfg(feature = "telegram-webapp-sdk")))] impl From for Error { diff --git a/src/convert/tokio.rs b/src/convert/tokio.rs index f436017..41a591b 100644 --- a/src/convert/tokio.rs +++ b/src/convert/tokio.rs @@ -38,7 +38,7 @@ use tokio::time::error::Elapsed; #[cfg(feature = "tokio")] use crate::{AppErrorKind, Context, Error, field}; -/// Map a [`tokio::time::error::Elapsed`] into an [`AppError`] with kind +/// Map a [`tokio::time::error::Elapsed`] into an [`crate::AppError`] with kind /// `Timeout`. /// /// Message is fixed to avoid leaking timing specifics to the client. diff --git a/src/convert/validator.rs b/src/convert/validator.rs index fd15b69..6a27c88 100644 --- a/src/convert/validator.rs +++ b/src/convert/validator.rs @@ -44,7 +44,7 @@ use validator::{ValidationErrors, ValidationErrorsKind}; #[cfg(feature = "validator")] use crate::{AppErrorKind, Context, Error, field}; -/// Map [`validator::ValidationErrors`] into an [`AppError`] with kind +/// Map [`validator::ValidationErrors`] into an [`crate::AppError`] with kind /// `Validation`. /// /// By default, the error is converted to a string for human-readable logs. diff --git a/src/frontend.rs b/src/frontend.rs index b79e0c0..753d240 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -2,7 +2,7 @@ //! values. //! //! This module is available when the `frontend` feature is enabled. It provides -//! helpers to serialize [`AppError`] and [`ErrorResponse`] into +//! helpers to serialize [`crate::AppError`] and [`crate::ErrorResponse`] into //! [`wasm_bindgen::JsValue`] and optionally emit structured logs via //! `console.error` when running inside a browser. //! diff --git a/src/lib.rs b/src/lib.rs index 86e8f0f..b8a2730 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ rust_2018_idioms, clippy::all )] -#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] //! Framework-agnostic application error types for backend services. //! diff --git a/src/turnkey.rs b/src/turnkey.rs index 7d4c080..be09dba 100644 --- a/src/turnkey.rs +++ b/src/turnkey.rs @@ -1,11 +1,11 @@ //! Turnkey integration: error kinds, classification, and conversions. //! //! This module centralizes Turnkey-specific error taxonomy and mapping into -//! framework-agnostic [`AppError`] and [`AppErrorKind`]. +//! framework-agnostic [`crate::AppError`] and [`crate::AppErrorKind`]. //! //! # Goals //! - Stable domain kinds (`TurnkeyErrorKind`) decoupled from SDK texts. -//! - Conservative mapping to the canonical [`AppErrorKind`]. +//! - Conservative mapping to the canonical [`crate::AppErrorKind`]. //! - Heuristic classifier for stringly-typed upstream errors. //! //! # Examples diff --git a/tests/ui/app_error/fail/enum_missing_variant.stderr b/tests/ui/app_error/fail/enum_missing_variant.stderr index d000de1..bbc297c 100644 --- a/tests/ui/app_error/fail/enum_missing_variant.stderr +++ b/tests/ui/app_error/fail/enum_missing_variant.stderr @@ -1,8 +1,9 @@ error: all variants must use #[app_error(...)] to derive AppError conversion --> tests/ui/app_error/fail/enum_missing_variant.rs:8:5 | -8 | #[error("without")] - | ^ +8 | / #[error("without")] +9 | | Without, + | |___________^ warning: unused import: `AppErrorKind` --> tests/ui/app_error/fail/enum_missing_variant.rs:1:17 @@ -10,4 +11,4 @@ warning: unused import: `AppErrorKind` 1 | use masterror::{AppErrorKind, Error}; | ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/app_error/fail/missing_code.stderr b/tests/ui/app_error/fail/missing_code.stderr index 70ccade..4f02301 100644 --- a/tests/ui/app_error/fail/missing_code.stderr +++ b/tests/ui/app_error/fail/missing_code.stderr @@ -2,7 +2,7 @@ error: AppCode conversion requires `code = ...` in #[app_error(...)] --> tests/ui/app_error/fail/missing_code.rs:9:5 | 9 | #[app_error(kind = AppErrorKind::Service)] - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused imports: `AppCode` and `AppErrorKind` --> tests/ui/app_error/fail/missing_code.rs:1:17 @@ -10,4 +10,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Error}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/app_error/fail/missing_kind.stderr b/tests/ui/app_error/fail/missing_kind.stderr index c615e98..021c135 100644 --- a/tests/ui/app_error/fail/missing_kind.stderr +++ b/tests/ui/app_error/fail/missing_kind.stderr @@ -2,4 +2,4 @@ error: missing `kind = ...` in #[app_error(...)] --> tests/ui/app_error/fail/missing_kind.rs:5:1 | 5 | #[app_error(message)] - | ^ + | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/ui/formatter/fail/duplicate_fmt.stderr b/tests/ui/formatter/fail/duplicate_fmt.stderr index 5b08225..5b8f363 100644 --- a/tests/ui/formatter/fail/duplicate_fmt.stderr +++ b/tests/ui/formatter/fail/duplicate_fmt.stderr @@ -2,4 +2,4 @@ error: duplicate `fmt` handler specified --> tests/ui/formatter/fail/duplicate_fmt.rs:4:36 | 4 | #[error(fmt = crate::format_error, fmt = crate::format_error)] - | ^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/ui/formatter/fail/implicit_after_named.stderr b/tests/ui/formatter/fail/implicit_after_named.stderr index d416399..be76742 100644 --- a/tests/ui/formatter/fail/implicit_after_named.stderr +++ b/tests/ui/formatter/fail/implicit_after_named.stderr @@ -8,4 +8,5 @@ error: multiple unused formatting arguments | argument never used | argument never used | + = note: consider adding 2 format specifiers = note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/formatter/fail/unsupported_flag.stderr b/tests/ui/formatter/fail/unsupported_flag.stderr index d7acdb1..b8bf229 100644 --- a/tests/ui/formatter/fail/unsupported_flag.stderr +++ b/tests/ui/formatter/fail/unsupported_flag.stderr @@ -1,5 +1,5 @@ error: placeholder spanning bytes 0..11 uses an unsupported formatter - --> tests/ui/formatter/fail/unsupported_flag.rs:4:9 + --> tests/ui/formatter/fail/unsupported_flag.rs:4:10 | 4 | #[error("{value:##x}")] - | ^^^^^^^^^^^^^ + | ^^^^^^^^^^^ diff --git a/tests/ui/formatter/fail/unsupported_formatter.stderr b/tests/ui/formatter/fail/unsupported_formatter.stderr index 5869420..a6a40c2 100644 --- a/tests/ui/formatter/fail/unsupported_formatter.stderr +++ b/tests/ui/formatter/fail/unsupported_formatter.stderr @@ -1,5 +1,5 @@ error: placeholder spanning bytes 0..9 uses an unsupported formatter - --> tests/ui/formatter/fail/unsupported_formatter.rs:4:9 + --> tests/ui/formatter/fail/unsupported_formatter.rs:4:10 | 4 | #[error("{value:y}")] - | ^^^^^^^^^^^ + | ^^^^^^^^^ diff --git a/tests/ui/formatter/fail/uppercase_binary.stderr b/tests/ui/formatter/fail/uppercase_binary.stderr index bbe04b4..3d332c7 100644 --- a/tests/ui/formatter/fail/uppercase_binary.stderr +++ b/tests/ui/formatter/fail/uppercase_binary.stderr @@ -1,5 +1,5 @@ error: placeholder spanning bytes 0..9 uses an unsupported formatter - --> tests/ui/formatter/fail/uppercase_binary.rs:4:9 + --> tests/ui/formatter/fail/uppercase_binary.rs:4:10 | 4 | #[error("{value:B}")] - | ^^^^^^^^^^^ + | ^^^^^^^^^ diff --git a/tests/ui/formatter/fail/uppercase_pointer.stderr b/tests/ui/formatter/fail/uppercase_pointer.stderr index 2c30e71..0bd10fa 100644 --- a/tests/ui/formatter/fail/uppercase_pointer.stderr +++ b/tests/ui/formatter/fail/uppercase_pointer.stderr @@ -1,5 +1,5 @@ error: placeholder spanning bytes 0..9 uses an unsupported formatter - --> tests/ui/formatter/fail/uppercase_pointer.rs:4:9 + --> tests/ui/formatter/fail/uppercase_pointer.rs:4:10 | 4 | #[error("{value:P}")] - | ^^^^^^^^^^^ + | ^^^^^^^^^ diff --git a/tests/ui/masterror/fail/duplicate_attr.stderr b/tests/ui/masterror/fail/duplicate_attr.stderr index c3fb86b..113a10d 100644 --- a/tests/ui/masterror/fail/duplicate_attr.stderr +++ b/tests/ui/masterror/fail/duplicate_attr.stderr @@ -10,4 +10,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Masterror}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/duplicate_telemetry.stderr b/tests/ui/masterror/fail/duplicate_telemetry.stderr index b331baa..9ada290 100644 --- a/tests/ui/masterror/fail/duplicate_telemetry.stderr +++ b/tests/ui/masterror/fail/duplicate_telemetry.stderr @@ -10,4 +10,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Masterror}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/empty_redact.stderr b/tests/ui/masterror/fail/empty_redact.stderr index b2658a1..fd151cc 100644 --- a/tests/ui/masterror/fail/empty_redact.stderr +++ b/tests/ui/masterror/fail/empty_redact.stderr @@ -10,4 +10,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Masterror}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/enum_missing_variant.stderr b/tests/ui/masterror/fail/enum_missing_variant.stderr index 83d517f..5a25e12 100644 --- a/tests/ui/masterror/fail/enum_missing_variant.stderr +++ b/tests/ui/masterror/fail/enum_missing_variant.stderr @@ -1,8 +1,9 @@ error: all variants must use #[masterror(...)] to derive masterror::Error conversion --> tests/ui/masterror/fail/enum_missing_variant.rs:8:5 | -8 | #[error("missing")] - | ^ +8 | / #[error("missing")] +9 | | Missing + | |___________^ warning: unused imports: `AppCode` and `AppErrorKind` --> tests/ui/masterror/fail/enum_missing_variant.rs:1:17 @@ -10,4 +11,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Masterror}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/missing_category.stderr b/tests/ui/masterror/fail/missing_category.stderr index f929951..bdadf45 100644 --- a/tests/ui/masterror/fail/missing_category.stderr +++ b/tests/ui/masterror/fail/missing_category.stderr @@ -2,7 +2,7 @@ error: missing `category = ...` in #[masterror(...)] --> tests/ui/masterror/fail/missing_category.rs:5:1 | 5 | #[masterror(code = AppCode::Internal)] - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused import: `AppCode` --> tests/ui/masterror/fail/missing_category.rs:1:17 @@ -10,4 +10,4 @@ warning: unused import: `AppCode` 1 | use masterror::{AppCode, Masterror}; | ^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/missing_code.stderr b/tests/ui/masterror/fail/missing_code.stderr index 34abc91..037fac8 100644 --- a/tests/ui/masterror/fail/missing_code.stderr +++ b/tests/ui/masterror/fail/missing_code.stderr @@ -2,7 +2,7 @@ error: missing `code = ...` in #[masterror(...)] --> tests/ui/masterror/fail/missing_code.rs:5:1 | 5 | #[masterror(category = AppErrorKind::Internal)] - | ^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused import: `AppErrorKind` --> tests/ui/masterror/fail/missing_code.rs:1:17 @@ -10,4 +10,4 @@ warning: unused import: `AppErrorKind` 1 | use masterror::{AppErrorKind, Masterror}; | ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default diff --git a/tests/ui/masterror/fail/unknown_option.stderr b/tests/ui/masterror/fail/unknown_option.stderr index d579838..1822edf 100644 --- a/tests/ui/masterror/fail/unknown_option.stderr +++ b/tests/ui/masterror/fail/unknown_option.stderr @@ -10,4 +10,4 @@ warning: unused imports: `AppCode` and `AppErrorKind` 1 | use masterror::{AppCode, AppErrorKind, Masterror}; | ^^^^^^^ ^^^^^^^^^^^^ | - = note: `#[warn(unused_imports)]` on by default + = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default