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])
}
}