use std::fmt::Debug;
use std::hash::Hash;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ItemKind<Id: Copy + Eq + Hash + Debug> {
Consumable,
Equipment,
KeyItem,
Evolution,
StatBoost,
Currency,
TeachMove,
Custom(Id),
}
impl<Id: Copy + Eq + Hash + Debug> ItemKind<Id> {
pub fn default_sellable(&self) -> bool {
match self {
ItemKind::KeyItem | ItemKind::Evolution | ItemKind::TeachMove => false,
_ => true,
}
}
pub fn default_discardable(&self) -> bool {
match self {
ItemKind::KeyItem => false,
_ => true,
}
}
pub fn default_stackable(&self) -> bool {
match self {
ItemKind::Equipment | ItemKind::KeyItem | ItemKind::TeachMove => false,
_ => true,
}
}
pub fn default_consumed_on_use(&self) -> bool {
match self {
ItemKind::Equipment | ItemKind::KeyItem => false,
_ => true,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
enum TestKind {
Tm,
}
type Kind = ItemKind<TestKind>;
#[test]
fn sellable_consumable() {
assert!(Kind::Consumable.default_sellable());
}
#[test]
fn sellable_equipment() {
assert!(Kind::Equipment.default_sellable());
}
#[test]
fn sellable_key_item() {
assert!(!Kind::KeyItem.default_sellable());
}
#[test]
fn sellable_evolution() {
assert!(!Kind::Evolution.default_sellable());
}
#[test]
fn sellable_stat_boost() {
assert!(Kind::StatBoost.default_sellable());
}
#[test]
fn sellable_currency() {
assert!(Kind::Currency.default_sellable());
}
#[test]
fn sellable_teach_move() {
assert!(!Kind::TeachMove.default_sellable());
}
#[test]
fn sellable_custom() {
assert!(Kind::Custom(TestKind::Tm).default_sellable());
}
#[test]
fn discardable_consumable() {
assert!(Kind::Consumable.default_discardable());
}
#[test]
fn discardable_equipment() {
assert!(Kind::Equipment.default_discardable());
}
#[test]
fn discardable_key_item() {
assert!(!Kind::KeyItem.default_discardable());
}
#[test]
fn discardable_evolution() {
assert!(Kind::Evolution.default_discardable());
}
#[test]
fn discardable_stat_boost() {
assert!(Kind::StatBoost.default_discardable());
}
#[test]
fn discardable_currency() {
assert!(Kind::Currency.default_discardable());
}
#[test]
fn discardable_teach_move() {
assert!(Kind::TeachMove.default_discardable());
}
#[test]
fn discardable_custom() {
assert!(Kind::Custom(TestKind::Tm).default_discardable());
}
#[test]
fn stackable_consumable() {
assert!(Kind::Consumable.default_stackable());
}
#[test]
fn stackable_equipment() {
assert!(!Kind::Equipment.default_stackable());
}
#[test]
fn stackable_key_item() {
assert!(!Kind::KeyItem.default_stackable());
}
#[test]
fn stackable_evolution() {
assert!(Kind::Evolution.default_stackable());
}
#[test]
fn stackable_stat_boost() {
assert!(Kind::StatBoost.default_stackable());
}
#[test]
fn stackable_currency() {
assert!(Kind::Currency.default_stackable());
}
#[test]
fn stackable_teach_move() {
assert!(!Kind::TeachMove.default_stackable());
}
#[test]
fn stackable_custom() {
assert!(Kind::Custom(TestKind::Tm).default_stackable());
}
#[test]
fn consumed_consumable() {
assert!(Kind::Consumable.default_consumed_on_use());
}
#[test]
fn consumed_equipment() {
assert!(!Kind::Equipment.default_consumed_on_use());
}
#[test]
fn consumed_key_item() {
assert!(!Kind::KeyItem.default_consumed_on_use());
}
#[test]
fn consumed_evolution() {
assert!(Kind::Evolution.default_consumed_on_use());
}
#[test]
fn consumed_stat_boost() {
assert!(Kind::StatBoost.default_consumed_on_use());
}
#[test]
fn consumed_currency() {
assert!(Kind::Currency.default_consumed_on_use());
}
#[test]
fn consumed_teach_move() {
assert!(Kind::TeachMove.default_consumed_on_use());
}
#[test]
fn consumed_custom() {
assert!(Kind::Custom(TestKind::Tm).default_consumed_on_use());
}
}