# `XMacro`
A powerful macro system for generating repetitive code using a simple and expressive syntax.
This crate provides two main components:
1. A procedural macro [library](xmacro_lib) that enables code generation through template expansion
2. Two public macros: [`xmacro!`] and [`xmacro_items!`] for direct use in your code
This crate supersedes the `code_product` crate.
## Key Features
- Define reusable code templates with substitution points
- Generate multiple variations of code using sets of values
- Support for nested scopes and named definitions
- Table-based code generation for row-wise expansion
- Clear and maintainable syntax for complex code generation
## Usage
For example given are the two sets of defintions 'Foo and Bar' and 'This and That',
showing different syntactic variants:
Normal definitions expans each-by-each:
```rust
# use xmacro::xmacro;
trait Trait<T>{}
struct This; struct That;
struct Foo<T>(T); struct Bar<T>(T);
xmacro!{
// Rather elaborate form with named definitions:
$(T: (This) (That))
$(Type: (Foo) (Bar))
// and inline define `T` to expand to `Foo` and `Bar`
impl Trait<$T> for $Type<$T> {}
}
```
or
```rust
# use xmacro::xmacro;
# trait Trait<T>{}
# struct This; struct That;
# struct Foo<T>(T); struct Bar<T>(T);
xmacro!{
// Alternative form inlining/short definition and reference by index:
impl Trait<$(This That)> for $(Foo Bar)<$0> {}
}
```
or use the table syntax expands per table row and gives more control what gets expansed:
```rust
# use xmacro::xmacro;
# trait Trait<T>{}
# struct This; struct That;
# struct Foo<T>(T); struct Bar<T>(T);
xmacro!{
// Tables have a header line followed by a vertical list of expansions
// they would be more interesting when defining more than one thing in the header
$[
T: Type:
(This) (Foo)
(That) (Foo)
(This) (Bar)
(That) (Bar)
]
// and inline define `T` to expand to `Foo` and `Bar`
impl Trait<$T> for $Type<$T> {}
}
```
either of the above will expand four times to:
```rust,ignore
# trait Trait<T>{}
# struct This; struct That;
# struct Foo<T>(T); struct Bar<T>(T);
impl Trait<This> for Foo<This> {}
impl Trait<That> for Foo<That> {}
impl Trait<This> for Bar<This> {}
impl Trait<That> for Bar<That> {}
```
Please refer to the [xmacro_lib](xmacro_lib) crate for a elaborate
description of the macro syntax and semantic.