casino 0.3.0

A casino built right into your terminal
Documentation
use anyhow::{ensure, Result};
use colored::Colorize;

use crate::{config::Config, money::Money, state::State, statistics::Statistics};

pub mod baccarat;
pub mod blackjack;
pub mod cards;
pub mod config;
pub mod craps;
pub mod money;
pub mod roulette;
pub mod slots;
pub mod state;
pub mod statistics;

#[derive(Default)]
pub struct Casino {
    pub config: Config,
    pub bankroll: Money,
    pub stats: Statistics,
}

impl Casino {
    fn new(config: Config) -> Self {
        Self {
            config: config.clone(),
            bankroll: config.mister_greens_gift,
            ..Default::default()
        }
    }

    pub fn from_filesystem() -> Result<Self> {
        let config = Config::init_get()?;
        let mut casino = Self::new(config.clone());

        if config.save_path.try_exists()? {
            let save_state = State::load(&config.save_path)?;
            casino.bankroll = save_state.bankroll;
        } else {
            casino.bankroll = config.mister_greens_gift;
        }

        Statistics::init(&config.stats_path)?;
        casino.stats = Statistics::load(&config.stats_path)?;

        Ok(casino)
    }

    pub fn add_bankroll(&mut self, amount: Money) {
        self.bankroll += amount;
        self.stats.update_bankroll(self.bankroll);
    }

    pub fn subtract_bankroll(&mut self, amount: Money) -> Result<()> {
        ensure!(self.bankroll >= amount, "Cannot subtract to negative value");

        self.bankroll -= amount;
        self.stats.update_bankroll(self.bankroll);

        Ok(())
    }

    pub fn save(&self) {
        let state = State {
            bankroll: self.bankroll,
        };

        state
            .save(&self.config.save_path)
            .expect("Couldn't save config!");
        self.stats
            .save(&self.config.stats_path)
            .expect("Couldn't save stats!");
    }

    pub fn check_for_mister_green(&mut self) {
        if self.bankroll.is_zero() {
            self.add_bankroll(self.config.mister_greens_gift);
            println!("{}", "* Unfortunately, you’ve run out of money.".dimmed());
            println!(
            "{}",
            "* However, a portly gentleman in a sharp suit was watching you play your final hand."
                .dimmed()
        );
            println!(
            "{}",
            "* He says “I like your moxie, kiddo. Take this, and be a little more careful next time. This stuff doesn’t grow on trees.”"
                .dimmed());
            println!(
                "{}",
                "* “Oh, and always remember the name: MISTER GREEN!”".dimmed()
            );
            println!(
                "{}",
                format!("* The man hands you {}", self.config.mister_greens_gift).dimmed()
            );
        }
    }
}