1use std::collections::HashMap;
2use once_cell::sync::Lazy;
3
4
5pub(crate) type Dict = HashMap<String, String>;
6
7
8#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
9pub enum Game {
10 Genshin,
11 Honkai,
12 StarRail,
13}
14impl Game {
15 pub fn which_title(&self) -> String {
16 let title = match self {
17 Game::Genshin => "genshin",
18 Game::Honkai => "honkai",
19 Game::StarRail => "starrail",
20 };
21 title.to_string()
22 }
23}
24
25#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
26pub enum Region {
27 OverSeas,
28 Chinese,
29}
30impl Region {
31 pub fn which_country(&self) -> String {
32 let name = match self {
33 Region::OverSeas => "os",
34 Region::Chinese => "ch",
35 };
36 name.to_string()
37 }
38}
39
40
41#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, Default)]
42pub enum Languages {
43 ZhCh,
44 ZhTw,
45 DeDe,
46 #[default]
47 EnUs,
48 EsEs,
49 FrFr,
50 IdId,
51 ItIt,
52 JaJp,
53 KoKr,
54 PtPt,
55 RuRu,
56 ThTh,
57 ViVn,
58 TrTr,
59}
60
61static LANG_DICT: Lazy<HashMap<&'static str, Languages>> = Lazy::new(|| {
62 HashMap::from([
63 ("zh-cn", Languages::ZhCh),
64 ("zh-tw", Languages::ZhTw),
65 ("de-de", Languages::DeDe),
66 ("en-us", Languages::EnUs),
67 ("es-es", Languages::EsEs),
68 ("fr-fr", Languages::FrFr),
69 ("id-id", Languages::IdId),
70 ("it-it", Languages::ItIt),
71 ("ja-jp", Languages::JaJp),
72 ("ko-kr", Languages::KoKr),
73 ("pt-pt", Languages::PtPt),
74 ("ru-ru", Languages::RuRu),
75 ("th-th", Languages::ThTh),
76 ("vi-vn", Languages::ViVn),
77 ("tr-tr", Languages::TrTr),
78 ])
79});
80
81impl Languages {
82 pub fn name(&self) -> String {
83 let result = match self {
84 Languages::ZhCh => "zh-cn",
85 Languages::ZhTw => "zh-tw",
86 Languages::DeDe => "de-de",
87 Languages::EnUs => "en-us",
88 Languages::EsEs => "es-es",
89 Languages::FrFr => "fr-fr",
90 Languages::IdId => "id-id",
91 Languages::ItIt => "it-it",
92 Languages::JaJp => "ja-jp",
93 Languages::KoKr => "ko-kr",
94 Languages::PtPt => "pt-pt",
95 Languages::RuRu => "ru-ru",
96 Languages::ThTh => "th-th",
97 Languages::ViVn => "vi-vn",
98 Languages::TrTr => "tr-tr",
99 };
100 result.to_string()
101 }
102
103 pub fn what_is_this(&self) -> String {
104 let result = match self {
105 Languages::ZhCh => "简体中文",
106 Languages::ZhTw => "繁體中文",
107 Languages::DeDe => "Deutsch",
108 Languages::EnUs => "English",
109 Languages::EsEs => "Español",
110 Languages::FrFr => "Français",
111 Languages::IdId => "Indonesia",
112 Languages::ItIt => "Italiano",
113 Languages::JaJp => "日本語",
114 Languages::KoKr => "한국어",
115 Languages::PtPt => "Português",
116 Languages::RuRu => "Pусский",
117 Languages::ThTh => "ภาษาไทย",
118 Languages::ViVn => "Tiếng Việt",
119 Languages::TrTr => "Türkçe",
120 };
121 result.to_string()
122 }
123
124 pub fn from_str(str: &str) -> Option<Self> {
125 match LANG_DICT.get(str) {
126 None => None,
127 Some(val) => Some(val.clone())
128 }
129 }
130}
131
132#[cfg(feature = "mihomo")]
133#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
134pub enum StarRailStatusType {
135 Hp,
136 Atk,
137 Def,
138 Spd,
139 CritRate,
140 CritDMG,
141}
142impl StarRailStatusType {
143 pub fn name(&self) -> String {
144 let result = match self {
145 StarRailStatusType::Hp => "HP",
146 StarRailStatusType::Atk => "ATK",
147 StarRailStatusType::Def => "DEF",
148 StarRailStatusType::Spd => "SPD",
149 StarRailStatusType::CritRate => "CRIT_RATE",
150 StarRailStatusType::CritDMG => "CRIT_DMG",
151 };
152 result.to_string()
153 }
154}
155
156
157#[cfg(feature = "mihomo")]
158#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
159pub enum RelicType {
160 Head,
161 Hands,
162 Body,
163 Feet,
164 Ornament(OrnamentType),
165}
166impl RelicType {
167 pub fn name(&self) -> String {
168 match self {
169 RelicType::Head => "HEAD".to_string(),
170 RelicType::Hands => "HANDS".to_string(),
171 RelicType::Body => "BODY".to_string(),
172 RelicType::Feet => "FEET".to_string(),
173 RelicType::Ornament(ornament) => ornament.name(),
174 }
175 }
176
177 pub fn which_type(specific_name: &String) -> anyhow::Result<RelicType> {
178 let result = match specific_name.to_uppercase().as_str() {
179 "HEAD" => Self::Head,
180 "HANDS" => Self::Hands,
181 "BODY" => Self::Body,
182 "FEET" => Self::Feet,
183 "PLANAR_SPHERE" => Self::Ornament(OrnamentType::PlanarSphere),
184 "LINK_ROPE" => Self::Ornament(OrnamentType::LinkRope),
185 _ => anyhow::bail!("`{}` is doesn't any matches", specific_name)
186 };
187 Ok(result)
188 }
189}
190
191#[cfg(feature = "mihomo")]
192#[derive(Debug, Eq, PartialEq, Hash, Copy, Clone)]
193pub enum OrnamentType {
194 PlanarSphere,
195 LinkRope
196}
197impl OrnamentType {
198 pub fn name(&self) -> String {
199 let result = match self {
200 OrnamentType::PlanarSphere => "PLANAR_SPHERE",
201 OrnamentType::LinkRope => "LINK_ROPE",
202 };
203 result.to_string()
204 }
205}
206
207
208