kbvm 0.1.5

An implementation of the XKB specification
Documentation
use {
    crate::xkb::{
        code::Code,
        code_loader::CodeLoader,
        code_map::CodeMap,
        context::Environment,
        diagnostic::DiagnosticSink,
        interner::Interner,
        kccgst::formatter::{Format, Formatter},
        meaning::MeaningCache,
        rmlvo::resolver::{Group, create_item},
        span::SpanExt,
    },
    bstr::ByteSlice,
    std::{path::Path, sync::Arc},
};

#[test]
fn test() {
    let mut map = CodeMap::default();
    let mut meaning_cache = MeaningCache::default();
    let mut interner = Interner::default();
    let mut loader = CodeLoader::new(&[Arc::new(Path::new("/usr/share/X11/xkb").to_path_buf())]);
    let mut diag = vec![];
    let mut intern = |s: &str| {
        let code = Arc::new(s.as_bytes().to_vec());
        let code = Code::new(&code);
        let span = map.add(None, None, &code);
        interner.intern(&code.to_slice()).spanned2(span)
    };
    let mut remaining_runtime = u64::MAX;
    let rules = intern("evdev");
    let groups = [
        Group {
            layout: Some(intern("us").val),
            variant: Some(intern("dvorak").val),
        },
        Group {
            layout: Some(intern("ori").val),
            variant: Some(intern("abcd").val),
        },
    ];
    let options = [
        intern("caps:internal").val,
        intern("caps:shiftlock").val,
        intern("grab:break_actions").val,
        intern("ctrl:swapcaps_and_switch_layout").val,
    ];
    let model = Some(intern("sun_type6_jp").val);
    let item = create_item(
        &mut map,
        &mut interner,
        &mut loader,
        &mut DiagnosticSink::new(&mut diag),
        &mut meaning_cache,
        &mut remaining_runtime,
        rules,
        model,
        &options,
        &groups,
        1024,
        &Environment::default(),
    );
    let mut out = vec![];
    let mut formatter = Formatter::new(&interner, &mut out);
    item.format(&mut formatter).unwrap();
    for diag in diag {
        eprintln!("{}", diag.with_code());
    }
    eprintln!("{}", out.as_bstr());
}