| Crates.io | waddling-errors-macros |
| lib.rs | waddling-errors-macros |
| version | 0.7.3 |
| created_at | 2025-11-20 17:57:08.566727+00 |
| updated_at | 2026-01-20 08:02:35.386766+00 |
| description | Procedural macros for structured error codes with compile-time validation and taxonomy enforcement |
| homepage | |
| repository | https://gitlab.com/AshutoshMahala/waddling-errors |
| max_upload_size | |
| id | 1942327 |
| size | 778,381 |
Procedural macros for waddling-errors.
[dependencies]
waddling-errors = "0.7"
waddling-errors-macros = "0.7"
setup!must be called once at crate root before usingdiag!. Module names (components,primaries,sequences) are conventions—use whatever structure fits your project.
// src/lib.rs
use waddling_errors_macros::{setup, component, primary, sequence, diag};
setup! {
components = crate::components,
primaries = crate::primaries,
sequences = crate::sequences,
}
pub mod components {
use waddling_errors_macros::component;
component! { Auth { docs: "Authentication" } }
}
pub mod primaries {
use waddling_errors_macros::primary;
primary! { Token { docs: "Token errors" } }
}
pub mod sequences {
use waddling_errors_macros::sequence;
sequence! {
EXPIRED(17) { description: "Resource expired" },
}
}
diag! {
E.Auth.Token.EXPIRED: {
message: "Token expired at {{timestamp}}",
fields: [timestamp],
'Pub description: "Session expired. Please log in again.",
'Dev description: "Token TTL exceeded. Check refresh logic.",
'Int description: "Check auth_tokens table.",
},
}
// Use it
let error = E_AUTH_TOKEN_EXPIRED;
println!("{}", error.runtime.code); // E.Auth.Token.017
setup! - Configure paths (required at crate root)setup! {
components = crate::components,
primaries = crate::primaries,
sequences = crate::sequences,
}
component! - Define componentscomponent! {
Auth { docs: "Authentication system" },
Database { docs: "Database operations" },
}
primary! - Define primary categoriesprimary! {
Token { docs: "Token-related errors" },
Connection { docs: "Connection errors" },
}
sequence! - Define sequencessequence! {
MISSING(1) { description: "Required item missing" },
EXPIRED(17) { description: "Resource expired" },
}
diag! - Define diagnosticsdiag! {
E.Auth.Token.EXPIRED: {
message: "Token expired at {{timestamp}}",
fields: [timestamp],
pii: [user_email], // PII fields use {{pii/field}}
// Role-based descriptions
'Pub description: "Session expired.",
'Dev description: "Token TTL exceeded.",
'Int description: "Check auth_tokens table.",
role: "Public",
tags: ["auth"],
},
}
| Marker | Context | Use Case |
|---|---|---|
'C |
Compile-time only | URLs, code snippets |
'R |
Runtime only | Role, tags |
'CR |
Both | Descriptions, hints |
diag! {
E.Auth.Token.EXPIRED: {
message: "Token expired",
'Pub description: "Session expired.", // End users
'Dev description: "Token TTL exceeded.", // Developers
'Int description: "Redis key: auth:token:*", // Internal
role: "Public",
},
}
Generate separate docs per role:
cargo run --bin doc-gen --features doc-gen
| Feature | Description | Default |
|---|---|---|
metadata |
Compile-time metadata | No |
doc-gen |
Documentation generation | No |
auto-register |
Automatic registration | No |
MIT or Apache-2.0.