#[cfg(test)]
pub mod mock;
pub mod nusb;
#[cfg(feature = "virtual-device")]
pub mod virtual_device;
pub use self::nusb::{NusbTransport, UsbDeviceInfo};
use async_trait::async_trait;
use bytes::Bytes;
use futures::Stream;
use std::pin::Pin;
use std::time::Duration;
pub type BulkStream<'a> = Pin<Box<dyn Stream<Item = Result<Bytes, std::io::Error>> + Send + 'a>>;
#[async_trait]
pub trait Transport: Send + Sync {
async fn send_bulk(&self, data: &[u8]) -> Result<(), crate::Error>;
async fn send_bulk_streaming(&self, chunks: BulkStream<'_>) -> Result<(), crate::Error> {
use futures::StreamExt;
let mut buffer = Vec::new();
let mut stream = chunks;
while let Some(chunk_result) = stream.next().await {
let chunk = chunk_result.map_err(crate::Error::Io)?;
buffer.extend_from_slice(&chunk);
}
self.send_bulk(&buffer).await
}
async fn receive_bulk(&self, max_size: usize) -> Result<Vec<u8>, crate::Error>;
async fn receive_interrupt(&self) -> Result<Vec<u8>, crate::Error>;
async fn cancel_transfer(
&self,
transaction_id: u32,
idle_timeout: Duration,
) -> Result<(), crate::Error>;
}