use iohidmanager::async_api::{
DeviceInputValueStream, DeviceRemovalStream, ManagerDeviceMatchingStream,
ManagerDeviceRemovalStream, ManagerInputReportStream, ManagerInputValueStream, QueueValueStream,
};
use iohidmanager::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let manager = HidManager::new()?;
manager.set_device_matching(None)?;
{
let stream = ManagerInputValueStream::subscribe(&manager, 64);
assert_eq!(stream.buffered_count(), 0);
println!(
"ManagerInputValueStream: capacity check OK (buffered={})",
stream.buffered_count()
);
}
{
let stream = ManagerDeviceMatchingStream::subscribe(&manager, 32);
println!(
"ManagerDeviceMatchingStream: capacity check OK (buffered={})",
stream.buffered_count()
);
}
{
let stream = ManagerDeviceRemovalStream::subscribe(&manager, 32);
println!(
"ManagerDeviceRemovalStream: capacity check OK (buffered={})",
stream.buffered_count()
);
}
{
let stream = ManagerInputReportStream::subscribe(&manager, 32);
println!(
"ManagerInputReportStream: capacity check OK (buffered={})",
stream.buffered_count()
);
}
let devices = manager.live_devices();
if let Some(device) = devices.first() {
let removal_stream = DeviceRemovalStream::subscribe(device, 4);
println!(
"DeviceRemovalStream: capacity check OK (buffered={})",
removal_stream.buffered_count()
);
let iv_stream = DeviceInputValueStream::subscribe(device, 64);
println!(
"DeviceInputValueStream: capacity check OK (buffered={})",
iv_stream.buffered_count()
);
} else {
println!("No HID devices found — skipping per-device stream smoke test");
}
if let Some(device) = devices.first() {
let elements = device.elements();
if let Some(element) = elements.first() {
let queue = HidQueue::new(device, 16)?;
queue.add_element(element);
queue.start();
let q_stream = QueueValueStream::subscribe(&queue, 16);
println!(
"QueueValueStream: capacity check OK (buffered={})",
q_stream.buffered_count()
);
queue.stop();
} else {
println!("Device has no elements — skipping queue stream smoke test");
}
} else {
println!("No HID devices found — skipping queue stream smoke test");
}
let manager2 = HidManager::new()?;
manager2.set_device_matching(None)?;
let stream = ManagerDeviceMatchingStream::subscribe(&manager2, 8);
assert!(
stream.try_next().is_none(),
"unexpected event on fresh stream"
);
println!("try_next on fresh stream: OK (None as expected)");
let saw_event = pollster::block_on(async {
stream.try_next().is_some()
});
assert!(!saw_event, "should not have seen an event");
println!("pollster block_on: OK (no spurious events)");
println!("\nAll async_api smoke tests passed.");
Ok(())
}