rustructure 0.2.0

Run-time introspection on compile-time flagged structures.
Documentation
use crate::{Walkable, Walker};

impl<'a, T: Walkable> Walkable for &'a T {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_ref::<T>()
    }
}

impl<'a, T: Walkable> Walkable for &'a mut T {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_ref::<T>()
    }
}

impl Walkable for u8 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::u8)
    }
}

impl Walkable for i8 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::i8)
    }
}

impl Walkable for u16 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::u16)
    }
}

impl Walkable for i16 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::i16)
    }
}

impl Walkable for u32 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::u32)
    }
}

impl Walkable for i32 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::i32)
    }
}

impl Walkable for u64 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::u64)
    }
}

impl Walkable for i64 {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::i64)
    }
}

impl Walkable for usize {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_integer(crate::IntegerType::usize)
    }
}

impl<'l> Walkable for &'l str {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_str()
    }
}

impl<T: Walkable> Walkable for Option<T> {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_option::<T>()
    }
}

impl Walkable for () {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_unit()
    }
}

impl<T0: Walkable> Walkable for (T0,) {
    fn walk_with<W: Walker>(walker: &mut W) {
        struct Tuple<T> {
            pd: core::marker::PhantomData<T>,
        }
        impl<T0: Walkable> Walkable for Tuple<(T0,)> {
            fn walk_with<W: Walker>(walker: &mut W) {
                walker.visit_field::<T0>("0");
            }
        }
        walker.visit_tuple::<Tuple<(T0,)>>();
    }
}

impl<T0: Walkable, T1: Walkable> Walkable for (T0, T1) {
    fn walk_with<W: Walker>(walker: &mut W) {
        struct Tuple<T> {
            pd: core::marker::PhantomData<T>,
        }
        impl<T0: Walkable, T1: Walkable> Walkable for Tuple<(T0, T1)> {
            fn walk_with<W: Walker>(walker: &mut W) {
                walker.visit_field::<T0>("0");
                walker.visit_field::<T1>("1");
            }
        }
        walker.visit_tuple::<Tuple<(T0, T1)>>();
    }
}

impl<T0: Walkable, T1: Walkable, T2: Walkable> Walkable for (T0, T1, T2) {
    fn walk_with<W: Walker>(walker: &mut W) {
        struct Tuple<T> {
            pd: core::marker::PhantomData<T>,
        }
        impl<T0: Walkable, T1: Walkable, T2: Walkable> Walkable for Tuple<(T0, T1, T2)> {
            fn walk_with<W: Walker>(walker: &mut W) {
                walker.visit_field::<T0>("0");
                walker.visit_field::<T1>("1");
                walker.visit_field::<T2>("2");
            }
        }
        walker.visit_tuple::<Tuple<(T0, T1, T2)>>();
    }
}

impl<T0: Walkable, T1: Walkable, T2: Walkable, T3: Walkable> Walkable for (T0, T1, T2, T3) {
    fn walk_with<W: Walker>(walker: &mut W) {
        struct Tuple<T> {
            pd: core::marker::PhantomData<T>,
        }
        impl<T0: Walkable, T1: Walkable, T2: Walkable, T3: Walkable> Walkable for Tuple<(T0, T1, T2, T3)> {
            fn walk_with<W: Walker>(walker: &mut W) {
                walker.visit_field::<T0>("0");
                walker.visit_field::<T1>("1");
                walker.visit_field::<T2>("2");
                walker.visit_field::<T3>("3");
            }
        }
        walker.visit_tuple::<Tuple<(T0, T1, T2, T3)>>();
    }
}

impl<T: Walkable, const LEN: usize> Walkable for [T;LEN] {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_array::<T>(LEN);
    }
}

impl<'l, T: Walkable> Walkable for &'l [T] {
    fn walk_with<W: Walker>(walker: &mut W) {
        walker.visit_slice::<T>();
    }
}

#[cfg(feature = "std")]
mod std_types {
    use crate::StdType;

    use super::{Walker,Walkable};

    impl Walkable for String {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_str()
        }
    }

    impl<T: Walkable> Walkable for Vec<T> {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_vec::<T>()
        }
    }

    impl<T: Walkable> Walkable for std::rc::Rc<T> {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_std_type::<T>(StdType::Rc)
        }
    }

    impl<T: Walkable> Walkable for std::sync::Arc<T> {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_std_type::<T>(StdType::Arc)
        }
    }

    impl<T: Walkable> Walkable for std::cell::Cell<T> {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_std_type::<T>(StdType::Cell)
        }
    }

    impl<T: Walkable> Walkable for std::cell::RefCell<T> {
        fn walk_with<W: Walker>(walker: &mut W) {
            walker.visit_std_type::<T>(StdType::RefCell)
        }
    }
}