use std::{
error::Error,
io::{IsTerminal, Read, stdin},
};
use mail_parser::{Message, MessageParser};
fn run() -> Result<(), Box<dyn Error>> {
let mut args = std::env::args().skip(1);
let header = args.next().ok_or("missing header")?;
let mut messages: Vec<Message> = args
.filter_map(|path| {
let bytes = std::fs::read(path).ok()?;
MessageParser::new()
.parse_headers(&bytes)
.map(Message::into_owned)
})
.collect();
if messages.is_empty() && !stdin().is_terminal() {
let mut buf = Vec::new();
stdin().read_to_end(&mut buf)?;
if let Some(msg) = MessageParser::new().parse_headers(&buf) {
messages.push(msg.into_owned());
}
}
if messages.is_empty() {
return Err("missing valid message".into());
}
for msg in messages {
if let Some(s) = msg.header_raw(header.as_str()) {
println!("{}", s.trim());
}
}
Ok(())
}
fn main() {
if let Err(e) = run() {
eprintln!("m2hdr: {e}");
}
}