hidapi 2.6.5

Rust-y wrapper around hidapi
Documentation
use crate::windows_native::descriptor::get_descriptor_ptr;
use std::fs::read_to_string;

#[test]
fn test_01() {
    execute_testcase("045E_02FF_0005_0001");
}
#[test]
fn test_02() {
    execute_testcase("046A_0011_0006_0001");
}
#[test]
fn test_03() {
    execute_testcase("046D_0A37_0001_000C");
}
#[test]
fn test_04() {
    execute_testcase("046D_B010_0001_000C");
}
#[test]
fn test_05() {
    execute_testcase("046D_B010_0001_FF00");
}
#[test]
fn test_06() {
    execute_testcase("046D_B010_0002_0001");
}
#[test]
fn test_07() {
    execute_testcase("046D_B010_0002_FF00");
}
#[test]
fn test_08() {
    execute_testcase("046D_B010_0006_0001");
}
#[test]
fn test_09() {
    execute_testcase("046D_C077_0002_0001");
}
#[test]
fn test_10() {
    execute_testcase("046D_C283_0004_0001");
}
#[test]
fn test_11() {
    execute_testcase("046D_C52F_0001_000C");
}
#[test]
fn test_12() {
    execute_testcase("046D_C52F_0001_FF00");
}
#[test]
fn test_13() {
    execute_testcase("046D_C52F_0002_0001");
}
#[test]
fn test_14() {
    execute_testcase("046D_C52F_0002_FF00");
}
#[test]
fn test_15() {
    execute_testcase("046D_C534_0001_000C");
}
#[test]
fn test_16() {
    execute_testcase("046D_C534_0001_FF00");
}
#[test]
fn test_17() {
    execute_testcase("046D_C534_0002_0001");
}
#[test]
fn test_18() {
    execute_testcase("046D_C534_0002_FF00");
}
#[test]
fn test_19() {
    execute_testcase("046D_C534_0006_0001");
}
#[test]
fn test_20() {
    execute_testcase("046D_C534_0080_0001");
}
#[test]
fn test_21() {
    execute_testcase("047F_C056_0001_000C");
}
#[test]
fn test_22() {
    execute_testcase("047F_C056_0003_FFA0");
}
#[test]
fn test_23() {
    execute_testcase("047F_C056_0005_000B");
}
#[test]
fn test_24() {
    execute_testcase("17CC_1130_0000_FF01");
}

fn execute_testcase(filename: &str) {
    let source_path = format!("./tests/pp_data/{filename}.pp_data");
    let expected_path = format!("./tests/pp_data/{filename}.expected");
    println!("Testing: {:?} <-> {:?}", source_path, expected_path);
    let pp_data = decode_hex(&read_to_string(&source_path).unwrap());
    let expected_descriptor = decode_hex(&read_to_string(&expected_path).unwrap());
    let constructed_descriptor = unsafe { get_descriptor_ptr(pp_data.as_ptr() as _) }.unwrap();
    assert_eq!(constructed_descriptor, expected_descriptor);
}

fn decode_hex(hex: &str) -> Vec<u8> {
    hex.lines()
        .flat_map(|line| {
            line.split(',')
                .map(|hex| hex.trim())
                .filter(|hex| !hex.is_empty())
                .map(|hex| hex.strip_prefix("0x").unwrap())
                .map(|hex| u8::from_str_radix(hex, 16).unwrap())
        })
        .collect()
}