bpi_rs/models/
level.rs

1use serde::{Deserialize, Deserializer, Serialize};
2
3/// 等级信息
4#[derive(Default, Debug, Clone, Serialize, Deserialize)]
5pub struct LevelInfo {
6    /// 当前等级 0-6
7    pub current_level: i32,
8    pub current_min: i32,
9    pub current_exp: i32,
10
11    /// 使用自定义反序列化函数处理 next_exp
12    #[serde(deserialize_with = "deserialize_next_exp")]
13    pub next_exp: NextExp,
14}
15
16/// 下一等级经验类型
17#[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
29/// 自定义反序列化函数处理 next_exp 字段
30fn 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}