use serde::{Serialize,Deserialize};
use crate::item::Item;
fn default_index()->i32{
1
}
#[derive(Debug,Serialize,Deserialize,PartialEq, Eq,Clone)]
pub struct Game{
pub game: String,
#[serde(alias="player")]
pub creator: String,
pub filler_item_name: String,
pub starting_items: Vec<Item>,
#[serde(default)]
pub death_link: bool,
#[serde(default="default_index")]
pub starting_index: i32
}
impl Game{
pub fn simple(game: String, creator: String, filler_item_name: String)->Self{
Self{
game,creator,filler_item_name,starting_items: vec![],death_link: false,starting_index: 1
}
}
pub fn add_starting_item(&mut self, item: Item){
self.starting_items.push(item);
}
pub fn with_start_item(mut self,item: Item)->Self{
self.add_starting_item(item);
self
}
pub fn with_deathlink(mut self)->Self{
self.death_link=true;
self
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderCF{
creator: String,
filler_item_name: String,
}
impl GameBuilderCF{
pub fn with_game(self,game: String)->Game{
Game::simple(game, self.creator, self.filler_item_name)
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderCG{
creator: String,
game: String
}
impl GameBuilderCG{
pub fn with_filler_item_name(self,name: String)->Game{
Game::simple(self.game, self.creator, name)
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderFG{
filler_item_name: String,
game: String
}
impl GameBuilderFG{
pub fn with_creator(self,creator: String)->Game{
Game::simple(self.game, creator, self.filler_item_name)
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderG{
game: String
}
impl GameBuilderG{
pub fn with_creator(self,creator: String)->GameBuilderCG{
GameBuilderCG { creator, game: self.game }
}
pub fn with_filler_item_name(self,name: String)->GameBuilderFG{
GameBuilderFG { filler_item_name: name, game: self.game }
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderC{
creator: String
}
impl GameBuilderC{
pub fn with_filler_item_name(self,name: String)->GameBuilderCF{
GameBuilderCF { creator: self.creator, filler_item_name: name }
}
pub fn with_game(self,game: String)->GameBuilderCG{
GameBuilderCG {creator: self.creator, game}
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilderF{
filler_item_name: String
}
impl GameBuilderF{
pub fn with_creator(self,creator: String)->GameBuilderCF{
GameBuilderCF { creator, filler_item_name: self.filler_item_name }
}
pub fn with_game(self,game: String)->GameBuilderFG{
GameBuilderFG { filler_item_name: self.filler_item_name, game }
}
}
#[derive(Debug,Clone,PartialEq, Eq)]
pub struct GameBuilder{}
impl GameBuilder{
pub fn with_game(self,game: String)->GameBuilderG{
GameBuilderG { game }
}
pub fn with_creator(self,creator: String)->GameBuilderC{
GameBuilderC { creator }
}
pub fn with_filler_item_name(self,name: String)->GameBuilderF{
GameBuilderF { filler_item_name:name }
}
}
impl Game{
pub fn builder()->GameBuilder{
GameBuilder { }
}
}