kbvm 0.1.5

An implementation of the XKB specification
Documentation
use {
    crate::{
        group::{GroupDelta, GroupIndex},
        xkb::keymap,
    },
    kbvm_proc::CloneWithDelta,
};

#[derive(Copy, Clone, Debug, CloneWithDelta, PartialEq)]
pub(crate) struct GroupIdx(u32);

#[derive(Copy, Clone, Debug, Default, PartialEq)]
pub(crate) struct GroupMask(pub(crate) u32);

#[derive(Copy, Clone, Debug, PartialEq)]
pub(crate) enum GroupChange {
    Absolute(GroupIdx),
    Rel(i32),
}

impl GroupChange {
    pub(crate) fn to_group_change(self) -> keymap::GroupChange {
        match self {
            GroupChange::Absolute(idx) => keymap::GroupChange::Absolute(GroupIndex(idx.raw() - 1)),
            GroupChange::Rel(delta) => keymap::GroupChange::Relative(GroupDelta(delta as u32)),
        }
    }
}

impl Default for GroupChange {
    fn default() -> Self {
        Self::Rel(0)
    }
}

impl GroupIdx {
    pub(crate) const ONE: GroupIdx = GroupIdx::new(1).unwrap();

    pub(crate) const fn new(group: u32) -> Option<Self> {
        if group < 1 || group > u32::BITS {
            return None;
        }
        Some(Self(group))
    }

    pub(crate) const fn raw(self) -> u32 {
        self.0
    }

    pub(crate) const fn to_offset(self) -> usize {
        self.0 as usize - 1
    }
}