terra-items 0.4.0

Crate with enum contatining terraria items and prefixes
Documentation
use super::Item;
use crate::Prefix;
use std::num::TryFromIntError;
use terra_types::{PositiveI16, PositiveI32};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ItemSlot {
	pub item: Item,
	pub prefix: Option<Prefix>,
	pub count: PositiveI32,
}

impl From<SingleItemSlot> for ItemSlot {
	fn from(value: SingleItemSlot) -> Self {
		ItemSlot {
			item: value.item,
			prefix: value.prefix,
			count: PositiveI32::new(1).expect("In bounds"),
		}
	}
}

impl From<WorldItemSlot> for ItemSlot {
	fn from(value: WorldItemSlot) -> Self {
		ItemSlot {
			item: value.item,
			prefix: value.prefix,
			count: PositiveI32::new(value.count.get() as i32).expect("In bounds"),
		}
	}
}

impl ItemSlot {
	pub fn new(item: Item) -> Self {
		Self::from(item)
	}

	pub fn prefix(mut self, prefix: Prefix) -> Self {
		self.prefix = Some(prefix);
		self
	}

	pub fn count(mut self, count: PositiveI32) -> Self {
		self.count = count;
		self
	}
}

impl From<Item> for ItemSlot {
	fn from(value: Item) -> Self {
		Self {
			item: value,
			prefix: None,
			count: PositiveI32::MIN,
		}
	}
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SingleItemSlot {
	pub item: Item,
	pub prefix: Option<Prefix>,
}

impl SingleItemSlot {
	pub fn new(item: Item) -> Self {
		Self::from(item)
	}

	pub fn prefix(mut self, prefix: Prefix) -> Self {
		self.prefix = Some(prefix);
		self
	}
}

impl From<Item> for SingleItemSlot {
	fn from(value: Item) -> Self {
		Self {
			item: value,
			prefix: None,
		}
	}
}

impl From<ItemSlot> for SingleItemSlot {
	fn from(item_slot: ItemSlot) -> Self {
		SingleItemSlot {
			item: item_slot.item,
			prefix: item_slot.prefix,
		}
	}
}

impl From<WorldItemSlot> for SingleItemSlot {
	fn from(item_slot: WorldItemSlot) -> Self {
		SingleItemSlot {
			item: item_slot.item,
			prefix: item_slot.prefix,
		}
	}
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WorldItemSlot {
	pub item: Item,
	pub prefix: Option<Prefix>,
	pub count: PositiveI16,
}

impl WorldItemSlot {
	pub fn new(item: Item) -> Self {
		Self::from(item)
	}

	pub fn prefix(mut self, prefix: Prefix) -> Self {
		self.prefix = Some(prefix);
		self
	}

	pub fn count(mut self, count: PositiveI16) -> Self {
		self.count = count;
		self
	}
}

impl From<Item> for WorldItemSlot {
	fn from(value: Item) -> Self {
		Self {
			item: value,
			prefix: None,
			count: PositiveI16::MIN,
		}
	}
}

impl TryFrom<ItemSlot> for WorldItemSlot {
	type Error = TryFromIntError;
	fn try_from(value: ItemSlot) -> Result<Self, Self::Error> {
		Ok(WorldItemSlot {
			item: value.item,
			prefix: value.prefix,
			count: PositiveI16::new(i16::try_from(value.count.get())?).expect("In bounds"),
		})
	}
}

impl From<SingleItemSlot> for WorldItemSlot {
	fn from(value: SingleItemSlot) -> Self {
		WorldItemSlot {
			item: value.item,
			prefix: value.prefix,
			count: PositiveI16::MIN,
		}
	}
}