fish_lib/models/item/
properties.rs

1use crate::models::item::properties::stackable::StackableComponent;
2use crate::models::item::properties::usage_count::UsageComponent;
3use serde::{Deserialize, Serialize};
4
5pub mod stackable;
6pub mod usage_count;
7
8#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
9pub enum ItemPropertiesType {
10    Stackable,
11    Usage,
12}
13
14impl ItemPropertiesType {
15    pub fn get_default_properties(&self) -> ItemProperties {
16        match self {
17            Self::Stackable => ItemProperties::Stackable(StackableComponent::default()),
18            Self::Usage => ItemProperties::Usage(UsageComponent::default()),
19        }
20    }
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24#[serde(untagged)]
25pub enum ItemProperties {
26    Stackable(StackableComponent),
27    Usage(UsageComponent),
28}
29
30impl ItemProperties {
31    pub fn stackable(count: u64) -> Self {
32        Self::Stackable(StackableComponent::new(count))
33    }
34
35    pub fn usage(count: u64) -> Self {
36        Self::Usage(UsageComponent::new(count))
37    }
38
39    // Events
40    pub fn on_use(&mut self, times: u64) {
41        match self {
42            Self::Stackable(stackable) => stackable.on_use(times),
43            Self::Usage(usage) => usage.on_use(times),
44        }
45    }
46
47    pub fn on_add(&mut self, amount: u64) {
48        if let Self::Stackable(stackable) = self {
49            stackable.on_add(amount);
50        }
51    }
52
53    pub fn on_remove(&mut self, amount: u64) {
54        if let Self::Stackable(stackable) = self {
55            stackable.on_remove(amount);
56        }
57    }
58
59    pub fn should_consume(&self) -> bool {
60        match self {
61            Self::Stackable(stackable) => stackable.should_consume(),
62            _ => false,
63        }
64    }
65}