use crate::Result;
use hidapi::HidApi;
#[cfg(feature = "python")]
use pyo3::prelude::*;
const VIA_USAGE_PAGE: u16 = 0xff60;
#[cfg_attr(feature = "python", pyclass(get_all, from_py_object))]
#[derive(Clone, Debug)]
pub struct KeyboardDeviceInfo {
pub vendor_id: u16,
pub product_id: u16,
pub usage_page: u16,
pub manufacturer: Option<String>,
pub product: Option<String>,
pub serial_number: Option<String>,
}
#[cfg_attr(feature = "python", pyfunction)]
pub fn scan_keyboards() -> Result<Vec<KeyboardDeviceInfo>> {
let api = HidApi::new()?;
Ok(api
.device_list()
.filter(|d| d.usage_page() == VIA_USAGE_PAGE)
.map(|d| KeyboardDeviceInfo {
vendor_id: d.vendor_id(),
product_id: d.product_id(),
usage_page: d.usage_page(),
manufacturer: d.manufacturer_string().map(|s| s.to_string()),
product: d.product_string().map(|s| s.to_string()),
serial_number: d.serial_number().map(|s| s.to_string()),
})
.collect())
}