# miden-protocol-macros
A collection of procedural macros for the Miden protocol.
## WordWrapper
The `WordWrapper` derive macro automatically implements helpful accessor methods and conversions for tuple structs that wrap a `Word` type.
### Usage
Add the derive macro to any tuple struct with a single `Word` field:
```rust
use miden_protocol_macros::WordWrapper;
use miden_crypto::word::Word;
#[derive(WordWrapper)]
pub struct NoteId(Word);
```
### Generated Methods
The macro automatically generates the following methods:
#### Accessor Methods
- **`new_unchecked(Word) -> Self`** - Construct without any checks
- **`as_elements(&self) -> &[Felt]`** - Returns the elements representation of the wrapped Word
- **`as_bytes(&self) -> [u8; 32]`** - Returns the byte representation
- **`to_hex(&self) -> String`** - Returns a big-endian, hex-encoded string
- **`as_word(&self) -> Word`** - Returns the underlying Word value
### Example
```rust
use miden_protocol_macros::WordWrapper;
use miden_crypto::word::Word;
#[derive(Debug, Clone, Copy, PartialEq, Eq, WordWrapper)]
pub struct NoteId(Word);
// Create using new_unchecked (generated by the macro)
let word = Word::from([Felt::ONE, Felt::ZERO, Felt::ONE, Felt::ZERO]);
let note_id = NoteId::from_raw(word);
// Use accessor methods
let elements = note_id.as_elements();
let bytes = note_id.as_bytes();
let hex = note_id.to_hex();
let word_back = note_id.as_word();
```
### Requirements
The macro can only be applied to:
- Tuple structs (e.g., `struct Foo(Word)`)
- With exactly one field
- Where that field is of type `Word`
### Benefits
Using this macro eliminates boilerplate code. Instead of manually writing ~50 lines of implementation code for each Word wrapper type, you can simply add `#[derive(WordWrapper)]` to your struct definition.
This is particularly useful in the Miden codebase where many types like `NoteId`, `TransactionId`, `Nullifier`, `BatchId`, etc. all follow the same pattern of wrapping a `Word` and providing similar accessor methods.
### Important Notes
- The macro generates the `new_unchecked` constructor. You should not manually implement this method.
- Previously, the macro also generated `From<T>` and `From<&T>` trait implementations for `Word` and `[u8; 32]`. These have been **removed** to give types more control over their conversions. If you need these conversions, implement them manually for your specific type.