code-product

Crates.iocode-product
lib.rscode-product
version0.4.1
sourcesrc
created_at2023-12-26 02:32:17.356372
updated_at2024-01-26 23:09:38.795782
descriptionmacro producing multiple expansions
homepage
repositoryhttps://git.pipapo.org/cehteh/code-product.git
max_upload_size
id1080579
size15,903
(cehteh)

documentation

https://docs.rs/code-product

README

Code Product

This crate provides two things:

  1. A library 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!{} and 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:

# 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

# 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:

# 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.

Commit count: 0

cargo fmt