miHoYo_API/
typing.rs

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// pub(crate) enum Iterable<T> {
209//     List(T),
210//     Vec(Vec<T>),
211//     HashMap()
212// }