macro_rules! replay {
($name:ident, $path:literal, |$card:ident| $body:tt) => {
#[tokio::test]
async fn $name() {
use std::io::Write;
let mut buf_reader_names = [0; 0xffff];
let reader = "HID";
let ctx = pcsc::Context::establish(pcsc::Scope::User).unwrap();
let Some(name) = ctx
.list_readers(&mut buf_reader_names)
.unwrap()
.find(|v| (*v).to_str().unwrap().contains(&reader))
else {
panic!("No reader found");
};
let card = ctx
.connect(name, pcsc::ShareMode::Exclusive, pcsc::Protocols::RAW)
.unwrap();
let backend = $crate::io::TapBackend::new(&card);
let $card = $crate::Card::new(&backend);
$body;
let mut f =
std::fs::File::create(std::path::PathBuf::from("src/replay").join($path)).unwrap();
for (tx, rx) in backend.into_inner() {
f.write_all(format!("{} {}\n", hex::encode(tx), hex::encode(rx)).as_bytes())
.unwrap();
}
}
};
}
pub(crate) use replay;