mlbt 0.2.0

A terminal user interface for the MLB stats API. Watch a baseball game in your terminal! ⚾
use crate::components::standings::Team;
use crate::components::util::OptionDisplayExt;
use mlbt_api::schedule::TeamInfo;

#[derive(Debug, Clone)]
pub struct ProbablePitcher {
    pub name: String,
    pub strike_outs: Option<u16>,
    pub base_on_balls: Option<u16>,
    pub era: Option<String>,
    pub innings_pitched: Option<String>,
    pub wins: Option<u8>,
    pub losses: Option<u8>,
}

pub struct ProbablePitcherMatchup<'a> {
    pub home_pitcher: &'a ProbablePitcher,
    pub home_team: Team,
    pub away_pitcher: &'a ProbablePitcher,
    pub away_team: Team,
}

impl Default for ProbablePitcher {
    fn default() -> Self {
        ProbablePitcher {
            name: "TBD".to_string(),
            strike_outs: None,
            base_on_balls: None,
            era: None,
            innings_pitched: None,
            wins: None,
            losses: None,
        }
    }
}

impl ProbablePitcher {
    pub fn from_team(team: &TeamInfo) -> Option<Self> {
        let pitcher = team.probable_pitcher.as_ref()?;
        let stats = pitcher.stats.iter().find_map(|entry| {
            // check if this entry belongs to the "pitching" group and is season stats
            let is_pitching = entry
                .group
                .as_ref()
                .is_some_and(|g| g.display_name == "pitching")
                && entry
                    .stat_type
                    .as_ref()
                    .is_some_and(|t| t.display_name == "statsSingleSeason");

            if is_pitching {
                entry.stats.as_ref()
            } else {
                None
            }
        });
        Some(Self {
            name: pitcher.full_name.clone(),
            strike_outs: stats.and_then(|s| s.strike_outs),
            base_on_balls: stats.and_then(|s| s.base_on_balls),
            era: stats.and_then(|s| s.era.clone()),
            innings_pitched: stats.and_then(|s| s.innings_pitched.clone()),
            wins: stats.and_then(|s| s.wins),
            losses: stats.and_then(|s| s.losses),
        })
    }

    pub fn to_row_cells(&self, team_name: &str) -> Vec<String> {
        vec![
            team_name.to_string(),
            self.name.clone(),
            self.wins.display_or("-"),
            self.losses.display_or("-"),
            self.era.display_or("-"),
            self.innings_pitched.display_or("-"),
            self.strike_outs.display_or("-"),
            self.base_on_balls.display_or("-"),
        ]
    }
}