fish_lib/models/item/
properties.rs1use 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 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}