use {crate::xkb::format::FormatFormat, std::fmt::Display};
#[macro_use]
mod macros;
#[cfg(test)]
mod formatter;
pub(crate) mod lexer;
pub(crate) mod parser;
pub(crate) mod resolver;
mod token;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct Group<'a> {
pub layout: &'a str,
pub variant: &'a str,
}
impl<'a> Group<'a> {
pub fn from_layouts_and_variants(
layout: &'a str,
variant: &'a str,
) -> impl Iterator<Item = Self> {
let layouts = layout.split(',');
let mut variants = variant.split(',');
layouts.map(move |layout| Group {
layout: layout.trim(),
variant: variants.next().unwrap_or_default().trim(),
})
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum MergeMode {
Augment,
Override,
Replace,
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub struct Element {
pub merge_mode: MergeMode,
pub include: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub struct Expanded {
pub keycodes: Vec<Element>,
pub types: Vec<Element>,
pub compat: Vec<Element>,
pub symbols: Vec<Element>,
pub geometry: Vec<Element>,
}
impl Expanded {
pub fn format(&self) -> impl Display + use<'_> {
FormatFormat(self)
}
}