vitaly 0.1.32

VIA/Vial API client and cli tool for guiless keyboard configuration.
Documentation
use crate::keycodes;
use crate::protocol;
use anyhow::{Result, anyhow};
use hidapi::{DeviceInfo, HidApi};

pub fn run(
    api: &HidApi,
    device: &DeviceInfo,
    layer: u8,
    position: &str,
    value: &Option<String>,
) -> Result<()> {
    let device_path = device.path();
    let dev = api.open_path(device_path)?;
    let capabilities = protocol::scan_capabilities(&dev)?;
    let clean_position = position.replace(" ", "");
    let (index, direction) = clean_position
        .split_once(",")
        .ok_or(anyhow!("positons should be in format index,direction"))?;
    let (index, direction): (u8, u8) = (index.parse()?, direction.parse()?);

    match value {
        Some(value) => {
            if direction > 1 {
                return Err(protocol::ProtocolError::General(
                    "direction should be 0 or 1".to_string(),
                )
                .into());
            }
            let keycode = keycodes::name_to_qid(value, capabilities.vial_version)?;
            protocol::set_encoder(&dev, layer, index, direction, keycode)?;
            println!(
                "Encoder on layer={:?}, index={:?}, direction={:?} set to => {}, keycode = {:#x}",
                layer, index, direction, value, keycode,
            );
        }
        None => {
            let e = protocol::load_encoder(&dev, layer, index)?;
            let value = match direction {
                0 => keycodes::qid_to_name(e.ccw, capabilities.vial_version),
                1 => keycodes::qid_to_name(e.cw, capabilities.vial_version),
                _ => {
                    return Err(protocol::ProtocolError::General(
                        "direction should be 0 or 1".to_string(),
                    )
                    .into());
                }
            };

            println!(
                "Encoder on layer={:?}, index={:?}, direction={:?} => {}",
                layer, index, direction, value
            );
        }
    }
    Ok(())
}