gamemstr-common 0.1.0

Common code for the gamemstr project
Documentation
use core::fmt;

use serde::{Deserialize, Serialize};

use crate::{creature::Creature, item::Item, spell::Spell, world::campaign::Campaign};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Player {
    pub creature: Creature,
    pub race: Race,
    pub class: Class,
    pub level: u8,
    pub experience: u32,
    pub inventory: Vec<Item>,
    pub spells: Vec<Spell>,
    pub campaign: Campaign,
}

impl Player {
    pub fn new(
        creature: Creature,
        race: Race,
        class: Class,
        level: u8,
        experience: u32,
        campaign: Campaign,
    ) -> Self {
        Self {
            creature,
            race,
            class,
            level,
            experience,
            inventory: Vec::new(),
            spells: Vec::new(),
            campaign,
        }
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum Race {
    Human,
    Elf,
    Dwarf,
    Halfling,
    Gnome,
    HalfElf,
    HalfOrc,
    Tiefling,
}

impl fmt::Display for Race {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:?}", self)
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum Class {
    Barbarian,
    Bard,
    Cleric,
    Druid,
    Fighter,
    Monk,
    Paladin,
    Ranger,
    Rogue,
    Sorcerer,
    Warlock,
    Wizard,
}

impl fmt::Display for Class {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:?}", self)
    }
}

#[derive(Serialize, Deserialize, Debug)]
pub struct PlayerRequest {
    pub creature: Option<Creature>,
    pub race: Option<Race>,
    pub class: Option<Class>,
    pub level: Option<u8>,
    pub experience: Option<u32>,
    pub inventory: Option<Vec<Item>>,
    pub spells: Option<Vec<Spell>>,
    pub campaign: Option<Campaign>,
}

impl PlayerRequest {
    pub fn to_player(&self) -> Option<Player> {
        match &self.creature {
            Some(creature) => Some(Player {
                creature: creature.clone(),
                race: self.race.clone().expect("no race provided"),
                class: self.class.clone().expect("no class provided"),
                level: self.level.expect("no level provided"),
                experience: self.experience.expect("no experience provided"),
                inventory: self.inventory.clone().expect("no inventory provided"),
                spells: self.spells.clone().expect("no spells provided"),
                campaign: self.campaign.clone().expect("no campaign provided"),
            }),
            None => None,
        }
    }
}