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}