fser 0.2.0

A dumbed-down TUI EPUB reader.
use crossterm::event::{KeyCode, KeyEvent};
use ratatui::{
    Frame,
    layout::Rect,
    widgets::{Paragraph, Wrap},
};

use crate::fser::{Fser, FserState};

pub fn render_meta(fser: &mut Fser, frame: &mut Frame, area: Rect) {
    let meta = fser.ebook.metadata();
    let description = meta
        .description()
        .map(|desc| desc.value().to_string())
        .unwrap_or_else(|| "no description".to_string());
    let published = meta
        .published()
        .map(|publ| publ.date().to_string())
        .unwrap_or_else(|| "unknown".to_string());
    let modified = meta
        .modified()
        .map(|modi| modi.date().to_string())
        .unwrap_or_else(|| "unknown".to_string());
    let creators = meta
        .creators()
        .map(|creator| creator.value().to_string())
        .collect::<Vec<_>>()
        .join(", ");
    let creators = if creators.is_empty() {
        "unknown".to_string()
    } else {
        creators
    };
    let contribs = meta
        .contributors()
        .map(|contrib| contrib.value().to_string())
        .collect::<Vec<_>>()
        .join(", ");
    let contribs = if contribs.is_empty() {
        "none or unknown".to_string()
    } else {
        contribs
    };
    let publishers = meta
        .publishers()
        .map(|publer| publer.value().to_string())
        .collect::<Vec<_>>()
        .join(", ");
    let publishers = if publishers.is_empty() {
        "none or unknown".to_string()
    } else {
        publishers
    };
    let language = meta
        .language()
        .map(|lang| lang.value().to_string())
        .unwrap_or_else(|| "unknown".to_string());
    let meta_par = Paragraph::new(format!(
        "{}\n\nPublished: {}\nModified: {}\nAuthors: {}\nPublishers: {}\nContributors: {}\n\nLanguage: {}",
        description, published, modified, creators, publishers, contribs, language
    )).wrap(Wrap { trim: true });
    frame.render_widget(meta_par, area);
}

pub fn handle_keys(fser: &mut Fser, key: &KeyEvent) {
    if let KeyCode::Char('m') = key.code {
        fser.state = FserState::Reading
    }
}