bitmatch 0.1.1

A macro to allow matching, binding, and packing the individual bits of integers.
Documentation
use bitmatch::bitmatch;

#[bitmatch]
fn swap_nibbles(n: u8) -> u8 {
    #[bitmatch]
    let "xxxx_yyyy" = n;
    bitpack!("yyyy_xxxx")
}

#[bitmatch]
fn interleave(x: u8, y: u8) -> u16 {
    bitpack!("xyxyxyxy_xyxyxyxy")
}

#[bitmatch]
pub fn decode(inst: u8) -> u8 {
    let zero = 0;
    #[bitmatch]
    match inst {
        "0000_0000" => 0,
        "0000_0001" => 1,
        "0000_????" => 2,
        "00oo_aaoo" if a == o => o ^ a,
        "0???_????" => 9,
        "1000_aabb" if a == b => a ^ b,
        "10??_????" => 3,
        "11??_aabb" if a == b => 3,
        "11??_aabb" if a != zero => b,
        "11??_aabb" => {
            let _ = a;
            b
        }
    }
}

#[bitmatch]
pub fn match_with_wildcard(i: u8) -> u8 {
    #[bitmatch]
    match i {
        "0000" => 0,
        "???1" => 1,
        _ => 2
    }
}

#[bitmatch]
fn long_pattern(x: u64) -> u64 {
    #[bitmatch]
    let "rxxxxxxx_xxxxxxxx_xxxxxxxx_cccccccc_dddddddd_dddddddd_dddddddd_dddddddd" = x;
    #[bitmatch]
    let "aaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa
         aaaaaaaa_bbbbbbbb_aaaaaaaa_aaaaaaaa
         aaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa
         aaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa" = 0u128;
    (a as u64) ^ (b as u64) ^ r ^ x ^ c ^ d
}

#[test]
fn test_swap_nibbles() {
    assert_eq!(swap_nibbles(0xfa), 0xaf);
}

#[test]
fn test_interleave() {
    assert_eq!(interleave(0xFF, 0x00), 0xAAAA);
}

#[test]
fn test_match_with_wildcard() {
    assert_eq!(match_with_wildcard(0b0000), 0);
    assert_eq!(match_with_wildcard(0b1001), 1);
    assert_eq!(match_with_wildcard(0b1110), 2);
}

#[test]
fn test_long_pattern() {
    long_pattern(0);
}