traitify-core 0.1.0

A macro to turn an impl block into a trait. This is the logic behind the traitify crate.
Documentation
use std::{fmt::Debug, ops::AddAssign};
use traitify::traitify;

#[derive(Debug)]
struct Foo<T, const CAP: usize> {
    data: [T; CAP],
}

#[traitify(FooDynCap, dyn = [CAP])]
#[traitify(FooDynT, dyn = [T])]
#[traitify(FooDynAll, dyn = [CAP, T])]
impl<T: Default + Copy + Debug, const CAP: usize> Foo<T, CAP>
where
    T: AddAssign<u8>,
    T: AddAssign<T>,
{
    pub fn new() -> Self {
        Self {
            data: [T::default(); CAP],
        }
    }

    fn print_dbg(&self) {
        dbg!(self);
    }

    pub fn add_one(&mut self) {
        for i in self.data.iter_mut() {
            *i += 1;
        }
    }

    pub fn add_n(&mut self, n: T) {
        for i in self.data.iter_mut() {
            *i += n;
        }
    }

    pub fn print_hello() {
        println!("Hello!");
    }
}

#[test]
fn compiles() {
    let mut foo = Foo::<u8, 4>::new();
    let dyn_foo: &mut dyn FooDynCap<u8> = &mut foo;
    dyn_foo.add_one();
    dyn_foo.add_n(5);
    foo.print_dbg();

    let dyn_foo: &mut dyn FooDynT<4> = &mut foo;
    dyn_foo.add_one();
    foo.print_dbg();

    let dyn_foo: &mut dyn FooDynAll = &mut foo;
    dyn_foo.add_one();
    foo.print_dbg();
}