1use serde::{Deserialize, Deserializer, Serialize};
2
3#[derive(Default, Debug, Clone, Serialize, Deserialize)]
5pub struct LevelInfo {
6 pub current_level: i32,
8 pub current_min: i32,
9 pub current_exp: i32,
10
11 #[serde(deserialize_with = "deserialize_next_exp")]
13 pub next_exp: NextExp,
14}
15
16#[derive(Debug, Clone, Serialize)]
18pub enum NextExp {
19 Value(i32),
20 Infinite,
21}
22
23impl Default for NextExp {
24 fn default() -> Self {
25 NextExp::Infinite
26 }
27}
28
29fn deserialize_next_exp<'de, D>(deserializer: D) -> Result<NextExp, D::Error>
31where
32 D: Deserializer<'de>,
33{
34 let s: serde_json::Value = Deserialize::deserialize(deserializer)?;
35 match s {
36 serde_json::Value::String(ref str_val) if str_val == "--" => Ok(NextExp::Infinite),
37 serde_json::Value::Number(num) => Ok(NextExp::Value(num.as_i64().unwrap_or(0) as i32)),
38 _ => Ok(NextExp::Infinite),
39 }
40}