simplemailclient 0.2.3

A simple terminal mail client (SMTP send, IMAP fetch) with a TUI.
use crate::store::{Folder, MailStore};

pub fn show_inbox(store: &MailStore) {
    let messages = store.messages_in(&Folder::Inbox);
    if messages.is_empty() {
        println!("Inbox is empty.");
        return;
    }

    println!("{:<4} {:<3} {:<30} {:<20} {}", "IDX", "FLG", "FROM", "DATE", "PREVIEW");
    println!("{}", "".repeat(90));

    for (idx, msg) in &messages {
        let flags = format!(
            "{}{}",
            if !msg.read { "" } else { " " },
            if msg.starred { "" } else { " " },
        );
        let preview: String = msg.body.lines().next()
            .unwrap_or("")
            .chars()
            .take(40)
            .collect();
        let date = msg.timestamp.format("%b %d %H:%M").to_string();
        println!(
            "{:<4} {:<3} {:<30} {:<20} {}",
            idx,
            flags,
            truncate(&msg.from, 30),
            date,
            preview
        );
    }
    println!();
    println!("{} messages, {} unread", messages.len(), store.unread_in(&Folder::Inbox));
}

pub fn read_message(store: &MailStore, index: usize) {
    match store.get_message(index) {
        None => eprintln!("No message at index {}.", index),
        Some(msg) => {
            store.mark_read(index).ok();
            println!("{}", "".repeat(70));
            println!("From : {}", msg.from);
            println!("To   : {}", msg.to);
            println!("Date : {}", msg.timestamp.format("%Y-%m-%d %H:%M:%S"));
            println!("{}", "".repeat(70));
            println!();
            println!("{}", msg.body);
            println!();
        }
    }
}

fn truncate(s: &str, max: usize) -> String {
    if s.len() <= max {
        s.to_string()
    } else {
        format!("{}", &s[..max - 1])
    }
}