[][src]Crate enum_to_types

Macro for generating pseudo-enums for type-level programming. This is somewhat like https://github.com/fmease/tylift but implemented with macro_rules! syntax

enum_to_types!(AccessLevel; User, Admin);

struct DataStorage<T: AccessLevel::AccessLevel>(i32, PhantomData<T>);

impl<T: AccessLevel::AccessLevel> DataStorage<T> {
    fn new(i: i32) -> Self {
        Self(i, PhantomData)
    }
}

trait ReadStorage<T: AccessLevel::AccessLevel> {
    fn read(&self) -> i32;
}

impl ReadStorage<AccessLevel::Admin> for DataStorage<AccessLevel::User> {
    fn read(&self) -> i32 {
        self.0
    }
}

impl ReadStorage<AccessLevel::User> for DataStorage<AccessLevel::User> {
    fn read(&self) -> i32 {
        self.0
    }
}

impl ReadStorage<AccessLevel::Admin> for DataStorage<AccessLevel::Admin> {
    fn read(&self) -> i32 {
        self.0
    }
}

impl ReadStorage<AccessLevel::User> for DataStorage<AccessLevel::Admin> {
    fn read(&self) -> i32 {
        panic!("You have no rights to read this");
    }
}

fn main() {
    let storage = DataStorage::<AccessLevel::Admin>::new(1);
    assert_eq!(<DataStorage::<AccessLevel::Admin> as ReadStorage<AccessLevel::Admin>>::read(&storage), 1);
    let storage = DataStorage::<AccessLevel::User>::new(5);
    assert_eq!(<DataStorage::<AccessLevel::User> as ReadStorage<AccessLevel::User>>::read(&storage), 5);
    // reading storage with `AccessLevel::Admin` by user will cause panic
}

This may look very verbose but it gives a lot of flexibility. Also, other examples can look less verbose.

Macros

enum_to_types

Macro for generating pseudo-enums for type-level programming. This is somewhat like https://github.com/fmease/tylift but implemented with macro_rules! syntax