# 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{} # struct This(T); struct That(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{} # struct This(T); struct That(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{} # struct This(T); struct That(T); # struct Foo; struct Bar; impl Trait for This {} impl Trait for That {} impl Trait for This {} impl Trait for That {} ``` ## Product Syntax The detailed syntax for product definitions is described at: [The product syntax](../code_product_lib/index.html#the-product-syntax).