use crate::display; use crate::entities::raws::{raw, EntityRaw, ItemType}; use crate::entities::{Describe, EntityID}; use crate::types::Position; use std::io::{self, Write}; #[derive(Debug, Clone, PartialEq, Eq)] pub struct Item { pub id: Option, pub typ: &'static ItemType<'static>, pub position: Position, } impl Item { pub fn new_from_raw(name: &'static str, position: Position) -> Self { match raw(name) { EntityRaw::Item(typ) => Self::new_with_type(typ, position), _ => panic!("Invalid raw type for {:?}, expected Item", name), } } pub fn new_with_type( typ: &'static ItemType<'static>, position: Position, ) -> Self { Item { id: None, typ, position, } } pub fn is_edible(&self) -> bool { self.typ.is_edible() } } entity!(Item); impl Describe for Item { fn description(&self) -> String { self.typ.description.to_string() } } impl display::Draw for Item { fn do_draw(&self, out: &mut dyn Write) -> io::Result<()> { write!(out, "{}", self.typ.chr) } }