ap_manual 0.2.0

A rust package to cannonically interact with manual AP worlds
Documentation
use serde::{Serialize,Deserialize};

use crate::{ItemOrList,bool_is_false};
#[derive(Debug,Serialize,Deserialize,PartialEq, Eq,Clone)]
///A cannonical representation of a location
pub struct Location{
    pub name: String,
    #[serde(default,skip_serializing_if="ItemOrList::is_empty")]
    pub category: ItemOrList<String>,
    #[serde(default,skip_serializing_if="ItemOrList::is_empty")]
    pub requires: ItemOrList<String>,    
    #[serde(default,skip_serializing_if="Option::is_none")]
    pub region: Option<String>,
    #[serde(default,skip_serializing_if="Vec::is_empty")]
    pub place_item: Vec<String>,
    #[serde(default,skip_serializing_if="Vec::is_empty")]
    pub dont_place_item: Vec<String>,
    #[serde(default,skip_serializing_if="Vec::is_empty")]
    pub place_item_category: Vec<String>,
    #[serde(default,skip_serializing_if="Vec::is_empty")]
    pub dont_place_item_category: Vec<String>,
    #[serde(default,skip_serializing_if="bool_is_false")]
    pub victory: bool,
    #[serde(default,skip_serializing_if="bool_is_false")]
    pub prehint: bool,
    #[serde(default,skip_serializing_if="Option::is_none")]
    pub hint_entrance: Option<String>,
    #[serde(default,skip_serializing_if="Option::is_none")]
    pub id: Option<u32>
}
impl Location{
    /// create a new simple location
    pub fn simple(name: String)->Location{
        Location { name, category: ItemOrList::default(), requires: ItemOrList::default(), region: None,
            place_item: Vec::default(), dont_place_item: Vec::default(), place_item_category: Vec::default(), dont_place_item_category: Vec::default(), victory: false, prehint: false,
            hint_entrance: None, id: None }
    }
    pub fn with_category(mut self,c: String)->Self{
        self.category.push(c);
        self
    }
    pub fn with_requirement(mut self,r: String)->Self{
        self.requires.push(r);
        self
    }
    pub fn with_placed_category(mut self,c:String)->Self{
        self.place_item_category.push(c);
        self
    }
    pub fn with_placed_item(mut self,i: String)->Self{
        self.place_item.push(i);
        self
    }
    pub fn as_victory(mut self)->Self{
        self.victory=true;
        self
    }
    pub fn with_region(mut self,reg: String)->Self{
        self.region=Some(reg);
        self
    }
    pub fn builder(name: String)->Self{
        Self::simple(name)
    }
}