m2 0.0.0

Set of Unix tools to work with m2dirs
Documentation
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}");
    }
}