tuple_for_each 0.1.0

Provides macros and methods to iterate over the fields of a tuple struct
Documentation
use tuple_for_each::*;

trait Base {
    type Item;
    fn foo(&self) -> Self::Item;
    fn bar(&self);
    fn bar_mut(&mut self) {}
}

struct A;
struct B;
struct C;

impl Base for A {
    type Item = u32;
    fn foo(&self) -> Self::Item {
        1
    }
    fn bar(&self) {
        println!("I'am A")
    }
}

impl Base for B {
    type Item = f32;
    fn foo(&self) -> Self::Item {
        2.333
    }
    fn bar(&self) {
        println!("I'am B")
    }
}

impl Base for C {
    type Item = &'static str;
    fn foo(&self) -> Self::Item {
        "hello"
    }
    fn bar(&self) {
        println!("I'am C")
    }
}

#[derive(TupleForEach)]
struct Pair(A, B);

#[derive(TupleForEach)]
struct Tuple(A, B, C);

#[test]
fn test_for_each() {
    let t = Pair(A, B);
    assert_eq!(t.len(), 2);

    let mut i = 0;
    pair_for_each!(x in t {
        println!("for_each {}: {}", i, x.foo());
        x.bar();
        i += 1;
    });
    assert_eq!(i, 2);
}

#[test]
fn test_for_each_mut() {
    let mut t = Tuple(A, B, C);
    assert_eq!(t.len(), 3);

    let mut i = 0;
    tuple_for_each!(x in mut t {
        println!("for_each_mut {}: {}", i, x.foo());
        x.bar_mut();
        i += 1;
    });
    assert_eq!(i, 3);
}

#[test]
fn test_enumerate() {
    let t = Tuple(A, B, C);
    assert_eq!(t.len(), 3);

    let mut real_idx = 0;
    tuple_enumerate!((i, x) in t {
        println!("enumerate {}: {}", i, x.foo());
        x.bar();
        assert_eq!(i, real_idx);
        real_idx += 1;
    });
    assert_eq!(real_idx, 3);
}

#[test]
fn test_enumerate_mut() {
    let mut t = Pair(A, B);
    assert_eq!(t.len(), 2);

    let mut real_idx = 0;
    pair_enumerate!((i, x) in mut t {
        println!("enumerate_mut {}: {}", i, x.foo());
        x.bar_mut();
        assert_eq!(i, real_idx);
        real_idx += 1;
    });
    assert_eq!(real_idx, 2);
}