uno-cli 0.1.7

rust cli for uno game
use std::process::exit;

const UNICODE_BELL: char = 0x7 as char;

use crate::{
    can_play::CanPlay,
    card::Card,
    game::Game,
    move_result::MoveResult,
    selection::{Selection, SelectionItem},
};

pub struct Player {
    deck: Vec<Card>,
}
impl Player {
    pub fn new(game: &mut Game) -> Self {
        let mut player = Player { deck: vec![] };
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        game.draw_a_card(&mut player);
        player
    }
}
impl CanPlay for Player {
    fn get_deck(&mut self) -> &mut Vec<Card> {
        &mut self.deck
    }

    fn get_card_count(&self) -> u8 {
        self.deck.len() as u8
    }

    fn play_round(
        &mut self,
        game: &mut Game,
        opponent_card_count: u8,
        _last_move_result: &MoveResult,
    ) -> MoveResult {
        let mut options = Selection::from_deck(self.deck.to_owned());
        loop {
            options.prompt(game.get_top_card(), opponent_card_count);
            let selected = &options.options[options.index];
            match selected {
                SelectionItem::Draw => {
                    game.draw_a_card(self);
                    break;
                }
                SelectionItem::Quit => exit(0),
                SelectionItem::Card(card) => match game.get_top_card() {
                    Some(top_card) => match card.is_playable(top_card) {
                        true => {
                            self.play_card_selection(game, &options);
                            break;
                        }
                        false => print!("{}", UNICODE_BELL),
                    },
                    None => {
                        self.play_card_selection(game, &options);
                        break;
                    }
                },
            }
        }
        if self.deck.is_empty() {
            println!("You Won!");
            exit(0);
        }
        MoveResult::None
    }
}