mlbt 0.4.0

A terminal user interface for the MLB stats API. Watch a baseball game in your terminal! ⚾
use crate::components::decision_pitchers::{DecisionPitcher, GameDecisionPitchers};
use crate::components::util::{OptionDisplayExt, last_name};
use crate::ui::styling::dim_style;
use tui::buffer::Buffer;
use tui::layout::Rect;
use tui::style::Style;
use tui::text::{Line, Span};
use tui::widgets::{Paragraph, Widget};

pub struct DecisionPitchersWidget<'a> {
    pub decisions: &'a GameDecisionPitchers,
}

impl Widget for DecisionPitchersWidget<'_> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let dim = dim_style();
        let mut lines = vec![
            wl_line("W", &self.decisions.winning_pitcher, dim),
            wl_line("L", &self.decisions.losing_pitcher, dim),
        ];
        if let Some(save) = &self.decisions.save_pitcher {
            lines.push(save_line(save, dim));
        }
        Paragraph::new(lines).render(area, buf);
    }
}

fn wl_line<'a>(label: &'a str, p: &'a DecisionPitcher, dim: Style) -> Line<'a> {
    let wins = p.wins.display_or("-");
    let losses = p.losses.display_or("-");
    let era = p.era.display_or("-");
    Line::from(vec![
        Span::styled(format!("{label}: "), dim),
        Span::raw(last_name(&p.name).to_string()),
        Span::styled(format!(" {wins}-{losses}, {era} ERA"), dim),
    ])
}

fn save_line(p: &DecisionPitcher, dim: Style) -> Line<'_> {
    let saves = p.saves.display_or("-");
    let era = p.era.display_or("-");
    Line::from(vec![
        Span::styled("S: ", dim),
        Span::raw(last_name(&p.name).to_string()),
        Span::styled(format!(" {saves}, {era} ERA"), dim),
    ])
}