# 🦆 waddling-errors-macros
Procedural macros for [waddling-errors](../waddling-errors).
[](https://crates.io/crates/waddling-errors-macros)
[](https://docs.rs/waddling-errors-macros)
---
## Installation
```toml
[dependencies]
waddling-errors = "0.7"
waddling-errors-macros = "0.7"
```
---
## Quick Start
> `setup!` must be called once at crate root before using `diag!`.
> Module names (`components`, `primaries`, `sequences`) are conventions—use whatever structure fits your project.
```rust
// 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
```
---
## Macros
### `setup!` - Configure paths (required at crate root)
```rust
setup! {
components = crate::components,
primaries = crate::primaries,
sequences = crate::sequences,
}
```
### `component!` - Define components
```rust
component! {
Auth { docs: "Authentication system" },
Database { docs: "Database operations" },
}
```
### `primary!` - Define primary categories
```rust
primary! {
Token { docs: "Token-related errors" },
Connection { docs: "Connection errors" },
}
```
### `sequence!` - Define sequences
```rust
sequence! {
MISSING(1) { description: "Required item missing" },
EXPIRED(17) { description: "Resource expired" },
}
```
### `diag!` - Define diagnostics
```rust
diag! {
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"],
},
}
```
---
## Visibility Markers
| `'C` | Compile-time only | URLs, code snippets |
| `'R` | Runtime only | Role, tags |
| `'CR` | Both | Descriptions, hints |
---
## Role-Based Documentation
```rust
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:
```bash
cargo run --bin doc-gen --features doc-gen
```
---
## Feature Flags
| `metadata` | Compile-time metadata | No |
| `doc-gen` | Documentation generation | No |
| `auto-register` | Automatic registration | No |
---
## Documentation
- [Macro Guide](docs/MACRO_GUIDE.md) - Complete syntax reference
- [Validation Guide](VALIDATION.md) - Compile-time validation
- [API Reference](https://docs.rs/waddling-errors-macros)
---
## License
MIT or Apache-2.0.