# Code Product
This crate provides two things:
1. A [library](code_product_lib) to generate code by expanding a product syntax. This is the
primary objective of this crate as it enables code generation in a convenient way from
other proc macros.
2. The standalone [`product!{}`](product) and [`product_items!{}`](product_items) macros to
generate code using the library as it is useful on its own.
## Product expansion
The name `product` is because it expands to the product of all defined sets. For example given
are the two sets of defintions 'Foo and Bar' and 'This and That', showing different syntactic
variants:
```rust
# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
// Rather elaborate form with named definitions:
// define `Type` to expand to `This` and `That`
@(Type: (This) (That))
// and inline define `T` to expand to `Foo` and `Bar`
impl Trait<@(@T: (Foo)(Bar))> for @Type<@T> {}
}
```
or
```rust
# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
// Alternative form inlining definition and reference by index:
impl Trait<@((Foo)(Bar))> for @((This)(That))<@0> {}
}
```
either of the above will expand four times to:
```rust
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
impl Trait<Foo> for This<Foo> {}
impl Trait<Foo> for That<Foo> {}
impl Trait<Bar> for This<Bar> {}
impl Trait<Bar> for That<Bar> {}
```
## Product Syntax
The detailed syntax for product definitions is described at:
[The product syntax](../code_product_lib/index.html#the-product-syntax).