use super::Backend;
use crate::std::vec::Vec;
use tokio::sync::Mutex;
#[derive(Debug)]
pub struct TapBackend<IoBackendT>
where
IoBackendT: Backend,
{
backend: IoBackendT,
messages: Mutex<Vec<(Vec<u8>, Vec<u8>)>>,
}
impl<IoBackendT> TapBackend<IoBackendT>
where
IoBackendT: Backend,
{
pub fn new(backend: IoBackendT) -> Self {
Self {
backend,
messages: Mutex::new(Vec::new()),
}
}
pub fn into_inner(self) -> Vec<(Vec<u8>, Vec<u8>)> {
self.messages.into_inner()
}
}
impl<IoBackendT> Backend for TapBackend<IoBackendT>
where
IoBackendT: Backend,
{
type Error = IoBackendT::Error;
async fn exchange_raw(&self, output: &mut [u8], input: &[u8]) -> Result<usize, Self::Error> {
let n = self.backend.exchange_raw(output, input).await?;
{
let mut messages = self.messages.lock().await;
messages.push((input.to_vec(), output[..n].to_vec()));
}
Ok(n)
}
}