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,
}
}
}