essences/
time_resets.rs

1use crate::currency::CurrencyId;
2use crate::offers::OfferTemplateId;
3use crate::prelude::*;
4use enum_iterator::Sequence;
5use std::marker::PhantomData;
6use strum_macros::{Display, EnumIter, EnumString};
7
8pub trait Resettable: Sized {
9    fn reset_type() -> CharacterResetType;
10
11    fn default_meta() -> String {
12        String::new()
13    }
14}
15
16#[derive(
17    Debug,
18    Clone,
19    Copy,
20    EnumString,
21    Sequence,
22    Display,
23    Deserialize,
24    Serialize,
25    Hash,
26    Eq,
27    PartialEq,
28    EnumIter,
29    JsonSchema,
30    Tsify,
31)]
32#[tsify(namespace)]
33pub enum CharacterResetType {
34    DailyQuests,
35    WeeklyQuests,
36    DungeonKeys,
37    DailyCurrencyReset,
38    DailyOffers,
39    InstantRewardGems,
40}
41
42#[derive(Debug, Clone)]
43pub struct Reset<T: Resettable + Sized> {
44    pub reset_type: CharacterResetType,
45    pub meta: String,
46    pub _phantom: PhantomData<T>,
47}
48
49impl<T: Resettable> Reset<T> {
50    pub fn new(meta: String) -> Self {
51        Self {
52            reset_type: T::reset_type(),
53            meta,
54            _phantom: PhantomData,
55        }
56    }
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq)]
60pub struct DailyQuestsReset;
61
62impl Resettable for DailyQuestsReset {
63    fn reset_type() -> CharacterResetType {
64        CharacterResetType::DailyQuests
65    }
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq)]
69pub struct WeeklyQuestsReset;
70
71impl Resettable for WeeklyQuestsReset {
72    fn reset_type() -> CharacterResetType {
73        CharacterResetType::WeeklyQuests
74    }
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq)]
78pub struct DungeonKeysReset;
79
80impl Resettable for DungeonKeysReset {
81    fn reset_type() -> CharacterResetType {
82        CharacterResetType::DungeonKeys
83    }
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq)]
87pub struct DailyCurrencyResetReset;
88
89impl Resettable for DailyCurrencyResetReset {
90    fn reset_type() -> CharacterResetType {
91        CharacterResetType::DailyCurrencyReset
92    }
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq)]
96pub struct DailyOffersReset;
97
98impl Resettable for DailyOffersReset {
99    fn reset_type() -> CharacterResetType {
100        CharacterResetType::DailyOffers
101    }
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq)]
105pub struct InstantRewardGemsReset;
106
107impl Resettable for InstantRewardGemsReset {
108    fn reset_type() -> CharacterResetType {
109        CharacterResetType::InstantRewardGems
110    }
111}
112
113pub struct ResetBuilder;
114
115impl ResetBuilder {
116    pub fn daily_quests() -> Reset<DailyQuestsReset> {
117        Reset::new(DailyQuestsReset::default_meta())
118    }
119
120    pub fn weekly_quests() -> Reset<WeeklyQuestsReset> {
121        Reset::new(WeeklyQuestsReset::default_meta())
122    }
123
124    pub fn dungeon_keys() -> Reset<DungeonKeysReset> {
125        Reset::new(DungeonKeysReset::default_meta())
126    }
127
128    pub fn daily_currency_reset(currency_id: CurrencyId) -> Reset<DailyCurrencyResetReset> {
129        Reset::new(currency_id.to_string())
130    }
131
132    pub fn daily_offers() -> Reset<DailyOffersReset> {
133        Reset::new(DailyOffersReset::default_meta())
134    }
135
136    pub fn offer_reset(template_id: OfferTemplateId) -> Reset<DailyOffersReset> {
137        Reset::new(template_id.to_string())
138    }
139
140    pub fn instant_reward_gems() -> Reset<InstantRewardGemsReset> {
141        Reset::new(InstantRewardGemsReset::default_meta())
142    }
143}