use crate::rps::Weapon;
use core::cmp::Ordering;
#[repr(C)]
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum GameResult {
Win {
player: Weapon,
robo: Weapon,
},
Lose {
player: Weapon,
robo: Weapon,
},
Draw {
player: Weapon,
robo: Weapon,
},
}
#[repr(C)]
#[derive(
Copy, Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq, Ord, PartialOrd, Hash,
)]
pub struct RpsGame {
pub(crate) player: Weapon,
pub(crate) robo: Weapon,
}
impl RpsGame {
pub fn new_game(weapon: Weapon) -> Self {
Self {
player: weapon,
robo: Weapon::rand(),
}
}
pub fn result(self) -> GameResult {
self.into()
}
}
impl From<RpsGame> for GameResult {
fn from(val: RpsGame) -> Self {
match val.player.cmp(&val.robo) {
Ordering::Greater => GameResult::Win {
player: val.player,
robo: val.robo,
},
Ordering::Equal => GameResult::Draw {
player: val.player,
robo: val.robo,
},
Ordering::Less => GameResult::Lose {
player: val.player,
robo: val.robo,
},
}
}
}