use std::io;
use cbor2::de::Deserializer;
use cbor2::value::Value as CborValue;
use anyhow::Context;
struct FmtToIo<W: io::Write>(W);
impl<W: io::Write> std::fmt::Write for FmtToIo<W> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
self.0.write_all(s.as_bytes()).map_err(|_| std::fmt::Error)
}
}
pub fn inspect_from_reader<R: io::Read, W: io::Write>(reader: R, mut writer: W) -> anyhow::Result<()> {
for v in Deserializer::from_reader(reader).into_iter::<CborValue>() {
let v = v?;
use std::fmt::Write as _;
write!(FmtToIo(&mut writer), "{v}").context("failed to write diagnostic notation")?;
writer.write_all(b"\n")?;
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_inspect() {
let cases: &[(&[u8], &[u8])] = &[
(&[0x82, 0x01, 0x02], b"[1, 2]\n"),
(&[0xa1, 0x61, 0x61, 0x61, 0x62], b"{\"a\": \"b\"}\n"),
(&[0x42, 0x01, 0x02], b"h'0102'\n"),
(&[0x01, 0x02], b"1\n2\n"),
];
for &(input, expected) in cases {
let mut output = Vec::new();
inspect_from_reader(input, &mut output).unwrap();
assert_eq!(output, expected, "input: {input:02x?}");
}
}
}