code-product 0.2.0

macro producing multiple expansions
Documentation
# 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).