use std::io::{BufRead, BufReader};
use std::path::PathBuf;
use anyhow::anyhow;
use pgp::armor;
use pgp::packet::{Packet, PacketParser};
pub(crate) fn is_binary<R: BufRead>(input: &mut R) -> anyhow::Result<bool> {
let buf = input.fill_buf()?;
if buf.is_empty() {
return Err(anyhow!("empty input"));
}
let binary = buf[0] & 0x80 != 0;
Ok(binary)
}
pub(crate) fn parse_packets<'a>(
input: Option<PathBuf>,
) -> anyhow::Result<Box<dyn Iterator<Item = pgp::errors::Result<Packet>> + 'a>> {
let r: Box<dyn std::io::Read> = match input {
None => Box::new(std::io::stdin()),
Some(path) => Box::new(std::fs::File::open(path).expect("FIXME")),
};
let mut buf = BufReader::new(r);
match is_binary(&mut buf)? {
false => {
let dearmor = armor::Dearmor::new(buf);
Ok(Box::new(PacketParser::new(BufReader::new(dearmor))))
}
true => Ok(Box::new(PacketParser::new(buf))),
}
}