typekin 0.4.0

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

#[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])],
            without = [konst]
        ],
    )]
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);
}