typekin 0.6.0

new-type pattern with concept of Friends borrowed from c++, no-std and fully const
Documentation
#![allow(dead_code)]

#[cfg(test)]
mod test {
    #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
    #[repr(u8)]
    #[typekin::bitflag(
        friends = [u8(conv = self, level = [Bit])],
        integral = [
            friends = [u8(conv = self, level = [Full])],
            konst = false,
        ],
    )]
    pub enum Permission {
        Empty = 0,
        Read = 0b001,
        Write = 0b010,
        Execute = 0b100,
    }

    #[test]
    fn value_makes_from_borrowed_integral_friend() {
        let raw = 0b011u8;
        let it = PermissionValue::of(&raw);
        assert_eq!(it.raw(), raw);
    }

    #[test]
    fn value_makes_from_mutably_borrowed_integral_friend() {
        let mut raw = 0b011u8;
        let it = PermissionValue::of(&mut raw);
        assert_eq!(it.raw(), raw);
        assert_eq!(raw, 0b011u8);
    }

    #[test]
    fn enum_left_bitwise_accepts_borrowed_generated_value_friend() {
        let rhs = Permission::Write.into_value();
        let it = Permission::Read | &rhs;
        assert_eq!(it.raw(), 0b011);
    }

    #[test]
    fn enum_left_bitwise_accepts_mutably_borrowed_generated_value_friend() {
        let mut rhs = Permission::Write.into_value();
        let it = Permission::Read | &mut rhs;
        assert_eq!(it.raw(), 0b011);
        assert_eq!(rhs.raw(), 0b010);
    }

    #[test]
    fn enum_left_bitwise_accepts_borrowed_configured_friend() {
        let rhs = 0b010u8;
        let it = Permission::Read | &rhs;
        assert_eq!(it.raw(), 0b011);
    }

    #[test]
    fn value_left_bitwise_accepts_borrowed_generated_enum_friend() {
        let value = Permission::Read.into_value();
        let it = value | &Permission::Write;
        assert_eq!(it.raw(), 0b011);
    }
}