impl-template 1.0.0-alpha

A procedural macro for generating impl-blocks based on a simple template.
use impl_template::impl_template;

trait GenericFoo<T, S> {
    fn my_fn(arg1: T, arg2: S) -> Self;
}

struct Bar;
struct Baz;

struct One;
struct Two;
struct Three;

struct Alpha;
struct Beta;

#[impl_template]
impl GenericFoo<((Bar, Baz)), ((Alpha, Beta))> for ((One, Two, Three)) {
    fn my_fn(_arg1: __TYPE0__, _arg2: __TYPE1__) -> __TYPE2__ {
        unimplemented!()
    }
}

fn main() {
    assert_impls_foo::<One, Bar, Alpha>();
    assert_impls_foo::<Two, Bar, Alpha>();
    assert_impls_foo::<Three, Bar, Alpha>();

    assert_impls_foo::<One, Baz, Alpha>();
    assert_impls_foo::<Two, Baz, Alpha>();
    assert_impls_foo::<Three, Baz, Alpha>();

    assert_impls_foo::<One, Bar, Beta>();
    assert_impls_foo::<Two, Bar, Beta>();
    assert_impls_foo::<Three, Bar, Beta>();

    assert_impls_foo::<One, Baz, Beta>();
    assert_impls_foo::<Two, Baz, Beta>();
    assert_impls_foo::<Three, Baz, Beta>();
}

fn assert_impls_foo<F: GenericFoo<T, S>, T, S>() {}